新聞中心
將 Android 移動(dòng)應(yīng)用程序中的按鈕轉(zhuǎn)換成滑動(dòng)手勢

成都創(chuàng)新互聯(lián)專注于永定網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供永定營銷型網(wǎng)站建設(shè),永定網(wǎng)站制作、永定網(wǎng)頁設(shè)計(jì)、永定網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造永定網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供永定網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
移動(dòng)用戶通常思想不集中、非常繁忙、容易受人體工程學(xué)的約束,因此您需要相應(yīng)地構(gòu)建自己的移動(dòng)應(yīng)用程序 UI。Andrew Glover 討論了區(qū)分移動(dòng)應(yīng)用程序和 Web 應(yīng)用程序的關(guān)鍵因素,然后指導(dǎo)您創(chuàng)建一個(gè)移動(dòng)應(yīng)用程序 UI,使用滑動(dòng)手勢而非按鍵來進(jìn)行導(dǎo)航。
構(gòu)建移動(dòng)應(yīng)用程序和構(gòu)建 Web 應(yīng)用程序一樣,要時(shí)刻牢記最終目標(biāo)(和用戶)。始終了解您的應(yīng)用程序可以給用戶帶來哪些利益。您的應(yīng)用程序?qū)@示哪些類型的信息,擁有哪些功能,用戶如何獲取這些信息和功能?對移動(dòng)應(yīng)用程序的用戶體驗(yàn)給予足夠的關(guān)注有助于確保獲得成功。
關(guān)于本系列:近年來,移動(dòng)應(yīng)用程序發(fā)布呈爆炸式增長,移動(dòng)開發(fā)技術(shù)市場亦是如此。本系列是一個(gè)新系列,向那些熟悉編程但對移動(dòng)技術(shù)較為陌生的開發(fā)人員介紹移動(dòng)應(yīng)用程序。 先從使用 Java 代碼為本機(jī)應(yīng)用程序編碼開始介紹,然后擴(kuò)展工具包,使之包含 JVM 語言、腳本框架、HTML5/CSS/JavaScript、第三方工具等。本系列文章將帶您逐步掌握這些必要技術(shù),實(shí)際應(yīng)對所有移動(dòng)開發(fā)場景。
不同于面向桌面或 Web 應(yīng)用程序的傳統(tǒng) GUI 開發(fā),移動(dòng)應(yīng)用程序的規(guī)則是寧缺勿濫。當(dāng)您決定設(shè)計(jì)一個(gè)應(yīng)用程序界面時(shí),可能想簡單點(diǎn),想容易點(diǎn)。大多數(shù)移動(dòng)設(shè)備都很?。ǔ悄鎸Φ氖?Samsung Note 4,這是我見過的最大移動(dòng)電話,也稱作 平板電腦)。小巧是其流行的一個(gè)重要原因,因?yàn)槿藗兛梢噪S身攜帶,隨時(shí)使用。這導(dǎo)致關(guān)于移動(dòng)應(yīng)用程序的另一個(gè)重要發(fā)現(xiàn),大多數(shù)用戶使用移動(dòng)設(shè)備時(shí)并不關(guān)注應(yīng)用程序。
一些移動(dòng)應(yīng)用程序是專門為平板電腦而構(gòu)建的,只是為了實(shí)現(xiàn)業(yè)務(wù)使用(比如醫(yī)生訪問病人記錄)。大多數(shù)移動(dòng)應(yīng)用程序需要用戶通過微型設(shè)備進(jìn)行訪問,坦白的說, 用戶也會(huì)做些其他事情。當(dāng)我在線等待購買一些日用品時(shí),可能會(huì)玩幾局憤怒的小鳥。結(jié)束長途飛行下飛機(jī)后,可能會(huì)利用這段時(shí)間查收郵件。但是,如果只需要單 擊兩下或者輕輕一劃就能加載憤怒的小鳥或者郵件信息,我可能會(huì)繼續(xù)使用移動(dòng)應(yīng)用程序。
將移動(dòng)應(yīng)用程序與傳統(tǒng) Web 和桌面應(yīng)用程序真正區(qū)分開的另一個(gè)要素就是數(shù)量:對于每個(gè) Web 應(yīng)用程序來說,很容易獲得 100 個(gè)移動(dòng)應(yīng)用程序。使用您的應(yīng)用程序提供多個(gè)有價(jià)值的服務(wù),確保這些應(yīng)用程序容易使用且具有吸引力。如果您希望用戶通過 RTM(參考用戶手冊)使用您的應(yīng)用程序,那么您給用戶制造了一個(gè)問題,這最終將成為您的問題。無論用戶是訪問病人記錄的醫(yī)生,還是在休息室玩 Cut-the-Rope 的人,這沒有關(guān)系。如果您的應(yīng)用程序只需幾分鐘才能安裝好,那么用戶可能會(huì)搜索應(yīng)用程序商店,尋找一個(gè)需要更短時(shí)間的應(yīng)用程序。
(Hello) Overheard Word
如果您閱讀了本系列的第一篇文章, 您就會(huì)知道如何在 Eclipse 中構(gòu)建 Android 開發(fā)環(huán)境,上一篇文章已經(jīng)為 Android 4.2 配置了 Android SDK。您應(yīng)該已經(jīng)完成了第一個(gè) Android 應(yīng)用程序,經(jīng)典的 Hello World。在本期文章中,您將繼續(xù)設(shè)計(jì)一個(gè)更獨(dú)特的應(yīng)用程序。
我的示例應(yīng)用程序 Overheard Word 旨在使學(xué)習(xí)新詞匯并在上下文中使用新詞匯變得更有趣、更簡單,順便說一下,這是我最大的兩個(gè)愛好。在這個(gè)應(yīng)用程序中,用戶學(xué)習(xí)了幾個(gè)單詞后就可以進(jìn)行測 驗(yàn)。界面由一個(gè)顯示界面和兩個(gè)按鈕組成。顯示的是單詞及其相應(yīng)定義,而按鈕是用于用戶導(dǎo)航的。
Overheard Word 是一個(gè)有趣且簡單的移動(dòng)應(yīng)用程序,適用于那些喜歡學(xué)習(xí)單詞的人們(我的意思是可用詞匯癡迷者 和單詞行家 描述他們)。更重要的是,該示例可作為構(gòu)建一個(gè)合法 Android 應(yīng)用程序的示例,您可以將其部署到真正的 Android 設(shè)備中。
以應(yīng)用程序?yàn)槟繕?biāo)
在設(shè)計(jì)一個(gè)應(yīng)用程序之前,我喜歡評估目標(biāo)市場。在第 1 部分中構(gòu)建的應(yīng)用程序的目標(biāo)是 Android 4.2 或者 API 版本 17。看看 Google 發(fā)布的最流行的 Android 版本。(參見圖 1):
圖 1. Android 分布,按版本號排列
平板電腦和手機(jī):在 圖 1 中,平板電腦銷量很可能是 Android 15 用戶增加所引起的。不管是哪個(gè)供應(yīng)商,多數(shù)平板電腦目前都運(yùn)行 Android 4.x。除非您專門構(gòu)建一個(gè) Android 平臺(tái)電腦應(yīng)用程序,是否應(yīng)將您的應(yīng)用程序目標(biāo)定為 Android API 9 和 10,這是目前移動(dòng)設(shè)備的主流市場。
圖 1 顯示 Android 2.3.x(API 版本 9 和 10)目前僅占有大約一半的 Android 設(shè)備市場!如果所有 Android 設(shè)備的一半設(shè)備都在運(yùn)行 Android 2.3.x,那么為這一市場進(jìn)行開發(fā)不是很有意義嗎?
開始一個(gè)新項(xiàng)目
在結(jié)束上一期文章時(shí),我已經(jīng)安裝了 API 4.2?,F(xiàn)在我想要安裝 Android 2.3.3 (API 10) 。再次啟動(dòng) Android SDK Manager 時(shí),如 圖 2 所示,您會(huì)看到有一些更新可以安裝:
圖 2. 一個(gè)本地 Android SDK 安裝程序,僅有一個(gè)安裝版本
如果您想要和我一起進(jìn)行,請單擊 Android 2.3.3 (API 10) 安裝選項(xiàng),保留管理員指定的推薦更新。
圖 3. 安裝 Android 2.3.3 (API 10)
下載了新的 Android API 后,必須創(chuàng)建一個(gè)兼容模擬器或 Android Virtual Device (AVD)。在 Android SDK Manager 中選擇 Tools 菜單,然后選中 Manage AVDs。務(wù)必創(chuàng)建一個(gè)目標(biāo)為 API Level 10 的 AVD。
圖 4. 創(chuàng)建一個(gè) AVD
接著,創(chuàng)建一個(gè) New Android Application 項(xiàng)目并為其命名。我的項(xiàng)目名稱是 Overheard Word 應(yīng)用程序。將該應(yīng)用程序的目標(biāo)設(shè)為 API 10,使其能夠訪問最多的設(shè)備。仔細(xì)查看 圖 5 中的屏幕截圖,您會(huì)注意到我也選擇使用 API 10 進(jìn)行編譯。您可以使用一個(gè)更高的 Android 版本進(jìn)行編譯,但是我喜歡使用同一個(gè) API 進(jìn)行編程和編譯。(如果使用最近發(fā)布的 API 進(jìn)行編譯,則必須注意,不能使用我應(yīng)用程序中的任何特性,這可能導(dǎo)致兼容問題。)
圖 5. 在 Eclipse 中創(chuàng)建一個(gè)新 Android 項(xiàng)目
當(dāng)單擊 Next 時(shí),務(wù)必確定沒有將您的應(yīng)用程序保存為一個(gè) Library Project。在下期文章中,將會(huì)繼續(xù)為 Hello World 應(yīng)用程序保留相同默認(rèn)設(shè)置??梢栽诤笃谶M(jìn)行一些小的變動(dòng)(比如,更改應(yīng)用程序的圖標(biāo)文件)。
最后一步是為您的第一個(gè) Activity 命名。我將我的 Activity 命名為 OverheardWord,而不是 Main,然后對布局也進(jìn)行了類似的命名。如果您也使用 API 10 作為目標(biāo)版本,最后對話框中會(huì)有幾個(gè) Navigation Type 選項(xiàng)?,F(xiàn)在不用擔(dān)心;在后續(xù)文章中,我會(huì)向您介紹如何創(chuàng)建一個(gè)導(dǎo)航菜單。對于該應(yīng)用程序,將您的 Navigation Type 選項(xiàng)保留為 none。
圖 6. 創(chuàng)建一個(gè)默認(rèn) Activity
單擊 Finish 創(chuàng)建一個(gè)項(xiàng)目,這個(gè)項(xiàng)目和上次創(chuàng)建的默認(rèn)項(xiàng)目很像。
#p#
構(gòu)建一個(gè) Android UI
現(xiàn)在,您已經(jīng)構(gòu)建了一個(gè)簡單 UI。你還記得嗎?Android UI 最終是作為一個(gè) XML 文檔定義的,對此您可能比較熟悉。如果您從事的是傳統(tǒng) Java? GUI 開發(fā),那么您可能會(huì)記得布局工具,Android 也使用了布局工具。您可以使用 Android 的布局工具來定義(實(shí)際上建議)某個(gè)設(shè)備如何布局您的應(yīng)用程序可視組件。布局樣式包括:
- Linear:其中組件以平行和垂直方式布局(類似于報(bào)紙專欄)
- Relative:其中組件彼此相互隔開(小部件 2 位于小部件 1 的右邊,等等)
- Table:其中小部件按行或列展示
有很多布局工具可用,這只是個(gè)開始!
您可以使用一個(gè)布局工具來定義小部件,您會(huì)發(fā)現(xiàn)這是所有 GUI 中的常用組件。Android 平臺(tái)提供了一些基礎(chǔ)小部件,比如按鈕、文本框、下拉列表,以及圖片瀏覽器和滾輪之類較為復(fù)雜的小部件。
我覺得我的 Overheard Word UI 需要:
- 三個(gè)文本字框(分別保存一個(gè)單詞、發(fā)音和定義)
- 兩個(gè)按鈕(一個(gè)選擇新單詞,一個(gè)進(jìn)行測驗(yàn))
定義布局
要將一個(gè) Android UI 組合起來,第一步是定義其布局以及您想要在其中使用的小部件。在 清單 1 中,我首先定義了一個(gè)帶有 3 個(gè) TextViews 的 LinearLayout。接下來,我將創(chuàng)建一個(gè)子布局(另一個(gè) LinearLayout)來保存兩個(gè) Button。
清單 1. 在 Android 中定義一個(gè) LinearLayout
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".OverheardWord" >
- android:id="@+id/word_study_word"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginBottom="10dp"
- android:layout_marginTop="60dp"
- android:textColor="@color/black"
- android:textSize="30sp" />
- android:id="@+id/word_study_part_of_speech"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginBottom="10dp"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:textColor="@color/black"
- android:textSize="18sp" />
- android:id="@+id/word_study_definition"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginLeft="40dp"
- android:layout_marginRight="40dp"
- android:textColor="@color/black"
- android:textSize="18sp" />
- android:id="@+id/widget62"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp" >
正如您從 清單 1 的 XML 中所看到的,每個(gè)小部件都有很多屬性,這些屬性最終會(huì)影響其外觀。例如,每個(gè)按鈕都有一個(gè) text 元素,其字符串指向一個(gè)資源元素。該資源元素是在名為 strings.xml 的資源文件 中定義的,strings.xml 位于 res/values 目錄下。清單 2 展示了 strings.xml 文件。
清單 2. 定義按鈕顏色和標(biāo)簽的資源文件
Overheard Word #ffffff #000000 Next word Take quiz
如果想看看我的 UI 之前的樣子,可以啟動(dòng)一個(gè)模擬器實(shí)例,在 Eclipse 中單擊 Graphical Layout 即可,如 圖 7 所示。
圖 7. Eclipse 中運(yùn)行的 Overheard Word
占位符文本
預(yù)覽我的 UI,我被單詞屬性的空格弄的有點(diǎn)糊涂。不過這不是什么大問題:為了更真實(shí)的呈現(xiàn)文本顯示,我在編寫代碼之前添加了一些樣例文本。
首先,為每個(gè)小部件添加了一個(gè) android:text 屬性,就像為按鈕標(biāo)簽添加屬性那樣?,F(xiàn)在,占位符文本的添加已經(jīng)完成,如下這樣:
清單 3. 使用 android:text 創(chuàng)建一個(gè)占位符
- android:id="@+id/word_study_part_of_speech"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginBottom="10dp"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:textColor="@color/black"
- android:textSize="18sp"
- android:text="Part of Speech"/>
正如您在 清單 3 所看到的,我將樣例文本("Part of Speech") 添加到了 word_study_part_of_speechTextView 中。通過增加文本大小、定義文本顏色以及將布局中的小部件居中,我更新了一些樣式元素。對于 Android 應(yīng)用程序中的定義來說,清單 3 中的屬性比較常見;當(dāng)構(gòu)建更多應(yīng)用程序時(shí),就會(huì)熟悉和喜愛這些屬性了。我直接在我的布局文件中定義了樣例文本,沒有在資源文件中定義它們,因?yàn)槲业脑O(shè)計(jì)過程中的文本值是臨時(shí)的。
當(dāng)我從 Eclipse 中運(yùn)行我的應(yīng)用程序時(shí),我就在想當(dāng)用戶啟動(dòng)應(yīng)用程序時(shí)會(huì)看到什么:
圖 8. AVD 中運(yùn)行的 Overheard Word
UI 設(shè)計(jì)的某些方面目前還有一個(gè)小問題。您能猜到是什么問題嗎?對,就是令人討厭的按鈕。它們是必需的嗎?用戶平常會(huì)單擊移動(dòng)應(yīng)用程序上的按鈕嗎?用戶可能通過左右滑動(dòng)來查看新單詞,或者通過向下滑動(dòng)來進(jìn)行測驗(yàn)。
刪除按鈕可清理 UI,使 Overheard Word 應(yīng)用程序可以更好地滿足大多數(shù)移動(dòng)用戶的期望。我可以很輕松地實(shí)現(xiàn)滑動(dòng)行為,您很快就會(huì)看到。
在 Android 中為手勢編碼
我為 Overheard Word 應(yīng)用程序定義了初始界面,并添加了一些行為。我將自己的傳統(tǒng) Java GUI 開發(fā)再次應(yīng)用到 Android 上,首次在 Android 中使用監(jiān)聽器來響應(yīng)事件。如果要保留兩個(gè)按鈕,我可能會(huì)使用 OnClickListener 將行為附加到按鈕單擊活動(dòng)中,然后將它們附加到每個(gè)按鈕小部件的 setOnClickListener 方法中。
匿名類:匿名類是在某個(gè)類的內(nèi)部定義的類,但是沒有名稱:您可以在一個(gè)表達(dá)式中定義和實(shí)例化 匿名類。我發(fā)現(xiàn)匿名類既方便又好用,我編寫了很多匿名類,特別是在編寫用戶界面行為時(shí)。
當(dāng)我確定可以使用 OnClickListener 時(shí),如果不止有一個(gè)小部件,那么我可能會(huì)使用多個(gè)類文件來結(jié)束這一切。我不喜歡雜亂無序,所以我選擇使用匿名類的備用實(shí)現(xiàn)策略。
盡管滑動(dòng)手勢 是傳統(tǒng) GUI 編程中所沒有的概念,但其實(shí)現(xiàn)類似于編寫一個(gè)按鈕單擊。我啟動(dòng)了一個(gè)觸摸監(jiān)聽器(它是底層 Android 平臺(tái)的一部分),然后提供響應(yīng)行為。為了檢測手指滑動(dòng)動(dòng)作,我還計(jì)算了一個(gè)手勢的開始 和結(jié)束 之間的差異,以及滑動(dòng)姿勢。(我發(fā)這是非常有用的,可以考慮這種情況:在迪卡爾坐標(biāo)中,左右滑動(dòng)位于 X 軸上,而上下滑動(dòng)位于 Y 軸上。)
手勢可能出現(xiàn)在界面的任何地方,如果將這類監(jiān)聽器附加到應(yīng)用程序界面的任何組件上,就可以啟動(dòng)布局(這在 Android 中可以表示為 View)并包含最簡單的按鈕小部件。我使用 Android 的 SimpleOnGestureListener 創(chuàng)建我的初始手勢實(shí)現(xiàn),然后通過 onTouchListener 方法將其附加到 View 中。我可以通過將它附加到視圖實(shí)例中來檢測整個(gè) 界面上的手指滑動(dòng),而不僅僅是在其組件內(nèi)部(比如小圖片瀏覽器)中進(jìn)行測試。
盡管可以這樣做,但我必須編寫一個(gè)可檢測移動(dòng)設(shè)備上手指活動(dòng)的類。
#p#
SwipeDetector
按 鈕單擊相對較為容易檢測。底層操作系統(tǒng)通常提取按鈕邊界的坐標(biāo)信息,因此可以跳過人工定義這一步。編寫您的應(yīng)用程序來識別和響應(yīng)一個(gè)滑動(dòng)動(dòng)作有點(diǎn)復(fù)雜。 Android 將其留給程序員來編寫,雖然這個(gè)任務(wù)稍微有點(diǎn)復(fù)雜,但也為您提供了極大的靈活性。您可以和我一樣選擇檢測單一滑動(dòng)動(dòng)作,也可以檢測其他手指動(dòng)作,比如游戲 中有時(shí)會(huì)使用摩擦。
考慮移動(dòng)性:您是否很好奇移動(dòng)監(jiān)聽器是否仍然通過動(dòng)作單擊 來定義?我上次查看的時(shí)候,用戶通常是按下 移動(dòng)設(shè)備上的按鈕,而不是像桌面上使用鼠標(biāo)那樣單擊 按鈕。既然是一名移動(dòng)開發(fā)人員,就要考慮到可移動(dòng)性,這意味著需要重新思考傳統(tǒng) Web 和桌面機(jī)制,比如按鈕單擊、開始菜單,甚至 GUI 向?qū)А?/em>
編寫手勢滑動(dòng)檢測程序涉及到笛卡爾數(shù)學(xué)。也就是說,如果 X 軸上的開始坐標(biāo) 減去結(jié)束坐標(biāo) 大于預(yù)先定義的距離,那么您就可以假設(shè)用戶將手指從應(yīng)用程序界面右邊滑到左邊。在 Y 軸上使用了同樣的方法來檢測上下滑動(dòng)。
很容易將這類邏輯抽象到某個(gè)進(jìn)行數(shù)據(jù)運(yùn)算的簡單類中。SimpleOnGestureListener 有一個(gè)調(diào)用 onFling 的方法。onFling 方法提供了兩個(gè) MotionEvent 類型的參數(shù)(分別用于開始 和結(jié)束)來表示 X 軸上的速度,還提供了兩個(gè) float 參數(shù)來表示 Y 軸上的速度。因此,清單 4 中的 SwipeDetector 類 清單 4 有 4 個(gè)方法來描繪一個(gè)滑動(dòng)的全部活動(dòng):上、下、左、右。
清單 4. SwipeDetector
- import android.view.MotionEvent;
- public class SwipeDetector {
- private int swipe_distance;
- private int swipe_velocity;
- private static final int SWIPE_MIN_DISTANCE = 120;
- private static final int SWIPE_THRESHOLD_VELOCITY = 200;
- public SwipeDetector(int distance, int velocity) {
- super();
- this.swipe_distance = distance;
- this.swipe_velocity = velocity;
- }
- public SwipeDetector() {
- super();
- this.swipe_distance = SWIPE_MIN_DISTANCE;
- this.swipe_velocity = SWIPE_THRESHOLD_VELOCITY;
- }
- public boolean isSwipeDown(MotionEvent e1, MotionEvent e2, float velocityY) {
- return isSwipe(e2.getY(), e1.getY(), velocityY);
- }
- public boolean isSwipeUp(MotionEvent e1, MotionEvent e2, float velocityY) {
- return isSwipe(e1.getY(), e2.getY(), velocityY);
- }
- public boolean isSwipeLeft(MotionEvent e1, MotionEvent e2, float velocityX) {
- return isSwipe(e1.getX(), e2.getX(), velocityX);
- }
- public boolean isSwipeRight(MotionEvent e1, MotionEvent e2, float velocityX) {
- return isSwipe(e2.getX(), e1.getX(), velocityX);
- }
- private boolean isSwipeDistance(float coordinateA, float coordinateB) {
- return (coordinateA - coordinateB) > this.swipe_distance;
- }
- private boolean isSwipeSpeed(float velocity) {
- return Math.abs(velocity) > this.swipe_velocity;
- }
- private boolean isSwipe(float coordinateA, float coordinateB, float velocity) {
- return isSwipeDistance(coordinateA, coordinateB)
- && isSwipeSpeed(velocity);
- }
- }
現(xiàn)在,已經(jīng)有一個(gè)便利的類可以告訴我手指是否滑動(dòng)過,我可以將它嵌入到我的 UI 中?;貞浺幌碌谝淮蝿?chuàng)建的默認(rèn)活動(dòng),我將其命名為 OverheardWord。我保留了 Eclipse 提供的所有代碼,但為了監(jiān)聽滑動(dòng)并做出響應(yīng),還要添加一些新內(nèi)容,我定義了 Android GestureDetector,它將執(zhí)行一次 OnGestureListener 實(shí)現(xiàn)。非常感謝 Android 團(tuán)隊(duì)創(chuàng)建了一個(gè)便利的類,我可以通過一個(gè)稱為 SimpleOnGestureListener 的匿名類來實(shí)現(xiàn)此操作,然后重寫 onFling 方法。
UI 中的滑動(dòng)檢測
在 Activity 的 onCreate 方法中,最初使用 SimpleOnGestureListener 創(chuàng)建了一個(gè) GestureDetector,這需要使用我的 SwipeDetector 類。
下一步是創(chuàng)建一個(gè)小對話框,當(dāng)手指滑動(dòng)時(shí)指定觸發(fā)事件。這類小的、臨時(shí)的對話框在這里稱為 Toast。有時(shí)候 Toast 僅有一行代碼。
清單 5. GestureDetector
- private GestureDetector initGestureDetector() {
- return new GestureDetector(new SimpleOnGestureListener() {
- private SwipeDetector detector = new SwipeDetector();
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- try {
- if (detector.isSwipeDown(e1, e2, velocityY)) {
- return false;
- } else if (detector.isSwipeUp(e1, e2, velocityY)) {
- showToast("Up Swipe");
- }else if (detector.isSwipeLeft(e1, e2, velocityX)) {
- showToast("Left Swipe");
- } else if (detector.isSwipeRight(e1, e2, velocityX)) {
- showToast("Right Swipe");
- }
- } catch (Exception e) {} //for now, ignore
- return false;
- }
- private void showToast(String phrase){
- Toast.makeText(getApplicationContext(), phrase, Toast.LENGTH_SHORT).show();
- }
- });
- }
現(xiàn)在,我們將創(chuàng)建一個(gè)計(jì)算用戶手指滑動(dòng)范圍和速度的 initGestureDetector 方法。首先創(chuàng)建一個(gè)匿名 SimpleOnGestureListener 實(shí)例,并提供一個(gè) onFling 方法的實(shí)現(xiàn)。請注意 onFling 方法是如何使用 SwipeDetector 的。例如,如果某個(gè)匹配項(xiàng)向上滑動(dòng),則會(huì)顯示 Toast 來表示移動(dòng)。
下一步是將這個(gè)滑動(dòng)檢測行為插入我的 UI 中。首先注冊幾個(gè)帶有 View 實(shí)例的監(jiān)聽器。
清單 6. 在視圖上注冊滑動(dòng)檢測。
- private GestureDetector gestureDetector;
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_overheard_word);
- gestureDetector = initGestureDetector();
- View view = findViewById(R.id.LinearLayout1);
- view.setOnTouchListener(new View.OnTouchListener() {
- public boolean onTouch(View v, MotionEvent event) {
- return gestureDetector.onTouchEvent(event);
- }
- });
- view.setOnClickListener(new OnClickListener() {
- public void onClick(View arg0) {
- }
- });
- }
我在 onCreate 方法中通過其 Id 獲得了 View 實(shí)例的一個(gè)句柄。多數(shù) Java 開發(fā)人員都比較喜歡這個(gè)便捷的 Android-ism。
通過 ID 方法找到視圖
還記得我為 UI 定義 XML 時(shí)各個(gè)資源文件(比如 strings.xml)中相應(yīng)的值嗎?在我編譯 Android 應(yīng)用程序時(shí),XML 將變成代碼,提供給類 R 中的相應(yīng) Id。在執(zhí)行進(jìn)一步操作之前,應(yīng)檢查您項(xiàng)目的 gen 目錄下的 R 類。
查看您的布局 XML 文件(您可能會(huì)想起我將我的 XML 文件命名為 activity_overheard_word.xml)。該 XML 文件中的每個(gè)小部件都有一個(gè) id 屬性。例如,為了簡便起見,我的應(yīng)用程序的布局 id 是 android:id="@+id/LinearLayout1" 或 LinearLayout1。Id 名稱由 Eclipse 自動(dòng)生成,如果需要的話,可以更改該名稱。重要的是這個(gè) idLinearLayout1 在 R 類中有一個(gè)相對應(yīng)的屬性,如 清單 7 所示。
清單 7. R 類中的小部件 ID
- public static final class id {
- public static final int LinearLayout1=0x7f090000;
- public static final int action_settings=0x7f090004;
- public static final int word_study_definition=0x7f090003;
- public static final int word_study_part_of_speech=0x7f090002;
- public static final int word_study_word=0x7f090001;
- }
通過將 XML 文件的內(nèi)容及其相應(yīng) R 文件結(jié)合使用,可以在不需要解析 XML 的情況下引用這些小部件。因此,將會(huì)返回 Activity 的 onCreate 方法,我可以通過 View 小部件的 id(R.id.LinearLayout1)來應(yīng)用它。findViewById 方法是在擴(kuò)展 Activity 時(shí) Android 平臺(tái)提供的。
手指一劃,輕松搞定!
獲得 View 實(shí)例之后,就可以通過 setOnTouchListener 附加我的 gestureDetector 實(shí)例。在 清單 6 中,另一個(gè)匿名類現(xiàn)在正在處理我的所有觸摸行為。當(dāng)用戶觸摸設(shè)備屏幕時(shí),就會(huì)觸發(fā)事件并根據(jù) gestureDetector 進(jìn)行操作。我還實(shí)現(xiàn)了一個(gè) OnClickListener,并在 OnClickListener 方法中對其進(jìn)行設(shè)置;但是在本例中匿名類沒有任何行為。
有了這些,我就擁有了一個(gè)可以響應(yīng)手指滑動(dòng)的較為簡單的接口。在本示例中,可以使用其中三個(gè)滑動(dòng)手勢:左、右和上。在您的 AVD 中試試這些代碼。要模擬一個(gè)手指滑動(dòng),可以使用鼠標(biāo)單擊,然后向上、向下、向右拖拽。
現(xiàn)在,在真實(shí)的設(shè)備上運(yùn)行這個(gè)正在開發(fā)的應(yīng)用程序?qū)?huì)怎樣?
部署一個(gè)開發(fā)
為了應(yīng)對那些禍害毫無戒心的用戶的病毒、木馬程序和惡意軟件的繁殖,Apple 和 Google 為運(yùn)行在其設(shè)備上的第三方應(yīng)用程序分別引入了代碼簽名。理論上,代碼簽名可以確保讓有信譽(yù)的人來構(gòu)建應(yīng)用程序,確保在您安裝應(yīng)用程序之前沒有人可以篡改它 們。實(shí)際上,Google 和 Apple 簽名代碼的安全程度不一樣。例如,我在簽署我的 Android 應(yīng)用程序時(shí),可以聲明我是一個(gè)信譽(yù)良好的國家銀行。當(dāng)我簽署我的 iOS 或 Windows Phone 8 應(yīng)用程序時(shí)就無法這樣做。
在 開發(fā)模式下,無需擔(dān)心代碼簽名。事實(shí)上,Android 和 Eclipse 構(gòu)建了帶有開發(fā)人員密鑰的二進(jìn)制簽名,而這個(gè)密鑰是您所不知道的。因此,在開發(fā)模式下將某個(gè)應(yīng)用程序放到設(shè)備上并不困難,最簡單的方法是將您的 Andriod 設(shè)備插入計(jì)算機(jī) USB 端口。
接下來,進(jìn)入 Eclipse,右鍵單擊您的項(xiàng)目并選擇 Run As menu 選項(xiàng),然后單擊 Run Configurations。Eclipse 顯示一個(gè)配置對話框,您可以在其中選擇您的項(xiàng)目,然后單擊 Target 選項(xiàng)卡,如 圖 9 所示。
圖 9. 選擇一個(gè)用來運(yùn)行您的應(yīng)用程序的設(shè)備
您可以選擇 Always prompt to pick device(如果您希望有選擇性)或者 Launch on all compatible devices/AVD's。如果選擇了后者,可以像我那樣選擇 Active Devices 選項(xiàng)卡,然后單擊 Run。假設(shè)您和我一起進(jìn)行編碼,片刻之后,一個(gè)漂亮的應(yīng)用程序?qū)⒊尸F(xiàn)在您的設(shè)備上。將手指向左、向右、向上滑動(dòng),見證奇跡的時(shí)刻到了,這個(gè)簡單的對話框會(huì)搞定一切。
安全設(shè)置:如果不能從 Email 或 Dropbox 加載您的應(yīng)用程序,那么請進(jìn)入設(shè)備設(shè)置界面,然后啟動(dòng) Security Settings 下的 Unknown Sources。您可以使用該功能安裝應(yīng)用程序,包括您正在開發(fā)的應(yīng)用程序,而不是 從 Google Play 進(jìn)行安裝。
另一個(gè)部署應(yīng)用程序的方法是將其 .apk 文件通過郵件發(fā)給您,然后在您的 Android 設(shè)備上打開該文件,按照自動(dòng)安裝對話框的提示進(jìn)行操作。您也可以將 .apk 文件上傳到像 Dropbox 這樣的服務(wù)中,然后在您的設(shè)備上打開 Dropbox 進(jìn)行安裝。應(yīng)用程序的 .apk 文件在您項(xiàng)目的 bin 目錄下,Eclipse 也在其中保存了相應(yīng)的二進(jìn)制文件。
記住,這些部署機(jī)制是用于開發(fā)測試的,并不是用于發(fā)布應(yīng)用程序。要發(fā)布您的應(yīng)用程序并從其中賺錢涉及到更多的步驟,我會(huì)在后續(xù)文章中進(jìn)一步介紹。
結(jié)束語
設(shè)計(jì)一個(gè)移動(dòng)應(yīng)用程序意味著需要將一切想的簡單一點(diǎn)、容易一些。本期文章您學(xué)習(xí)了如何編寫一個(gè)移 動(dòng)應(yīng)用程序來響應(yīng)滑動(dòng)手勢,沒有涉及桌面或 Web 用戶的按鈕單擊。有時(shí)候,移動(dòng)設(shè)備可能會(huì)從一兩個(gè)便捷的按鈕中獲益。確保它們適合用戶之目的,我不需要為我這個(gè)超級簡單的應(yīng)用程序 Overheard Word 設(shè)計(jì)按鈕,對于大多數(shù)應(yīng)用程序用戶來說,我使用的這個(gè)手指上下滑動(dòng)導(dǎo)航比較直觀。
在本文中,我大致介紹了移動(dòng)應(yīng)用程序部署,并沒 有深入介紹測試,因?yàn)槟€沒有部署一個(gè)產(chǎn)品應(yīng)用程序。多數(shù)用戶不會(huì)安裝沒有信譽(yù)的應(yīng)用程序,這就是許多成功的應(yīng)用程序都通過中間機(jī)構(gòu)(比如 Google Play、iTunes App Store 或 Amazon Appstore for Android)來發(fā)布的原因。在這篇文章中,我詳細(xì)介紹了滿足應(yīng)用程序商店安全標(biāo)準(zhǔn)的流程,該流程只需要很少幾步,比簽署您的應(yīng)用程序要簡單得多。重要 的是當(dāng)您的應(yīng)用程序被大經(jīng)銷商發(fā)布后,它會(huì)變成全世界可用。
網(wǎng)頁名稱:面向大眾的移動(dòng)技術(shù): 在 Android 中為手勢編碼
網(wǎng)站URL:http://www.fisionsoft.com.cn/article/copgidi.html


咨詢
建站咨詢
