自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面向大眾的移動技術: 在 Android 中為手勢編碼

移動開發(fā) Android
本文大致介紹了移動應用程序部署,并沒有深入介紹測試,因為您還沒有部署一個產(chǎn)品應用程序。多數(shù)用戶不會安裝沒有信譽的應用程序,這就是許多成功的應用程序都通過中間機構(比如 Google Play、iTunes App Store 或 Amazon Appstore for Android)來發(fā)布的原因。

將 Android 移動應用程序中的按鈕轉換成滑動手勢

移動用戶通常思想不集中、非常繁忙、容易受人體工程學的約束,因此您需要相應地構建自己的移動應用程序 UI。Andrew Glover 討論了區(qū)分移動應用程序和 Web 應用程序的關鍵因素,然后指導您創(chuàng)建一個移動應用程序 UI,使用滑動手勢而非按鍵來進行導航。

構建移動應用程序和構建 Web 應用程序一樣,要時刻牢記最終目標(和用戶)。始終了解您的應用程序可以給用戶帶來哪些利益。您的應用程序將顯示哪些類型的信息,擁有哪些功能,用戶如何獲取這些信息和功能?對移動應用程序的用戶體驗給予足夠的關注有助于確保獲得成功。

關于本系列:近年來,移動應用程序發(fā)布呈爆炸式增長,移動開發(fā)技術市場亦是如此。本系列是一個新系列,向那些熟悉編程但對移動技術較為陌生的開發(fā)人員介紹移動應用程序。 先從使用 Java 代碼為本機應用程序編碼開始介紹,然后擴展工具包,使之包含 JVM 語言、腳本框架、HTML5/CSS/JavaScript、第三方工具等。本系列文章將帶您逐步掌握這些必要技術,實際應對所有移動開發(fā)場景。

不同于面向桌面或 Web 應用程序的傳統(tǒng) GUI 開發(fā),移動應用程序的規(guī)則是寧缺勿濫。當您決定設計一個應用程序界面時,可能想簡單點,想容易點。大多數(shù)移動設備都很?。ǔ悄鎸Φ氖?Samsung Note 4,這是我見過的最大移動電話,也稱作 平板電腦)。小巧是其流行的一個重要原因,因為人們可以隨身攜帶,隨時使用。這導致關于移動應用程序的另一個重要發(fā)現(xiàn),大多數(shù)用戶使用移動設備時并不關注應用程序。

一些移動應用程序是專門為平板電腦而構建的,只是為了實現(xiàn)業(yè)務使用(比如醫(yī)生訪問病人記錄)。大多數(shù)移動應用程序需要用戶通過微型設備進行訪問,坦白的說, 用戶也會做些其他事情。當我在線等待購買一些日用品時,可能會玩幾局憤怒的小鳥。結束長途飛行下飛機后,可能會利用這段時間查收郵件。但是,如果只需要單 擊兩下或者輕輕一劃就能加載憤怒的小鳥或者郵件信息,我可能會繼續(xù)使用移動應用程序。

將移動應用程序與傳統(tǒng) Web 和桌面應用程序真正區(qū)分開的另一個要素就是數(shù)量:對于每個 Web 應用程序來說,很容易獲得 100 個移動應用程序。使用您的應用程序提供多個有價值的服務,確保這些應用程序容易使用且具有吸引力。如果您希望用戶通過 RTM(參考用戶手冊)使用您的應用程序,那么您給用戶制造了一個問題,這最終將成為您的問題。無論用戶是訪問病人記錄的醫(yī)生,還是在休息室玩 Cut-the-Rope 的人,這沒有關系。如果您的應用程序只需幾分鐘才能安裝好,那么用戶可能會搜索應用程序商店,尋找一個需要更短時間的應用程序。

(Hello) Overheard Word

如果您閱讀了本系列的第一篇文章, 您就會知道如何在 Eclipse 中構建 Android 開發(fā)環(huán)境,上一篇文章已經(jīng)為 Android 4.2 配置了 Android SDK。您應該已經(jīng)完成了第一個 Android 應用程序,經(jīng)典的 Hello World。在本期文章中,您將繼續(xù)設計一個更獨特的應用程序。

我的示例應用程序 Overheard Word 旨在使學習新詞匯并在上下文中使用新詞匯變得更有趣、更簡單,順便說一下,這是我最大的兩個愛好。在這個應用程序中,用戶學習了幾個單詞后就可以進行測 驗。界面由一個顯示界面和兩個按鈕組成。顯示的是單詞及其相應定義,而按鈕是用于用戶導航的。

Overheard Word 是一個有趣且簡單的移動應用程序,適用于那些喜歡學習單詞的人們(我的意思是可用詞匯癡迷者 和單詞行家 描述他們)。更重要的是,該示例可作為構建一個合法 Android 應用程序的示例,您可以將其部署到真正的 Android 設備中。

以應用程序為目標

在設計一個應用程序之前,我喜歡評估目標市場。在第 1 部分中構建的應用程序的目標是 Android 4.2 或者 API 版本 17。看看 Google 發(fā)布的最流行的 Android 版本。(參見圖 1):

圖 1. Android 分布,按版本號排列

屏幕截圖顯示了 Android 版本的分布情況

平板電腦和手機在 圖 1 中,平板電腦銷量很可能是 Android 15 用戶增加所引起的。不管是哪個供應商,多數(shù)平板電腦目前都運行 Android 4.x。除非您專門構建一個 Android 平臺電腦應用程序,是否應將您的應用程序目標定為 Android API 9 和 10,這是目前移動設備的主流市場。

圖 1 顯示 Android 2.3.x(API 版本 9 和 10)目前僅占有大約一半的 Android 設備市場!如果所有 Android 設備的一半設備都在運行 Android 2.3.x,那么為這一市場進行開發(fā)不是很有意義嗎?

開始一個新項目

在結束上一期文章時,我已經(jīng)安裝了 API 4.2?,F(xiàn)在我想要安裝 Android 2.3.3 (API 10) 。再次啟動 Android SDK Manager 時,如 圖 2 所示,您會看到有一些更新可以安裝:

圖 2. 一個本地 Android SDK 安裝程序,僅有一個安裝版本

如果您想要和我一起進行,請單擊 Android 2.3.3 (API 10) 安裝選項,保留管理員指定的推薦更新。

圖 3. 安裝 Android 2.3.3 (API 10)

下載了新的 Android API 后,必須創(chuàng)建一個兼容模擬器或 Android Virtual Device (AVD)。在 Android SDK Manager 中選擇 Tools 菜單,然后選中 Manage AVDs。務必創(chuàng)建一個目標為 API Level 10 的 AVD。

圖 4. 創(chuàng)建一個 AVD

在 SDK Manager 中創(chuàng)模擬器或者 AVD 的屏幕截圖

接著,創(chuàng)建一個 New Android Application 項目并為其命名。我的項目名稱是 Overheard Word 應用程序。將該應用程序的目標設為 API 10,使其能夠訪問最多的設備。仔細查看 圖 5 中的屏幕截圖,您會注意到我也選擇使用 API 10 進行編譯。您可以使用一個更高的 Android 版本進行編譯,但是我喜歡使用同一個 API 進行編程和編譯。(如果使用最近發(fā)布的 API 進行編譯,則必須注意,不能使用我應用程序中的任何特性,這可能導致兼容問題。)

圖 5. 在 Eclipse 中創(chuàng)建一個新 Android 項目

當單擊 Next 時,務必確定沒有將您的應用程序保存為一個 Library Project。在下期文章中,將會繼續(xù)為 Hello World 應用程序保留相同默認設置??梢栽诤笃谶M行一些小的變動(比如,更改應用程序的圖標文件)。

最后一步是為您的第一個 Activity 命名。我將我的 Activity 命名為 OverheardWord,而不是 Main,然后對布局也進行了類似的命名。如果您也使用 API 10 作為目標版本,最后對話框中會有幾個 Navigation Type 選項?,F(xiàn)在不用擔心;在后續(xù)文章中,我會向您介紹如何創(chuàng)建一個導航菜單。對于該應用程序,將您的 Navigation Type 選項保留為 none。

圖 6. 創(chuàng)建一個默認 Activity

在 Eclipse 中創(chuàng)建一個默認 Activity 的屏幕截圖

單擊 Finish 創(chuàng)建一個項目,這個項目和上次創(chuàng)建的默認項目很像。

#p#

構建一個 Android UI

現(xiàn)在,您已經(jīng)構建了一個簡單 UI。你還記得嗎?Android UI 最終是作為一個 XML 文檔定義的,對此您可能比較熟悉。如果您從事的是傳統(tǒng) Java™ GUI 開發(fā),那么您可能會記得布局工具,Android 也使用了布局工具。您可以使用 Android 的布局工具來定義(實際上建議)某個設備如何布局您的應用程序可視組件。布局樣式包括:

  • Linear:其中組件以平行和垂直方式布局(類似于報紙專欄)
  • Relative:其中組件彼此相互隔開(小部件 2 位于小部件 1 的右邊,等等)
  • Table:其中小部件按行或列展示

有很多布局工具可用,這只是個開始!

您可以使用一個布局工具來定義小部件,您會發(fā)現(xiàn)這是所有 GUI 中的常用組件。Android 平臺提供了一些基礎小部件,比如按鈕、文本框、下拉列表,以及圖片瀏覽器和滾輪之類較為復雜的小部件。

我覺得我的 Overheard Word UI 需要:

  • 三個文本字框(分別保存一個單詞、發(fā)音和定義)
  • 兩個按鈕(一個選擇新單詞,一個進行測驗)

定義布局

要將一個 Android UI 組合起來,第一步是定義其布局以及您想要在其中使用的小部件。在 清單 1 中,我首先定義了一個帶有 3 個 TextViews 的 LinearLayout。接下來,我將創(chuàng)建一個子布局(另一個 LinearLayout)來保存兩個 Button。

清單 1. 在 Android 中定義一個 LinearLayout

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:id="@+id/LinearLayout1" 
  4.     android:layout_width="match_parent" 
  5.     android:layout_height="match_parent" 
  6.     android:orientation="vertical" 
  7.     android:paddingBottom="@dimen/activity_vertical_margin" 
  8.     android:paddingLeft="@dimen/activity_horizontal_margin" 
  9.     android:paddingRight="@dimen/activity_horizontal_margin" 
  10.     android:paddingTop="@dimen/activity_vertical_margin" 
  11.     tools:context=".OverheardWord" > 
  12.  
  13.     <TextView 
  14.         android:id="@+id/word_study_word" 
  15.         android:layout_width="wrap_content" 
  16.         android:layout_height="wrap_content" 
  17.         android:layout_gravity="center" 
  18.         android:layout_marginBottom="10dp" 
  19.         android:layout_marginTop="60dp" 
  20.         android:textColor="@color/black" 
  21.         android:textSize="30sp" /> 
  22.  
  23.     <TextView 
  24.         android:id="@+id/word_study_part_of_speech" 
  25.         android:layout_width="wrap_content" 
  26.         android:layout_height="wrap_content" 
  27.         android:layout_gravity="center" 
  28.         android:layout_marginBottom="10dp" 
  29.         android:layout_marginLeft="20dp" 
  30.         android:layout_marginRight="20dp" 
  31.         android:textColor="@color/black" 
  32.         android:textSize="18sp" /> 
  33.  
  34.     <TextView 
  35.         android:id="@+id/word_study_definition" 
  36.         android:layout_width="wrap_content" 
  37.         android:layout_height="wrap_content" 
  38.         android:layout_gravity="center" 
  39.         android:layout_marginLeft="40dp" 
  40.         android:layout_marginRight="40dp" 
  41.         android:textColor="@color/black" 
  42.         android:textSize="18sp" /> 
  43.  
  44.     <LinearLayout 
  45.         android:id="@+id/widget62" 
  46.         android:layout_width="wrap_content" 
  47.         android:layout_height="wrap_content" 
  48.         android:layout_gravity="center" 
  49.         android:layout_marginLeft="5dp" 
  50.         android:layout_marginRight="5dp" > 
  51.  
  52.         <Button 
  53.             android:id="@+id/next_word" 
  54.             android:layout_width="wrap_content" 
  55.             android:layout_height="wrap_content" 
  56.             android:layout_marginTop="20dp" 
  57.             android:text="@string/next_word" /> 
  58.  
  59.         <Button 
  60.             android:id="@+id/take_quiz" 
  61.             android:layout_width="wrap_content" 
  62.             android:layout_height="wrap_content" 
  63.             android:layout_marginLeft="50dp" 
  64.             android:layout_marginTop="20dp" 
  65.             android:text="@string/take_quiz" /> 
  66.     </LinearLayout> 
  67.  
  68. </LinearLayout> 

正如您從 清單 1 的 XML 中所看到的,每個小部件都有很多屬性,這些屬性最終會影響其外觀。例如,每個按鈕都有一個 text 元素,其字符串指向一個資源元素。該資源元素是在名為 strings.xml 的資源文件 中定義的,strings.xml 位于 res/values 目錄下。清單 2 展示了 strings.xml 文件。

清單 2. 定義按鈕顏色和標簽的資源文件

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.  
  4.     <string name="app_name">Overheard Word</string> 
  5.  
  6.     <color name="white">#ffffff</color> 
  7.     <color name="black">#000000</color> 
  8.  
  9.     <string name="next_word">Next word</string> 
  10.     <string name="take_quiz">Take quiz</string> 
  11.  
  12. </resources> 

如果想看看我的 UI 之前的樣子,可以啟動一個模擬器實例,在 Eclipse 中單擊 Graphical Layout 即可,如 圖 7 所示。

圖 7. Eclipse 中運行的 Overheard Word

在 Eclipse 中運行的 Overheard Word 應用程序的屏幕截圖

占位符文本

預覽我的 UI,我被單詞屬性的空格弄的有點糊涂。不過這不是什么大問題:為了更真實的呈現(xiàn)文本顯示,我在編寫代碼之前添加了一些樣例文本。

首先,為每個小部件添加了一個 android:text 屬性,就像為按鈕標簽添加屬性那樣?,F(xiàn)在,占位符文本的添加已經(jīng)完成,如下這樣:

清單 3. 使用 android:text 創(chuàng)建一個占位符

  1. <TextView 
  2.         android:id="@+id/word_study_part_of_speech" 
  3.         android:layout_width="wrap_content" 
  4.         android:layout_height="wrap_content" 
  5.         android:layout_gravity="center" 
  6.         android:layout_marginBottom="10dp" 
  7.         android:layout_marginLeft="20dp" 
  8.         android:layout_marginRight="20dp" 
  9.         android:textColor="@color/black" 
  10.         android:textSize="18sp"  
  11.         android:text="Part of Speech"/> 

正如您在 清單 3 所看到的,我將樣例文本("Part of Speech") 添加到了 word_study_part_of_speechTextView 中。通過增加文本大小、定義文本顏色以及將布局中的小部件居中,我更新了一些樣式元素。對于 Android 應用程序中的定義來說,清單 3 中的屬性比較常見;當構建更多應用程序時,就會熟悉和喜愛這些屬性了。我直接在我的布局文件中定義了樣例文本,沒有在資源文件中定義它們,因為我的設計過程中的文本值是臨時的。

當我從 Eclipse 中運行我的應用程序時,我就在想當用戶啟動應用程序時會看到什么:

圖 8. AVD 中運行的 Overheard Word

在 AVD 中運行的 Overheard Word 應用程序的屏幕截圖

UI 設計的某些方面目前還有一個小問題。您能猜到是什么問題嗎?對,就是令人討厭的按鈕。它們是必需的嗎?用戶平常會單擊移動應用程序上的按鈕嗎?用戶可能通過左右滑動來查看新單詞,或者通過向下滑動來進行測驗。

刪除按鈕可清理 UI,使 Overheard Word 應用程序可以更好地滿足大多數(shù)移動用戶的期望。我可以很輕松地實現(xiàn)滑動行為,您很快就會看到。

在 Android 中為手勢編碼

我為 Overheard Word 應用程序定義了初始界面,并添加了一些行為。我將自己的傳統(tǒng) Java GUI 開發(fā)再次應用到 Android 上,首次在 Android 中使用監(jiān)聽器來響應事件。如果要保留兩個按鈕,我可能會使用 OnClickListener 將行為附加到按鈕單擊活動中,然后將它們附加到每個按鈕小部件的 setOnClickListener 方法中。

匿名類匿名類是在某個類的內(nèi)部定義的類,但是沒有名稱:您可以在一個表達式中定義和實例化 匿名類。我發(fā)現(xiàn)匿名類既方便又好用,我編寫了很多匿名類,特別是在編寫用戶界面行為時。

當我確定可以使用 OnClickListener 時,如果不止有一個小部件,那么我可能會使用多個類文件來結束這一切。我不喜歡雜亂無序,所以我選擇使用匿名類的備用實現(xiàn)策略。

盡管滑動手勢 是傳統(tǒng) GUI 編程中所沒有的概念,但其實現(xiàn)類似于編寫一個按鈕單擊。我啟動了一個觸摸監(jiān)聽器(它是底層 Android 平臺的一部分),然后提供響應行為。為了檢測手指滑動動作,我還計算了一個手勢的開始 和結束 之間的差異,以及滑動姿勢。(我發(fā)這是非常有用的,可以考慮這種情況:在迪卡爾坐標中,左右滑動位于 X 軸上,而上下滑動位于 Y 軸上。)

手勢可能出現(xiàn)在界面的任何地方,如果將這類監(jiān)聽器附加到應用程序界面的任何組件上,就可以啟動布局(這在 Android 中可以表示為 View)并包含最簡單的按鈕小部件。我使用 Android 的 SimpleOnGestureListener 創(chuàng)建我的初始手勢實現(xiàn),然后通過 onTouchListener 方法將其附加到 View 中。我可以通過將它附加到視圖實例中來檢測整個 界面上的手指滑動,而不僅僅是在其組件內(nèi)部(比如小圖片瀏覽器)中進行測試。

盡管可以這樣做,但我必須編寫一個可檢測移動設備上手指活動的類。

#p#

SwipeDetector

按 鈕單擊相對較為容易檢測。底層操作系統(tǒng)通常提取按鈕邊界的坐標信息,因此可以跳過人工定義這一步。編寫您的應用程序來識別和響應一個滑動動作有點復雜。 Android 將其留給程序員來編寫,雖然這個任務稍微有點復雜,但也為您提供了極大的靈活性。您可以和我一樣選擇檢測單一滑動動作,也可以檢測其他手指動作,比如游戲 中有時會使用摩擦。

考慮移動性您是否很好奇移動監(jiān)聽器是否仍然通過動作單擊 來定義?我上次查看的時候,用戶通常是按下 移動設備上的按鈕,而不是像桌面上使用鼠標那樣單擊 按鈕。既然是一名移動開發(fā)人員,就要考慮到可移動性,這意味著需要重新思考傳統(tǒng) Web 和桌面機制,比如按鈕單擊、開始菜單,甚至 GUI 向導。

編寫手勢滑動檢測程序涉及到笛卡爾數(shù)學。也就是說,如果 X 軸上的開始坐標 減去結束坐標 大于預先定義的距離,那么您就可以假設用戶將手指從應用程序界面右邊滑到左邊。在 Y 軸上使用了同樣的方法來檢測上下滑動。

很容易將這類邏輯抽象到某個進行數(shù)據(jù)運算的簡單類中。SimpleOnGestureListener 有一個調(diào)用 onFling 的方法。onFling 方法提供了兩個 MotionEvent 類型的參數(shù)(分別用于開始 和結束)來表示 X 軸上的速度,還提供了兩個 float 參數(shù)來表示 Y 軸上的速度。因此,清單 4 中的 SwipeDetector 類 清單 4 有 4 個方法來描繪一個滑動的全部活動:上、下、左、右。

清單 4. SwipeDetector

  1. import android.view.MotionEvent; 
  2.  
  3. public class SwipeDetector { 
  4.  
  5.     private int swipe_distance; 
  6.     private int swipe_velocity; 
  7.     private static final int SWIPE_MIN_DISTANCE = 120
  8.     private static final int SWIPE_THRESHOLD_VELOCITY = 200
  9.  
  10.     public SwipeDetector(int distance, int velocity) { 
  11.         super(); 
  12.         this.swipe_distance = distance; 
  13.         this.swipe_velocity = velocity; 
  14.     } 
  15.  
  16.     public SwipeDetector() { 
  17.         super(); 
  18.         this.swipe_distance = SWIPE_MIN_DISTANCE; 
  19.         this.swipe_velocity = SWIPE_THRESHOLD_VELOCITY; 
  20.     } 
  21.  
  22.     public boolean isSwipeDown(MotionEvent e1, MotionEvent e2, float velocityY) { 
  23.         return isSwipe(e2.getY(), e1.getY(), velocityY); 
  24.     } 
  25.  
  26.     public boolean isSwipeUp(MotionEvent e1, MotionEvent e2, float velocityY) { 
  27.         return isSwipe(e1.getY(), e2.getY(), velocityY); 
  28.     } 
  29.  
  30.     public boolean isSwipeLeft(MotionEvent e1, MotionEvent e2, float velocityX) { 
  31.         return isSwipe(e1.getX(), e2.getX(), velocityX); 
  32.     } 
  33.  
  34.     public boolean isSwipeRight(MotionEvent e1, MotionEvent e2, float velocityX) { 
  35.         return isSwipe(e2.getX(), e1.getX(), velocityX); 
  36.     } 
  37.  
  38.     private boolean isSwipeDistance(float coordinateA, float coordinateB) { 
  39.         return (coordinateA - coordinateB) > this.swipe_distance; 
  40.     } 
  41.  
  42.     private boolean isSwipeSpeed(float velocity) { 
  43.         return Math.abs(velocity) > this.swipe_velocity; 
  44.     } 
  45.  
  46.     private boolean isSwipe(float coordinateA, float coordinateB, float velocity) { 
  47.         return isSwipeDistance(coordinateA, coordinateB) 
  48.                 && isSwipeSpeed(velocity); 
  49.     } 

現(xiàn)在,已經(jīng)有一個便利的類可以告訴我手指是否滑動過,我可以將它嵌入到我的 UI 中?;貞浺幌碌谝淮蝿?chuàng)建的默認活動,我將其命名為 OverheardWord。我保留了 Eclipse 提供的所有代碼,但為了監(jiān)聽滑動并做出響應,還要添加一些新內(nèi)容,我定義了 Android GestureDetector,它將執(zhí)行一次 OnGestureListener 實現(xiàn)。非常感謝 Android 團隊創(chuàng)建了一個便利的類,我可以通過一個稱為 SimpleOnGestureListener 的匿名類來實現(xiàn)此操作,然后重寫 onFling 方法。

UI 中的滑動檢測

在 Activity 的 onCreate 方法中,最初使用 SimpleOnGestureListener 創(chuàng)建了一個 GestureDetector,這需要使用我的 SwipeDetector 類。

下一步是創(chuàng)建一個小對話框,當手指滑動時指定觸發(fā)事件。這類小的、臨時的對話框在這里稱為 Toast。有時候 Toast 僅有一行代碼。

清單 5. GestureDetector

  1. private GestureDetector initGestureDetector() { 
  2.     return new GestureDetector(new SimpleOnGestureListener() { 
  3.          
  4.         private SwipeDetector detector = new SwipeDetector(); 
  5.          
  6.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  7.                float velocityY) { 
  8.             try { 
  9.                 if (detector.isSwipeDown(e1, e2, velocityY)) { 
  10.                     return false
  11.                 } else if (detector.isSwipeUp(e1, e2, velocityY)) { 
  12.                     showToast("Up Swipe"); 
  13.                 }else if (detector.isSwipeLeft(e1, e2, velocityX)) { 
  14.                     showToast("Left Swipe"); 
  15.                 } else if (detector.isSwipeRight(e1, e2, velocityX)) { 
  16.                     showToast("Right Swipe"); 
  17.                 } 
  18.             } catch (Exception e) {} //for now, ignore 
  19.             return false
  20.         } 
  21.          
  22.         private void showToast(String phrase){ 
  23.             Toast.makeText(getApplicationContext(), phrase, Toast.LENGTH_SHORT).show(); 
  24.         } 
  25.     }); 

現(xiàn)在,我們將創(chuàng)建一個計算用戶手指滑動范圍和速度的 initGestureDetector 方法。首先創(chuàng)建一個匿名 SimpleOnGestureListener 實例,并提供一個 onFling 方法的實現(xiàn)。請注意 onFling 方法是如何使用 SwipeDetector 的。例如,如果某個匹配項向上滑動,則會顯示 Toast 來表示移動。

下一步是將這個滑動檢測行為插入我的 UI 中。首先注冊幾個帶有 View 實例的監(jiān)聽器。

清單 6. 在視圖上注冊滑動檢測。

  1. private GestureDetector gestureDetector; 
  2.  
  3. protected void onCreate(Bundle savedInstanceState) { 
  4.     super.onCreate(savedInstanceState); 
  5.     setContentView(R.layout.activity_overheard_word); 
  6.  
  7.     gestureDetector = initGestureDetector(); 
  8.  
  9.     View view = findViewById(R.id.LinearLayout1); 
  10.  
  11.     view.setOnTouchListener(new View.OnTouchListener() { 
  12.         public boolean onTouch(View v, MotionEvent event) { 
  13.             return gestureDetector.onTouchEvent(event); 
  14.         } 
  15.     }); 
  16.  
  17.     view.setOnClickListener(new OnClickListener() { 
  18.         public void onClick(View arg0) { 
  19.         } 
  20.     }); 

我在 onCreate 方法中通過其 Id 獲得了 View 實例的一個句柄。多數(shù) Java 開發(fā)人員都比較喜歡這個便捷的 Android-ism。

通過 ID 方法找到視圖

還記得我為 UI 定義 XML 時各個資源文件(比如 strings.xml)中相應的值嗎?在我編譯 Android 應用程序時,XML 將變成代碼,提供給類 R 中的相應 Id。在執(zhí)行進一步操作之前,應檢查您項目的 gen 目錄下的 R 類。

查看您的布局 XML 文件(您可能會想起我將我的 XML 文件命名為 activity_overheard_word.xml)。該 XML 文件中的每個小部件都有一個 id 屬性。例如,為了簡便起見,我的應用程序的布局 id 是 android:id="@+id/LinearLayout1" 或 LinearLayout1。Id 名稱由 Eclipse 自動生成,如果需要的話,可以更改該名稱。重要的是這個 idLinearLayout1 在 R 類中有一個相對應的屬性,如 清單 7 所示。

清單 7. R 類中的小部件 ID

  1. public static final class id { 
  2.     public static final int LinearLayout1=0x7f090000
  3.     public static final int action_settings=0x7f090004
  4.     public static final int word_study_definition=0x7f090003
  5.     public static final int word_study_part_of_speech=0x7f090002
  6.     public static final int word_study_word=0x7f090001

通過將 XML 文件的內(nèi)容及其相應 R 文件結合使用,可以在不需要解析 XML 的情況下引用這些小部件。因此,將會返回 Activity 的 onCreate 方法,我可以通過 View 小部件的 id(R.id.LinearLayout1)來應用它。findViewById 方法是在擴展 Activity 時 Android 平臺提供的。

手指一劃,輕松搞定!

獲得 View 實例之后,就可以通過 setOnTouchListener 附加我的 gestureDetector 實例。在 清單 6 中,另一個匿名類現(xiàn)在正在處理我的所有觸摸行為。當用戶觸摸設備屏幕時,就會觸發(fā)事件并根據(jù) gestureDetector 進行操作。我還實現(xiàn)了一個 OnClickListener,并在 OnClickListener 方法中對其進行設置;但是在本例中匿名類沒有任何行為。

有了這些,我就擁有了一個可以響應手指滑動的較為簡單的接口。在本示例中,可以使用其中三個滑動手勢:左、右和上。在您的 AVD 中試試這些代碼。要模擬一個手指滑動,可以使用鼠標單擊,然后向上、向下、向右拖拽。

現(xiàn)在,在真實的設備上運行這個正在開發(fā)的應用程序將會怎樣?

部署一個開發(fā)

為了應對那些禍害毫無戒心的用戶的病毒、木馬程序和惡意軟件的繁殖,Apple 和 Google 為運行在其設備上的第三方應用程序分別引入了代碼簽名。理論上,代碼簽名可以確保讓有信譽的人來構建應用程序,確保在您安裝應用程序之前沒有人可以篡改它 們。實際上,Google 和 Apple 簽名代碼的安全程度不一樣。例如,我在簽署我的 Android 應用程序時,可以聲明我是一個信譽良好的國家銀行。當我簽署我的 iOS 或 Windows Phone 8 應用程序時就無法這樣做。

在 開發(fā)模式下,無需擔心代碼簽名。事實上,Android 和 Eclipse 構建了帶有開發(fā)人員密鑰的二進制簽名,而這個密鑰是您所不知道的。因此,在開發(fā)模式下將某個應用程序放到設備上并不困難,最簡單的方法是將您的 Andriod 設備插入計算機 USB 端口。

接下來,進入 Eclipse,右鍵單擊您的項目并選擇 Run As menu 選項,然后單擊 Run Configurations。Eclipse 顯示一個配置對話框,您可以在其中選擇您的項目,然后單擊 Target 選項卡,如 圖 9 所示。

圖 9. 選擇一個用來運行您的應用程序的設備

在 Eclipse 中選擇一個設備的屏幕截圖

您可以選擇 Always prompt to pick device(如果您希望有選擇性)或者 Launch on all compatible devices/AVD's。如果選擇了后者,可以像我那樣選擇 Active Devices 選項卡,然后單擊 Run。假設您和我一起進行編碼,片刻之后,一個漂亮的應用程序將呈現(xiàn)在您的設備上。將手指向左、向右、向上滑動,見證奇跡的時刻到了,這個簡單的對話框會搞定一切。

安全設置如果不能從 Email 或 Dropbox 加載您的應用程序,那么請進入設備設置界面,然后啟動 Security Settings 下的 Unknown Sources。您可以使用該功能安裝應用程序,包括您正在開發(fā)的應用程序,而不是 從 Google Play 進行安裝。

另一個部署應用程序的方法是將其 .apk 文件通過郵件發(fā)給您,然后在您的 Android 設備上打開該文件,按照自動安裝對話框的提示進行操作。您也可以將 .apk 文件上傳到像 Dropbox 這樣的服務中,然后在您的設備上打開 Dropbox 進行安裝。應用程序的 .apk 文件在您項目的 bin 目錄下,Eclipse 也在其中保存了相應的二進制文件。

記住,這些部署機制是用于開發(fā)測試的,并不是用于發(fā)布應用程序。要發(fā)布您的應用程序并從其中賺錢涉及到更多的步驟,我會在后續(xù)文章中進一步介紹。

結束語

設計一個移動應用程序意味著需要將一切想的簡單一點、容易一些。本期文章您學習了如何編寫一個移 動應用程序來響應滑動手勢,沒有涉及桌面或 Web 用戶的按鈕單擊。有時候,移動設備可能會從一兩個便捷的按鈕中獲益。確保它們適合用戶之目的,我不需要為我這個超級簡單的應用程序 Overheard Word 設計按鈕,對于大多數(shù)應用程序用戶來說,我使用的這個手指上下滑動導航比較直觀。

在本文中,我大致介紹了移動應用程序部署,并沒 有深入介紹測試,因為您還沒有部署一個產(chǎn)品應用程序。多數(shù)用戶不會安裝沒有信譽的應用程序,這就是許多成功的應用程序都通過中間機構(比如 Google Play、iTunes App Store 或 Amazon Appstore for Android)來發(fā)布的原因。在這篇文章中,我詳細介紹了滿足應用程序商店安全標準的流程,該流程只需要很少幾步,比簽署您的應用程序要簡單得多。重要 的是當您的應用程序被大經(jīng)銷商發(fā)布后,它會變成全世界可用。

責任編輯:閆佳明 來源: ibm
相關推薦

2014-09-28 14:30:27

移動技術Android單詞

2014-09-19 09:35:11

移動技術Android

2014-09-28 14:57:08

移動技術Android簽名

2013-04-17 09:50:36

用戶體驗設計UED手勢

2017-12-26 15:08:57

2023-03-01 00:18:45

2010-10-08 13:31:07

移動開發(fā)

2022-10-14 16:18:40

MobileNetAndroid端模型訓練

2010-08-03 10:32:42

Android 3.0Android 3.0Android開發(fā)

2009-06-29 14:22:00

FSO光纖

2009-06-10 22:06:29

JavaScript面向對象

2010-03-23 14:34:44

Python vim檢

2011-03-17 13:00:27

面向對象數(shù)據(jù)庫電子商務

2011-03-17 12:33:56

面向對象數(shù)據(jù)庫電子商務

2012-02-06 13:26:09

2010-06-21 13:09:14

Office2010微軟

2025-02-13 07:49:49

2011-12-07 10:40:42

Sony索尼Android

2012-05-25 10:37:21

AdobeStage3D

2019-09-24 20:07:30

Linux移動文件 命令
點贊
收藏

51CTO技術棧公眾號