• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2008年11月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經典c++博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            原文地址:http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx
            在蘇聯的谷歌,你的界面呈現

            在移動 UI 架構開發的混戰中, Android 上升到首位。如果你有一些移動體驗,你會發現它是一個 Java ME 的 Canvas / Screen 對象和 BREW 構建階層的完美組合,通過一些 XML 布局工具啟動。每項活動被放置在屏幕堆棧,當它從您的應用程序啟動。 Android 是已經被配置處理關閉當前的活動,并激活它的下一個活動,當你要求或當用戶按下 Back 。此設置允許您認為每個作為一個屏幕基地活動。

            每一項活動都可能包含不同的視圖和視圖組在一個層次樹。你可以想像這樣一個帶有視圖組的樹,布局對象作為樹干和樹枝(因為視圖組對象可以強制轉換成對象),將視圖或部件作為樹葉。單一 view ,在其最基本的形式,是一個可以拖拽的矩形。一個視圖組,在其最基本的形式,是一個包含一個或多個視圖的對象。這個對象層次結構允許您布置復雜的用戶界面,而不必經歷計算視圖矩形和組建重疊的錯誤過程。如果,另一種方法,這種事是你的袋子, Android 將退出的方式,讓您呈現通過 Java ME 方法手繪游戲畫布。

            在本章中,你就會開始基本的基于 XML-based 屏幕布局,轉移到更復雜的自定義畫布上繪制。為了本書,我會分解并討論視圖作為三個主要食物群:

            Ø        XML-defined widgets/views and view groups : 良好的基本信息顯示和菜單

            Ø        Android native views : TextViews, LayoutGroups, ScrollBars, and text entry

            Ø        Custom views : 游戲程序員最好的朋友

            您將開始一個示例登錄屏幕,并操縱和鋪設移動出部件和代碼的意見,最終使一個交互式動畫與自定義視圖。

            方便、快速的 XML 布局

            首先,使用 XML 的布局開始看似簡單,但它會很快變得復雜。您將開始與你的布局和工作方式到的各個元素。

            布置

            大多 XML 屏幕將被封裝在一個布局對象。布局對象來在許多不同的口味,每一個你看看實在是太快,然后檢查了以下幾節簡單的例子了。

            注意:在編譯時,這些 XML 配置文件解析和 Android 包裝成一個緊湊的二進制格式。這樣可以節省解析可怕的啟動時間上的數額。但是,它意味著 XML 文件無法通 過您的代碼在運行時改變。更具體地說,您可以在執行過程中改變這些 XML 文件,但它會完全沒有應用程序的布局。此外,您必須支付夸大一個視圖或從 XML 視 圖組一小性能價格。您的里程可能會根據 CPU 負載和用戶界面的復雜性。

            LinearLayout

            所有元素被排列成遞減的列,以在一個從上到下或從左到右的方式。每個元素可以有重力和體重的屬性記,設置如何動態增長和縮小,以填補空間。元素自己排列成行或列的標示基于參數: android:orientation 。 For example (see Figure 3-1):

            <LinearLayout xmlns:android=

            "

            android:orientation="vertical"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element One"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Two"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Three"

            />

            </LinearLayout>

            RelativeLayout

            每個子元素的布局是與子元素有關的。這種關系的建立使得在上一個子元素結束的地方元素才開始。子元素可以只涉及那些所列內容的面前。因此,建立從 XML 文件開始到結束的依賴。請注意, ID 是需要的,以便部件可以互相引用。例如(見圖 3-2 ):

            <RelativeLayout xmlns:android=

            "

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            <TextView

            android:id="@+id/EL01"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element One"

            />

            <TextView

            android:id="@+id/EL02"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Two"

            android:layout_below="@id/EL01"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Three"

            android:layout_toRight="@id/EL02"

            />

            </RelativeLayout>

            AbsoluteLayout

            每個孩子有一個一個特定的位置,必須在父母布局對象的范圍內。 AbsoluteLayout 對象可能是最容易建立和可視化,但最難遷移到新的設備或屏幕尺寸上。例如(見圖 3-3 ):

            <AbsoluteLayout xmlns:android=

            "

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element One"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Two"

            android:layout_x="30px"

            android:layout_y="30px"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Three"

            android:layout_x="50px"

            android:layout_y="50px"

            />

            </AbsoluteLayout>

            TableLayout

            TableLayout 是一個布局對象,允許您指定表中的行。 Android 試圖安排進入正確的行和列的每一個子元素。例如(見圖 3-4 ):

            <TableLayout xmlns:android=

            "

            android:layout_width="fill_parent"

            android:layout_height="fill_parent">

            <TableRow>

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element One A"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element One B"

            />

            </TableRow>

            <TableRow>

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Two A"

            />

            <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Element Two B"

            />

            </TableRow>

            </TableLayout>

            這些是主要布局對象,你將來會遇到。每個例子有幾個簡單的 TextView 元素,為每種布局類型示范布局怎樣起作用的,同時一幅屏幕捕獲每個 XML 文件將呈現。你可以在 Android 的文件更徹底的實例 http://code.google.com/android/samples/ApiDemos/src/com/google/android/samples/view/ 。
            注意:如果您是移動開發方面的新手,當決定如何布置您的應用程序時,您必須重復你的頭一個座右銘: “ 移植,移植,移植。 ” 理想情況下,一個布局的設計將所有可能的工作設備。事實上,這永遠不會奏效。如果你運行應用在多個電話上(如大多數運營商要求您這樣做),將重點放在動態的,相對的布局結構。我保證,你的屏幕大小今后將以一種戲劇性的方式變化。減少絕對值 X/ Y 的數量,并保留那些你在方便使用找到的位置 .

            接下來的任務是找到所有放置在一個布局元素,相關子元素的列表。這種資源是可以在紛繁復 雜表格 http://code.google.com/android/reference/android/R.styleable.html # Menu 。

            從那里,你可以嘗試第一個 UI 任務:在為 “ 社交 ” 應用程序的登錄屏幕。這登錄屏幕將成為 getSplashy 示例應用程序的一部分。

             

            滾動、文字輸入、按鈕,以及所有在生活簡單的事情

            現在是時候使用布局的一個類。 XML 的布局是完美的,在用戶輸入,信息傳遞,以及幾乎任何屏幕的內容是相對靜態地方。您將添加一個簡單的登錄屏幕顯示前面提到的 “ 社交 ” 申請表(見代碼清單 3-1 )。第一項任務是來描述屏幕看起來的樣子在一個新的視圖中。您可以使用線性布局,使您可以只垂直地添加小工具。(請注意,這個 XML 需要 general_bg 圖片和聲明字符串被定義在 res 文件夾中。為此,從有關詳細信息, Apress 網站下載該項目的一章。)

            Code Listing 3-1. /res/layout/login.xml

            <ScrollView xmlns:android=

            "

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:scrollbars="vertical">

            <LinearLayout

            android:orientation="vertical"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            android:background="@drawable/general_bg"

            <TextView

            android:text="Login Screen"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:textAlign="center"

            />

            <TextView

            android:text="Username:"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            />

            <EditText

            android:id="@+id/username"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            />

            <TextView

            android:text="Password:"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            />

            <EditText

            android:id="@+id/password"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            />

            <Button

            android:id="@+id/loginbutton"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="Login"

            />

            <TextView

            android:id="@+id/status"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:textAlign="center"

            android:text="Enter Username and Password"

            />

            <TextView

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="@string/disclaimer"

            />

            </LinearLayout>

            </ScrollView>

            我將從原來的列舉中撤出一些具體的線條并且解釋他們的作用在下面部分。注意,你沒有定義組成這個屏幕元素的任何位置。但是,因為您使用的是 LinearLayout 對象,每個連續的元素附加到以前的元素的底部。

            Scrolling

            滾動一個超過你設備屏幕大小的視圖,你只是需要在 ScrollView 中封裝你的布局對象。為了使用垂直滾動條,你的 ScrollView 必須設置參數 android:scrollbars="vertical" ,當你向下翻屏時,將顯示一個滾動條。為了使視圖足夠長以說明這個對象,我已經添加 TextView 作為假聲明在線性布局結束處。你會發現,如果你設置原來的 XML 為活動視圖,重點將是向下移動的對象,直到到達的按鈕,此時滾動條將處理鍵和向下移動用戶文本的底部。

             

            窺探 TextView

            兩個主要 “ 構件 ” 工作在原來 XML.

            注意:在 Android 中的一個小部件是指任何獨立視圖對象的子類。

            為了標題和文本輸入標簽,使用 TextView 對象。對于用戶控制的文字輸入,使用 EditText 對象。最顯著的,因此,特別值得詳細描述的是最后的 “status” 的文本:

            <TextView

            android:id="@+id/status"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:textAlign="center"

            android:text=”Enter Username and Password”

            />

            首先,由于本書內容將被修改在某個時候,通過你的代碼在運行的時候,所以你需要給它一個 ID 。這允許您使用 findViewById 方法后獲得。

            @+id/status 將添加到您的 ID 狀態在 R.java ,如果文件不存在了。這一點,你的 IDE 可能會錯誤當您在代碼中引用它第一次。不要懼怕,但因為是第一次編譯,將全部解決了。

            接下來,您用 TextView 設置其寬度達到其父類的寬度在這種情況下, LinearLayout 對象。你告訴它讓它的高度是由文字大小范圍內使用的 layout_height 參數 wrap_content 。您希望文字居住在屏幕的中心,因此您使用 textAlign ,因為你已經設置其寬度為整個屏幕。最后,您給它一些簡單的文字顯示在活動開始了。后來,你會改變這一案文以反映當前的狀態。

            看到這個手藝的結果,只需創建活動,并設置這個 XML 的布局是主要內容視圖。您應該能夠看到屏幕上,在文本輸入字段的類型,并選擇框。這些行動,但是不會有任何結果。為配合該計劃將他們,讓他們互動你就必須繼續閱讀。

             

            XML 的布局

            我們深刻體會了 XML 的布置方案既簡單又強大。它提供了一個非編程接口的移動屏幕布局和設計。它給開發人員提供了工具去破解打開和修改運行時的飛行這些值,你會做探討如何相互作用現在 Android 的內置部件。

            喚醒構建

            我已經說明了如何使用 Android 的 TextView , button 和 EditText 部件。但如何有用的是一個文本輸入字段,如果你不能攝取你的用戶已經進入? 這是一個反問,不要回答,我不能聽你(我希望)。答案是顯而易見的:沒有目的和結果文本輸入是沒有用處的。要訪問您的 EditText 部件先前定義的內容,你就必須做兩件事:

            1 。獲取一個您在 XML 定義部件的對象句柄。

            2 。監聽點擊或選擇事件在 Login 按鈕部件上。

            獲取的事情句柄

            第一個任務就是得到一個在您的 XML 配置文件中定義的元素指針。要做到這一點,你會確保您要訪問的每個 XML 部件有一個 Android : ID 參數。正如前面簡單提到,使用符號 @+id/-id_name_here- 將確保您的 R.java 文件有你需要的 ID 。以下是如何獲得一個視圖對象指針,當您的應用程序啟動時。在新的登錄活動中,這是 OnCreate 方法,被添加到 GetSplashy 示例應用程序:

            Button btn = null;

            public void onCreate(Bundle args)

            {

            super .onCreate(args);

            setContentView(R.layout.login );

            btn = (Button) findViewById(R.id.loginbutton );

            }

            在這里,您已經獲得了登錄按鈕的指針,通過調用 findViewById 。這使您添加單擊監聽,會通知您當按鈕被選中(在手寫筆觸摸屏)或選定中心軟鍵。您將擴展 ClickListener 類的內聯函數如下:

            public class loginScreen extends Activity

            {

            private OnClickListener buttonListener =

            new OnClickListener()

            {

            public void onClick(View v)

            {

            grabEnteredText();

            }

            };

            ...

            }

            當一個選擇通知發生,以前的內聯函數定義調用 grabEnteredText 方法。現在你已經定義的點擊偵聽器,您可以使用 btn 對象在 OnCreate 方法中:

            public void onCreate(Bundle args)

            {

            //...

            btn = (Button) findViewById(R.id.loginbutton );

            btn.setOnClickListener(buttonListener);

            }

            如果您放斷點您的按鈕監聽的 onClick 方法中,斷點開火當您移動焦點并選擇登錄按鈕,當您用鼠標點擊它在運行模擬器中。

            繅絲在文本

            現在剩下要做的就是定義 grabEnteredText 來做到這點,正如它名字的含義。在登錄屏幕的最終產品的版本,您要提取輸入的文本,開始一個網絡登錄的調用,發動一個載入對話框?,F在,你只顯示一個對話框,包含在登錄名和密碼域中輸入的內容。下面 grabEnteredTex 的樣子在更新的登錄活動:

            public void grabEnteredText()

            {

            //Get a pointer to the status text

            TextView status =

            (TextView) findViewById(R.id.status );

            //Grab handles to both text-entry fields

            EditText username =

            (EditText) findViewById(R.id.username );

            EditText pwd =

            (EditText) findViewById(R.id.password );

            //Extract Strings from the EditText objects

            // and format them in strings

            String usrTxt = username.getText().toString();

            String pwdTxt = pwd.getText().toString();

            //HTTP transaction would spin up a

            //new thread here

            status.setText("Login" + usrTxt + " : " + pwdTxt);

            //Show dialog box that would eventually turn into

            this .showAlert("Login Data", 0, "Login"

            + usrTxt + " : " + pwdTxt, "ok!", false );

            }

             

            首先,使用 findViewById ,為了 status 、 username 、 password 部件,您檢索 TextView 和 EditText 指針。接下來,您提取 Text-Entry 構建的內容通過檢索 TextEntry 對象,并將其轉換成 String 類。最后,你把兩個字段的內容在一起,他們都加入到狀態文本對象,并彈出一個對話框還包含兩個字符串。
            這就是它 —— 現在允許用戶輸入文字,你獲取、操縱,甚至顯示一個對話框包含了該信息。干得好!花一秒鐘輕拍自己在背后,或任何胳膊可以拘著的地方。
            到目前為止,您探討如何使用 XML 來做屏幕設計,僅僅使用 “ 社交 ” 畫面屏幕。此時,你已經學會了如何使用兩個的混合體在您的登錄屏幕。最后一站關于 Android 部件表達,就需要單獨使用代碼建立屏幕布局的。

            Java 的部件

            當你看到我寫的代碼產生即使是很小的選擇菜單,你可能會像我,有點嚇呆了。等到熟悉的 XML 的屏幕布局,試圖自己用 java 動手完成這一切,會感覺像是用一對破損的保齡球演奏古典音樂。被警告,它涉及許多打字,或許不僅僅是一點挫折。

            另一方面,可能有一個用戶界面布局的具體元素,你要動態調整。因為正如我前面提到的,您不能在應用程序運行時編輯 XML 文件的布局,它必須有需要修改每一個用戶界面的代碼在運行時可能片斷的工具。 Android 給你這個動力,只要你是舒適的打字以驚人速度。
            引擎蓋下使用

            現在您可以在引擎蓋下開始小小的修補,用最基本、最直覺式的方法檢驗 Android 的構建。你已經了解一個核心部分的基本外觀,其中許多是您在 XML 形式探討。正如在前面的例子中,為了說明起見,我將保持這種基本。我已經在這里討論的界面布局,它應該很容易學以致應用到更復雜的問題。在后來,更多的高級例子,你會獲得更多的其他 Android 部件。在下面的例子中,我將盡力確保使用很少你從前依賴沒有的 XML 元素。它應該給你一個機會,獲得良好的處理非 XML 布局,但要記住,實際上,你必須是瘋狂的做所有的用戶界面,這種方式。

            主菜單

            幾乎所有的移動應用,至少在發行時,首先是圖形主菜單。這個圖形屏幕引導用戶執行移動應用的各種功能。因為 “ 主菜單 ” 的概念是如此普遍的移動應用體驗,它使一個很好的和實際的案例研究。在這個例子中,你的目標是將一個簡單功能主菜單的放在一起。為了便于比較,你會使用其他的線性布局, 把一切融合在一起。這個例子將建立在三個主要階段:

            1 。布局:你會在屏幕上正確地安排所有的主菜單項。當然,這將只使用 Android 的大屏幕版面上的一小部分。但是,大多數應用程序菜單將使用大型圖形,承擔著更多的空間。

            2 。焦點:您需要建立一個焦點結構,使用戶可以通過元素移動。當焦點移動時,你必須調整每個菜單元素的顏色。

            3 。選擇活動:最后,您需要建立一個監聽,以便當一個元素被選中或單擊,你知情和可以在選定的項目基礎上采取適當行動。

            當您完成所有這些任務的三個,你應該有建立主要輸入屏幕的框架,這大約占整個移動應用的百分之 80 的工作。雖然不完全現實(即,我已經完全使用 XML 的零),它是極好示范,如何做事情以自定義運行時的驅動方式。當您添加更多的功能在你的 “ 社交 ” 應用程序中,您填寫此主菜單將更加完善。

            布局, Java 風格

            在簡單主菜單上的第一步是得到所有在屏幕上的菜單元素。正如我剛才所說,你將采用線性布局完成它。您需要在申請前做這一切提請第一次,所以就必須在新的 MainMenu 活動的 OnCreate 方法中。 (請參閱第 1 章,如果你忘記了如何創建并插入一個新的活動。)代碼清單 3-2 顯示了它的實例化和配置的模樣。

            LinearLayout layout = new LinearLayout(this );

            layout.setBackground(R.drawable.general_bg );

            layout.setOrientation(LinearLayout.VERTICAL );

            layout.setLayoutParams(

            new LayoutParams(LayoutParams.FILL_PARENT ,

            LayoutParams.FILL_PARENT ));

            setContentView(layout);

            之后,您通過什么迄今為止,這在概念上似乎應熟悉。您可以設置背景使用在 /res/drawable/ 文件夾中的圖片,設置線性布局為垂直方向,并設置 LayoutParams 以填補父親(在這種情況下,父親是活動,控制全屏幕)。布局參數,在他們的基地,必須界定規定部件的高度和寬度。正如您后來可能會發現,在前布局參數設置之前試圖放入一個部件在 ViewGroup 里,將拋出一個異常。但是,現在你有一個布局對象來填充,你可以開始建立了屏幕。

            添加標題

            接下來,添加一個簡單的標題,在你的主菜單畫面上方將為本。代碼清單 3-3 顯示的代碼塊,您需要它。

            Code Listing 3-3. Adding the Title

            TextView title = new TextView(this );

            title.setText(R.string.man_menu_title );

            title.setLayoutParams(

            new LinearLayout.LayoutParams(

            LinearLayout.LayoutParams.FILL_PARENT ,

            LayoutParams.WRAP_CONTENT ));

            title.setAlignment(Alignment.ALIGN_CENTER );

            layout.addView(title);

            創建文本對象,并設置文本在 /res/values/strings.xml 中 。我知道我說我不會用任何 XML ,但我恐怕我會對此有些撒謊。在開發中,您需要將所有的字符串移到這個位置,而不是在代碼中定義。如果你的客戶是像我這樣,你就不會想拉你的源代碼編輯器并重新編譯每次他們想改變對 screens.Now 之一的措詞,你有一個標題,是時候添 加更多有趣的和積極的菜單元素。
            鋪設菜單項
            現在您可以添加單個菜單元素。因為這將是第一個在相當重復,我將插入和解釋的第一個元素,但其余的留給你的你自己的設備。隨意抓取在 Apress 網站的完整項目,看到菜單項休息。同樣地,你會填補他們更為您通過 Android 要素各地的發展。
            代碼清單 3-4 顯示的代碼添加單個菜單項。

            Code Listing 3-4. Adding a Menu Item

            TextView ItemOne = new TextView(this );

            ItemOne.setFocusable(true );

            ItemOne.setText("Login Screen");

            ItemOne.setTextColor(Color.WHITE );

            ItemOne.setLayoutParams(

            new LinearLayout.LayoutParams(

            LinearLayout.LayoutParams.FILL_PARENT ,

            LayoutParams.WRAP_CONTENT ));

            //Give the menu item an ID for tracking reasons.

            //The ID is a static int defined locally to the class

            ItemOne.setId(IdOne );

            //Add it to our linear layout

            layout.addView(ItemOne);

             

            天哪,你可能認為在仔細閱讀代碼,這看起來就像你已經添加標題。你完全正確,多么聰明的 you.The 的一個對象時表明的焦點是,當它被選中繁重還沒有到,所以不要太自大還。下面是與以前的菜單項,上面列出的標題文字有差別:

            Ø         你需要告訴 TextView 它可以接受的方法調用 setFocusable 焦點。

            Ø         菜單上市項目將需要身份證,因此您可以區別開來,在選擇處理程序菜單元素的其余部分。

            正 如我剛才簡單,只要增加一個小部件到 ViewGroup 的 LayoutParams 對象必須明確這一觀點內組定義的對象。例如,在過去 setLayoutParams 方法調用,你必須通過在 LinearLayout.LayoutParams 對象。你必須通過正確的子類的布局參數,或機 器人將你扔在運行時異常。

            正如我以前說過,為了使菜單,我將添加兩個文本元素幾乎完全一樣,以前上市。為貪方便,我不會在這里一一列舉。一定要參照整個項目,以滿足你的好奇心?,F在,你把所有的菜單項到位,是時候對其進行修改時,接收或失去焦點

            焦點年輕的草蜢 ... 。
            為了處理焦點改變事件,你必須創建一個 OnFocusChangeListener 抽象類的實現。該示例的版本,在主菜單內定義類的活動在當地,將類似于代碼 3-5 。

            Code Listing 3-5. Creating a Focus Listener

            OnFocusChangeListener focusListener =

            new OnFocusChangeListener()

            {

            public void onFocusChanged(View v, boolean hasFocus)

            {

            adjustTextColor(v, hasFocus);

            }

            };

            private void adjustTextColor(View v, boolean hasFocus)

            {

            //Dangerous cast. Be sure you are

            //listening only to TextView focus changes

            // or this could go horribly wrong.

            TextView t = (TextView)v;

            if (hasFocus)

            t.setTextColor(Color.RED );

            else

            t.setTextColor(Color.WHITE );

            }

            此外,您必須添加以下行對應于每個菜單中選擇元素附加焦點更改偵聽器對象:

            ItemOne.setOnFocusChangeListener(focusListener);

            隨 著地方聽眾,您現在每次通知一個菜單要素收益或失去焦點。在更先進的主菜單,這個方法可以增加地方的形象轉變,動畫,三維爆炸或其他奇才邦圖形效果。在這 個例子中,您將不得不滿足于僅僅改變文字的顏色?,F在,用戶可以告訴通過顏色的變化,其中菜單項,突出顯示,您需要的時候作出反應,他們按中心鍵選擇一個 項目。

            提示:它可能通過使用 setTextColor ( ColorStateList 顏色)方法,該方法是貫徹落實文本簡單的方式為基礎的主要 menu.There 一個 TextView 重點,沒有重點,并選定顏色總是很多方法可以實現一個目標,一個很好的 IDE 中,我只是選擇了更通用的(因為我 希望你的應用超越文本菜單)。有關使用 setTextColor 信息,請參閱文件 Android 在 http://code.google.com/android /reference/android/widget/TextView.html # setTextColor (整型)。

            單擊并選擇活動
            你已經看到如何登記在 oginscreen onClick 事件,所以你應該能夠通過這一節 withouttrouble 的微風。代碼清單 3 月 6 日 顯示了示例代碼獲取選擇的事件。

            Code Listing 3-6. Adding a Selection Listener

            OnClickListener clickListener = new OnClickListener()

            {

            public void onClick(View v)

            {

            String text = "You selected Item: ";

            switch (v.getId())

            {

            case IdOne :

            text += "1";

            startActivity(

            new Intent(MainMenu.this, Login.class));

            break;

            case IdTwo :

            text += "2";

            startActivity(

            new Intent(

            "com.apress.example.CUSTOM_VIEW"));

            break;

            case IdThree :

            text += "3";

            break;

            }

            //We'll get to the following line in a bit

            status.setText(text);

            }

            };

            以前的 switch 語句是調用 setID 回來的原因當您最初創建并鋪設 TextView 部件。當一個菜單項被選中或指針點擊,的 onClick 函數被調 用,并通過相應的視圖是作為參數。您將負責審查,以確定哪些菜單項被選為通過視圖 ID 。這使您可以采取的菜單中選擇適當的行動。通過這種方式,您可以切換 到先前定義的登錄屏幕,你即將會與 startActivity 方法調用寫入自定義視圖。

            還是有留下的一小步,如果你在示例代碼中的 onCreatefuction 的底部,你會點它。你需要添加一個點擊監聽到視圖。下面是應該運行在你建立的部件清單行:

            ItemOne.setOnClickListener(clickListener);

            回顧
            回顧 Java 驅動的主菜單,你做到了幾個重要 things.First ,您執行功能以前只能通過 XML 文件的布局。雖然不完全切合實際的做一方面,它會給你足夠的工具來改變和定制應用程序的同時運行 XML 視圖。
            第二,你注冊為您的所有菜單項的焦點改變事件。當焦點更改偵聽叫,你改變了重點項目,以突出顯示它的顏色。在實際應用中,要達到同樣的事情更有效的方法,但我假設你想改變的東西代替文本顏色多,可以說,奢華。
            第 三,你學會了如何傾聽和作出反應的選擇事件,洞悉項目選中,并采取適當的行動是 selection.Again 基礎上,對所有需要將重點放在手屏幕小部件 出代碼,往往是相當昂貴,但是使用你剛剛學到的工具,你可以修改,增加,以及自定義菜單或工程清單數據和用戶偏好為基礎,同時應用程序正在運行。但是,如 果您需要獲得更多的專業如何繪制到屏幕上,你需要較少微妙和更代碼重的方法。

            自定義用戶界面渲染的畫布

            這 是你出芽部分游戲開發商一直在等待 for.Android 允許你定義一個自定義視圖對象只是通過擴展視圖類和執行 OnDraw 方法。為了演示自定義視圖在 動畫循環中運行,我已經從舊金山市的探索展示一些啟示我們如何看待動畫和聲音。您可以在 http://www.exploratorium.edu /listen/index.php 更多關于博物館和有關的展覽。你可以購買 http://www.nature.com/neuro/journal /v7/n7/full/nn1268.html 科學白皮書。
            這個例子將動畫兩個球對對方旅游,然后或者或彈跳和移動距離通過。這個例子是為了表明反彈聲音可以看到之間的傳遞對象,看他們相互彈球人的區別。代碼方面,我將演示了一個自定義視圖幾個重要方面:

            Ø         實施意見的 Android

            Ø         繪制到屏幕上使用 Canvas 對象

            Ø         創建動畫循環

            Ø         修改,并從活動自定義視圖交互

            自定義視圖
            您 可以自定義在兩個方面視圖窗口。第一,是將 View 類。這使您可以通過滾動自己創造一個 android.View 可行的子類的 “ 工具 ” 。另一種方法,您就 必須對自己的探索,是子類,如 TextView ,進度條,或 ImageView 和修改其行為受保護的方法使用現有的部件。這個例子顯示了第一個選擇,因為 它的范圍廣泛,比較容易理解。
            在最基本的層面,一個自定義部件重寫保護 OnDraw 方法。代碼清單 3-7 顯示了這樣一個方法的一個示例。

            Code Listing 3-7. Simple Custom View Declared in the

            CanvasExample Activity

            protected class CustomView extends View

            {

            public void onDraw(Canvas canvas)

            {

            Paint p = new Paint();

            p.setColor(Color.WHITE );

            canvas.drawText("Yo!", 0, 25, p);

            }

            }

            祝賀!輸入文字這幾句,你現在是自己的自定義部件驕傲的所有者。當然,它只是打招呼,像我 17 歲朋克表妹,但我想你必須從某個地方開始。對于那些你在與 GameCanvas 的經驗對象的 Java ME ,這應該很熟悉。要接收 OnDraw 中呼叫,您需要設置作為樣本活動的主要內容查看。你必須儀式代碼,將實例化,并使其成為當前視圖。代碼清單 3-8 顯示了 CanvasExample 活動的外觀。

            Code Listing 3-8. Activating a Custom View

            CustomView vw = null;

            public void onCreate(Bundle args)

            {

            super .onCreate(args);

            vw = new CustomView(this );

            setTitle("Bounce or Pass, sounds changes everything");

            setContentView(vw);

            }

            你為你的樣品活動的名稱,因為你沒有給它一個應用程序的名稱。然后,它只是一個創建新 CustomView 對象,并設置它為當前內容視圖的問題。這將調用 您的自定義部件內的 OnDraw 方法,并顯示您的有點不合常規的問候。您現在有一個掌握在非?;镜睦L畫方式到屏幕上。您現在應該可以進入更復雜的渲染和 動畫的循環開始。
            創建游戲循環
            由于所有游戲程序員會告訴你,大多數游戲,其核心,一個不斷循環 onsist 。用戶輸入的循環檢查,并 在此輸入和任何其他游戲行動,屆時將制訂新的框架 / 幀在您的示例應用程序 screen.The 循環將不會贏得的復雜性和獨創性的任何獎項,但它會得到你開 始自己的 amerendering 循環。

            注 意:如果你想實現自己以外的瀏覽自己的動畫循環 / ViewGroup 層次,并建立與 SurfaceView 循環研究對象。你可以找到這一 http://code.google.com/android /reference/android/view/SurfaceView.html 對象文件。

            加載音頻和圖像
            在您將繪圖 CustomView 得到,您需要加載初始化稍后將用于一些資源。代碼清單 3-9 顯示了新的構造 CustomView 包括局部類變量聲明。

            Code Listing 3-9. Initializing the CustomView

            protected class CustomView extends View

            {

            Context ctx;

            Paint lPaint = new Paint();

            int x_1=0,y_1=0;

            MediaPlayer player = null;

            Bitmap ball = null ;

            boolean running = true ;

            CustomView(Context c)

            {

            super(c);

            player = MediaPlayer.create (c, R.raw.bounce );

            BitmapDrawable d = (BitmapDrawable)

            getResources().getDrawable(R.drawable.theball );

            ball = d.getBitmap();

            ctx = c;

            }

            ...

            }

            在構造函數中,你通過 R.java 裝載常數的反彈媒體資源從 / 水庫 / 原始位置的文件。因為你做了幾個其他資源類型此之前,你應該是一個老手了。您還需要加 載一個,將作為 “ 球得出的形象。 ” 你這樣做的資源管理器使用對象,這是從上下文對象 etrieved 。雖然你沒有明確從資源加載位置之前的形象,這好像幾 乎任何其他資源負載的代碼。

            實施環,實施循環,實施 ...
            事不宜遲,代碼清單 3-10 顯示了 CustomView 對象的 OnDraw 方法樣子。

            Code Listing 3-10. The Core of the Animation Loop

            public void onDraw(Canvas canvas)

            {

            //Draw the white background

            Rect rct = new Rect();

            rct.set(0, 0,

            canvas.getBitmapWidth(),

            canvas.getBitmapHeight());

            Paint pnt = new Paint();

            pnt.setStyle(Paint.Style.FILL );

            pnt.setColor(Color.WHITE );

            canvas.drawRect(rct, pnt);

            //Increment the X and Y value for the sprites

            x_1+=2;

            y_1+=2;

            //Reset the loop when the balls drift offscreen.

            if (x_1 >= canvas.getBitmapWidth())

            {

            x_1 = 0;

            y_1 = 0;

            }

            //Draw ball 1

            drawSprint(x_1, y_1, canvas);

            //Draw ball 2

            drawSprint(canvas.getBitmapWidth() - x_1, y_1, canvas);

            if (running)

            invalidate();

            }

            從頂部開始,您的第一個白色的背景使用 paintstyle 對象和調用 canvas.drawRect 。油漆對象,結合 Rectangle 對象,將告訴畫 布畫一個白色盒子,覆蓋整個屏幕。接下來,您將遞增 x 和你的球 Sprite 的 y 值。然后,您需要重新設置他們,如果他們已經漂過去屏幕的范圍,并最終繪制 用自己的 drawSprite 給他們打電話。代碼清單 3-11 顯示了該函數的內容。

            Code Listing 3-11. Drawing a Bitmap

            protected void drawSprint(int x, int y, Canvas canvas)

            {

            canvas.drawBitmap(ball, x, y, lPaint);

            }

            這個功能,現在,只是一個簡單的調用 drawBitmap 方法。我已經分離出來,這種方法只是因為繪制在另一場合雪碧可能需要比這個簡單的例子功能。最 后,回到 OnDraw 函數,你會打電話給你的只有無效運行標志是真實的。調用無效的看法是 Android 的強迫重繪的首選方式。在這種情況下,您自己無效,這將調 用 OnDraw 中,整個過程中,再度開始。如果你簡單地設置運行的標志虛假暫?;蛲顺龊蜔o效時再恢復它的動畫應該留在同其母公司活動的重點步驟。

            添加和控制聲音
            由于聽覺錯覺需要能夠打開和關閉兩個反彈互相對象聲音,您需要設置音頻比賽,他們打,然后為用戶建立一個機制,把這一聲音的和關閉。
            要 播放的音頻,在代碼中添加代碼清單 3 月 12 日 到以前的 OnDraw 函數,因為它也實際上,游戲控制回路。當我說 “ 游戲循環, ” 我指的是無效呼叫在 OnDraw 中結束,將設立一個重繪 Android 的 UI 事件循環。請記住, playSound 是一個布爾宣布 326-7524 自定義視圖。

            Code Listing 3-12. Playing and Reloading Audio

            if (playSound &&

            canvas.getBitmapWidth() - x_1 -16 == x_1 + 16)

            player.start();

            if (x_1 >= canvas.getBitmapWidth())

            {

            x_1 = 0;

            y_1 = 0;

            player.stop();

            player.release();

            player = MediaPlayer.create (ctx, R.raw.bounce );

            }

            正如您可能已經注意到,你開始音頻播放時,小精靈, 16 像素遠離對方。這是一個沒有行賄的時間,讓音頻開始。我要指出,這更加證明我不能編輯音頻文件而不 是針對一個缺乏效率的音頻負荷和 Android 播放時間。您還必須確保以播放音頻只有 playSound 布爾是真實的。這個變量是一類的活動在其中自定義視圖定義 的成員。使用此布爾,你會得到了來自內部的屏幕活動自定義視圖類的控制。要打開和關閉音頻,您現在只需實施
            在代碼的方法,在活動清單 3-13 。

            Code Listing 3-13. Reacting to Key Events

            public boolean onKeyDown(int key, KeyEvent kc)

            {

            if (key == KeyEvent.KEYCODE_DPAD_CENTER )

            {

            playSound = !playSound;

            return true;

            }

            return super.onKeyDown(key, kc);

            }

            此代碼應類似于你如何駁回了在第 2 章惡作劇的應用。

            把它同在一起
            如果您已經按照一直密切(或欺騙,只是下載完成的項目),您應該能夠運行應用程序,看的幻覺。新聞中心方向鍵打開和關閉音頻。與音頻 起飛,它應該像他們通過互相進行表決,看起來他們反彈,即走各的路。在這個例子中,我演示了如何創建自己的視圖類,如何用它來畫在屏幕上,如何建立一個游 戲渲染循環,以及如何控制,簡單的循環利用關鍵事件。
            使用用戶界面
            在本章中,您已經了解,詳細,如何布局屏幕使用 Android 的 XML 架構,以及如何相互作用和修改了一些 Java 的 code.Next 運行的模式,學習了如何 UI 部件布局和視圖組使用源碼單。這是一個不那么實際應用 的 Android 用戶界面工具,但重要的是去理解的但為了通過。最后,您探索建設 gamerendering 循環的重要工具。您加入到把一些簡單的多媒體和用戶控 制,創建了一個簡單的聽覺幻想,應該讓 yourvery 討厭鬼的朋友。

            提示:使用所有你學到了在本章中,建立這種幻想,它包含了一些說明文字,以及邊界使用 XML.When 活動開始了一個框架,但呈現的 XML 插入到適當的位置自定義視圖。對于這項任務,我建議使用的解釋,并為邊境矩形相對布局, TextView 。


            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx

            posted on 2010-05-10 20:54 漂漂 閱讀(1936) 評論(0)  編輯 收藏 引用 所屬分類: android 開發
            久久久国产99久久国产一| 国产精品9999久久久久| 久久无码国产| 欧美午夜精品久久久久免费视| 日韩精品久久久久久| 亚洲综合精品香蕉久久网| 精品一久久香蕉国产线看播放| 久久丫精品国产亚洲av| 7国产欧美日韩综合天堂中文久久久久 | 国产婷婷成人久久Av免费高清 | 亚洲乱码精品久久久久..| 久久久久亚洲爆乳少妇无 | 精品熟女少妇aⅴ免费久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久久久高潮综合影院| 久久中文字幕人妻熟av女| 亚洲第一永久AV网站久久精品男人的天堂AV | 9久久9久久精品| 色综合久久久久网| 亚洲中文字幕无码久久精品1| 精品久久久久久久久久中文字幕| 精品久久久中文字幕人妻| 久久影视国产亚洲| 91精品国产91热久久久久福利 | 久久精品黄AA片一区二区三区| 亚洲欧美一级久久精品| 中文字幕亚洲综合久久菠萝蜜| 青青青国产成人久久111网站| 久久99精品久久久大学生| 女人高潮久久久叫人喷水| 精品久久久久国产免费| 青青青国产精品国产精品久久久久 | 欧美国产成人久久精品| 亚洲国产小视频精品久久久三级 | 一本一道久久精品综合| 2022年国产精品久久久久| 精品久久久久久亚洲精品| 激情伊人五月天久久综合| 久久亚洲精品人成综合网| 久久丫精品国产亚洲av不卡| 国产精品美女久久久m|