精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

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

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

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

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

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

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

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

(Hello) Overheard Word

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

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

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

以應用程序為目標

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

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

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

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

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

開始一個新項目

在結束上一期文章時,我已經安裝了 API 4.2。現在我想要安裝 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 后,必須創建一個兼容模擬器或 Android Virtual Device (AVD)。在 Android SDK Manager 中選擇 Tools 菜單,然后選中 Manage AVDs。務必創建一個目標為 API Level 10 的 AVD。

圖 4. 創建一個 AVD

在 SDK Manager 中創模擬器或者 AVD 的屏幕截圖

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

圖 5. 在 Eclipse 中創建一個新 Android 項目

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

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

圖 6. 創建一個默認 Activity

在 Eclipse 中創建一個默認 Activity 的屏幕截圖

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

#p#

構建一個 Android UI

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

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

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

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

我覺得我的 Overheard Word UI 需要:

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

定義布局

要將一個 Android UI 組合起來,第一步是定義其布局以及您想要在其中使用的小部件。在 清單 1 中,我首先定義了一個帶有 3 個 TextViews 的 LinearLayout。接下來,我將創建一個子布局(另一個 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,我被單詞屬性的空格弄的有點糊涂。不過這不是什么大問題:為了更真實的呈現文本顯示,我在編寫代碼之前添加了一些樣例文本。

首先,為每個小部件添加了一個 android:text 屬性,就像為按鈕標簽添加屬性那樣。現在,占位符文本的添加已經完成,如下這樣:

清單 3. 使用 android:text 創建一個占位符

  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 應用程序可以更好地滿足大多數移動用戶的期望。我可以很輕松地實現滑動行為,您很快就會看到。

在 Android 中為手勢編碼

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

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

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

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

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

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

#p#

SwipeDetector

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

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

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

很容易將這類邏輯抽象到某個進行數據運算的簡單類中。SimpleOnGestureListener 有一個調用 onFling 的方法。onFling 方法提供了兩個 MotionEvent 類型的參數(分別用于開始 和結束)來表示 X 軸上的速度,還提供了兩個 float 參數來表示 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.     } 

現在,已經有一個便利的類可以告訴我手指是否滑動過,我可以將它嵌入到我的 UI 中。回憶一下第一次創建的默認活動,我將其命名為 OverheardWord。我保留了 Eclipse 提供的所有代碼,但為了監聽滑動并做出響應,還要添加一些新內容,我定義了 Android GestureDetector,它將執行一次 OnGestureListener 實現。非常感謝 Android 團隊創建了一個便利的類,我可以通過一個稱為 SimpleOnGestureListener 的匿名類來實現此操作,然后重寫 onFling 方法。

UI 中的滑動檢測

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

下一步是創建一個小對話框,當手指滑動時指定觸發事件。這類小的、臨時的對話框在這里稱為 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.     }); 

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

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

清單 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 實例的一個句柄。多數 Java 開發人員都比較喜歡這個便捷的 Android-ism。

通過 ID 方法找到視圖

還記得我為 UI 定義 XML 時各個資源文件(比如 strings.xml)中相應的值嗎?在我編譯 Android 應用程序時,XML 將變成代碼,提供給類 R 中的相應 Id。在執行進一步操作之前,應檢查您項目的 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 文件的內容及其相應 R 文件結合使用,可以在不需要解析 XML 的情況下引用這些小部件。因此,將會返回 Activity 的 onCreate 方法,我可以通過 View 小部件的 id(R.id.LinearLayout1)來應用它。findViewById 方法是在擴展 Activity 時 Android 平臺提供的。

手指一劃,輕松搞定!

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

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

現在,在真實的設備上運行這個正在開發的應用程序將會怎樣?

部署一個開發

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

在 開發模式下,無需擔心代碼簽名。事實上,Android 和 Eclipse 構建了帶有開發人員密鑰的二進制簽名,而這個密鑰是您所不知道的。因此,在開發模式下將某個應用程序放到設備上并不困難,最簡單的方法是將您的 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。假設您和我一起進行編碼,片刻之后,一個漂亮的應用程序將呈現在您的設備上。將手指向左、向右、向上滑動,見證奇跡的時刻到了,這個簡單的對話框會搞定一切。

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

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

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

結束語

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

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

責任編輯:閆佳明 來源: 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

2025-08-11 08:05:26

2010-10-08 13:31:07

移動開發

2023-03-01 00:18:45

2022-10-14 16:18:40

MobileNetAndroid端模型訓練

2009-06-29 14:22:00

FSO光纖

2009-06-10 22:06:29

JavaScript面向對象

2010-08-03 10:32:42

Android 3.0Android 3.0Android開發

2011-03-17 13:00:27

面向對象數據庫電子商務

2011-03-17 12:33:56

面向對象數據庫電子商務

2010-03-23 14:34:44

Python vim檢

2012-02-06 13:26:09

2010-06-21 13:09:14

Office2010微軟

2011-12-07 10:40:42

Sony索尼Android

2025-02-13 07:49:49

2012-05-25 10:37:21

AdobeStage3D
點贊
收藏

51CTO技術棧公眾號

天天躁日日躁aaaa视频| 亚洲欧美色图小说| 欧美性一二三区| 九色成人免费视频| 亚洲视频在线观看一区二区三区| 国产91久久久| 亚洲一区二区| 欧美精品色综合| 色狠狠久久av五月综合| 日韩久久中文字幕| 久久a爱视频| 亚洲国产欧美在线人成| 5g影院天天爽成人免费下载| 中文字幕在线观看2018| 欧洲精品久久久久毛片完整版| 久久久美女毛片| 欧美最近摘花xxxx摘花| 91玉足脚交白嫩脚丫| 国产高清在线a视频大全| 中文字幕日韩欧美精品高清在线| 亚洲成人精品视频| 青青青青草视频| 后入内射欧美99二区视频| 日本不卡高清视频| 最近2019中文字幕mv免费看| 天天爱天天操天天干| 国产精品蜜臀| 亚洲免费av网站| 91成人伦理在线电影| 香蕉影院在线观看| 精品精品99| 欧美性大战久久久久久久蜜臀| 久久精品xxx| 亚洲av成人精品一区二区三区在线播放| 91久久黄色| 日韩电影在线观看永久视频免费网站| 欧美 日本 亚洲| 欧美女v视频| 青青青爽久久午夜综合久久午夜| 91精品国产91久久久久久| 制服丝袜第二页| 欧美色999| 亚洲欧洲日产国码二区| 91av一区二区三区| 国产一区二区三区中文字幕| 欧美福利视频| 亚洲精品wwww| 天天干天天操天天做| 女人天堂av在线播放| 91麻豆.com| 国产日韩欧美在线看| 精品国产欧美日韩不卡在线观看| 国产精品美女在线观看直播| 欧美性高潮床叫视频| 宅男av一区二区三区| 亚洲av无码一区二区乱子伦| 午夜亚洲影视| 久热精品视频在线| 久久精品老司机| 国产精品久久久久久久久久久久久久久 | 欧美成人精品一区二区| 成人一区二区三区仙踪林| 鲁鲁在线中文| 中文字幕亚洲电影| 亚洲自拍三区| 亚洲人成色777777老人头| 成人18精品视频| 国产精品丝袜一区二区三区| 欧美日韩成人免费观看| 久操国产精品| 精品久久久网站| 五月婷婷六月合| aaa在线播放视频| 国产精品久久久久久久午夜片| 成人综合电影| 亚洲综合精品视频| 亚洲一区不卡| 久久久久久av| 久久99久久99精品免费看小说| 日韩av字幕| 色吊一区二区三区| 热99这里只有精品| 国产淫片在线观看| 国产日产精品一区| 国内精品国语自产拍在线观看| 一级aaaa毛片| 国产盗摄精品一区二区三区在线 | vam成人资源在线观看| 精品久久久久久久久久久久久久| 久久久一二三四| 内衣办公室在线| 中文字幕一区二区三区在线播放| 欧美下载看逼逼| 午夜av免费观看| 久久久亚洲欧洲日产国码αv| 性高潮久久久久久久久| 午夜成年人在线免费视频| 国产精品国产馆在线真实露脸 | 久久精品在线观看视频| 一个色免费成人影院| 亚洲国产小视频| 男人的天堂官网| 美女精品一区最新中文字幕一区二区三区| 夜夜躁日日躁狠狠久久88av| 免费a级黄色片| 伊人青青综合网| 日本一区二区三区在线播放| 久久国产精品系列| 亚洲国产精品第一区二区| 日产精品久久久一区二区福利| 国产人妻精品一区二区三| 麻豆精品视频在线观看视频| 国产成人在线亚洲欧美| 亚洲成人第一网站| 国产精品一区二区在线观看网站| 成人在线一区二区| 国产精品爽爽久久| 国产在线播放一区三区四| 91亚洲精品视频| 男女网站在线观看| 亚洲国产精品一区二区www在线| 成人亚洲精品777777大片| 伦理一区二区三区| 色中色综合影院手机版在线观看| 亚洲精品国产精品乱码视色| 免费在线视频一区| 成人精品网站在线观看| 999精品国产| 中文字幕第一区综合| 中文字幕中文字幕99| 成人影院大全| 欧美性色欧美a在线播放| 久久久久亚洲AV成人无码国产| 图片婷婷一区| 欧美激情视频网址| 在线天堂中文字幕| 成人精品视频一区二区三区尤物| 国产又粗又大又爽的视频| 密臀av在线| 欧美一区二区三区免费| 中文成人无字幕乱码精品区| 欧美69wwwcom| 亚洲va国产va天堂va久久| 亚洲男女视频在线观看| 亚洲日本在线天堂| www.成年人| 欧美1区二区| 国语对白做受69| 一级黄色在线观看| 国产一区中文字幕| 一道本在线观看视频| 色狠狠一区二区三区| 色噜噜狠狠色综合网图区| 在线播放国产一区| 中文字幕中文乱码欧美一区二区| 久久久久久久久久久久91| 日韩一区电影| 久久噜噜噜精品国产亚洲综合 | 激情深爱一区二区| 国产富婆一区二区三区 | 亚洲高清视频中文字幕| 亚洲欧美高清在线| 精品一二三区| 国产精品色视频| 人人妻人人澡人人爽精品日本| 国产网站一区二区三区| 欧美一级黄色影院| 91精品尤物| 日韩中文在线中文网三级| 91色在线播放| 亚洲制服欧美中文字幕中文字幕| 成人性视频欧美一区二区三区| 精品福利久久久| 国产在线日韩在线| 日韩另类在线| 亚洲区免费影片| 国产成人精品av久久| 老鸭窝一区二区久久精品| 在线免费观看一区二区三区| 亚洲乱码一区| 日韩av电影免费观看高清| 调教视频免费在线观看| 欧美视频在线观看免费| 亚洲一区 欧美| 免费欧美日韩| 亚洲成人自拍视频| 一区一区三区| 久久精品一区中文字幕| 日韩国产成人在线| 亚洲欧美激情小说另类| 亚洲国产欧美视频| 经典三级在线一区| 国产黄色一级网站| 久久精品亚洲人成影院 | 久久亚洲国产成人精品无码区 | 欧美日韩激情一区二区| jizz日本免费| 久久99精品国产麻豆不卡| 日韩av电影免费播放| 九色porny自拍视频在线播放| 亚洲小视频在线观看| 天天综合网久久综合网| 自拍偷自拍亚洲精品播放| 精品一区二区视频在线观看| 麻豆久久久久久| 精品国产一二三四区| 亚洲精品国产偷自在线观看| 美乳视频一区二区| 亚洲精品永久免费视频| 日韩激情av在线免费观看| 国产一区二区波多野结衣| 欧美性生交大片免网| 麻豆疯狂做受xxxx高潮视频| 国产精品久久综合| 中文字幕在线观看网址| 国产福利一区二区三区视频在线| 538在线视频观看| 国产精品综合| 欧美午夜小视频| 中文字幕一区二区精品区| 亚洲毛片aa| 欧美视频网址| 国产视频观看一区| 一区二区三区短视频| 午夜精品理论片| 黄色片在线播放| 欧美日韩精品系列| 中文人妻av久久人妻18| 国产精品视频看| 中文字幕国产专区| 免费精品视频在线| 男女av免费观看| 日韩三级在线| 亚洲成人蜜桃| 青青草91久久久久久久久| 热re99久久精品国产99热| 日本免费成人| 国产精品午夜一区二区欲梦| 欧美电影免费观看网站| 少妇激情综合网| 成人免费在线视频网| 欧美电影影音先锋| 中文字幕在线观看国产| 一区二区三区鲁丝不卡| 波多野结衣在线网址| 亚洲欧美日韩在线播放| 久久爱一区二区| 亚洲三级在线看| 无码人妻精品一区二区三区夜夜嗨| 最新欧美精品一区二区三区| 91精品少妇一区二区三区蜜桃臀| 综合欧美亚洲日本| 欧美黄色免费看| 性感美女极品91精品| 日本美女bbw| 国产精品你懂的在线| 国产中文字幕久久| 亚洲人妖av一区二区| 四虎永久免费在线| 一区二区三区毛片| 日韩三级视频在线播放| 岛国精品视频在线播放| 国产午夜手机精彩视频| 亚洲另类中文字| 日本学生初尝黑人巨免费视频| 国产精品剧情在线亚洲| 在线观看美女av| 亚洲综合久久av| 可以免费在线观看的av| 亚洲精品成人悠悠色影视| 亚洲女优在线观看| 国产精品久久久久久久久免费樱桃| 极品色av影院| 亚洲国产精品一区二区尤物区| 欧美性猛交bbbbb精品| 欧美日韩一区二区在线视频| 天堂а√在线中文在线新版 | 欧美激情综合亚洲一二区| 高清精品在线| 久久91超碰青草是什么| 波多野结衣视频一区二区| 69精品小视频| 色噜噜成人av在线| 国产亚洲精品美女久久久m| 欧美理论在线播放| 欧美中文字幕在线观看视频| 丝袜美腿亚洲一区| 欧美 日韩 激情| 日本v片在线高清不卡在线观看| 九九九久久久久久久| 毛片av中文字幕一区二区| 亚洲AV无码久久精品国产一区| 蜜乳av一区二区| 黄色av电影网站| 国产在线播放一区| 毛茸茸多毛bbb毛多视频| 中文字幕一区三区| 国产小视频在线免费观看| 欧美高清视频一二三区| 三级做a全过程在线观看| 亚洲精品按摩视频| 欧美成人性生活视频| 最近2019年好看中文字幕视频 | 欧美新色视频| 美日韩在线视频| 日本精品不卡| 国产经典一区二区三区| 香蕉视频官网在线观看日本一区二区| 免费看国产曰批40分钟| 国产一区二区精品久久| 国产又粗又黄又猛| 天天操天天色综合| 超碰在线人人干| 日韩欧美中文一区二区| 国产a级免费视频| 日韩女同互慰一区二区| 亚洲成人精品女人久久久| 一本色道久久综合亚洲精品小说 | 一区在线观看| 人妻夜夜添夜夜无码av| 卡一卡二国产精品| 亚洲国产欧美视频| 亚洲电影一区二区| 国产毛片久久久久| 日韩中文在线视频| 成人做爰视频www| 91亚洲永久免费精品| 日本不卡二三区| www.欧美日本| 国产亚洲人成网站| 亚洲欧美综合另类| 精品亚洲精品福利线在观看| 国产小视频在线播放| 51午夜精品视频| 欧美韩国日本| 国产69精品久久久久9999apgf | 亚洲不卡中文字幕无码| 国产a区久久久| 精品人妻一区二区三区香蕉| 亚洲成av人**亚洲成av**| 国产高清视频免费观看| 久久影院中文字幕| 国产精品成人3p一区二区三区| 曰韩不卡视频| 国内精品久久久久影院色| 国产探花在线视频| 3751色影院一区二区三区| 欧美性受xxxx狂喷水| 欧美高清第一页| japanese色系久久精品| 色999五月色| 日本伊人午夜精品| 摸摸摸bbb毛毛毛片| 欧洲另类一二三四区| 99久久久国产精品无码免费| 久久国产精品网站| baoyu135国产精品免费| av在线播放亚洲| 26uuu亚洲婷婷狠狠天堂| 日韩免费av网站| 日韩中文字幕视频在线| 成年人黄色大片在线| 久久久福利视频| 欧美福利影院| 手机在线成人av| 一本到一区二区三区| 粉嫩av一区二区夜夜嗨| 97视频免费观看| 欧美精品一二| 中文字幕色网站| 亚洲午夜一二三区视频| 亚洲无码久久久久久久| 久色乳综合思思在线视频| caoporn成人免费视频在线| 日本wwww视频| 国产精品亚洲一区二区三区在线| 久久久久亚洲av无码专区| 欧美视频一区二区三区在线观看 | 亚洲天堂a在线| 亚洲福利在线观看视频| 欧美有码在线观看| 99精品视频在线观看播放| 午夜精品久久久内射近拍高清| 国产欧美一二三区| 国产精品视频免费播放| 在线看日韩欧美| 999久久久精品一区二区| av免费中文字幕| 亚洲美女在线国产| 网站黄在线观看| 国产日韩欧美在线视频观看| 亚洲精品国产日韩| 99成人在线观看| 亚洲精品国产拍免费91在线| 成人全视频免费观看在线看| 日本欧洲国产一区二区| 国产精品主播直播| 超碰在线观看91| 国模精品视频一区二区三区| 成人中文视频|