青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 224  文章 - 41  trackbacks - 0
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

享受編程

常用鏈接

留言簿(11)

隨筆分類(159)

隨筆檔案(224)

文章分類(2)

文章檔案(4)

經(jīng)典c++博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

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

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

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

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

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

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

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

方便、快速的 XML 布局

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

布置

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

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

LinearLayout

所有元素被排列成遞減的列,以在一個從上到下或從左到右的方式。每個元素可以有重力和體重的屬性記,設置如何動態(tài)增長和縮小,以填補空間。元素自己排列成行或列的標示基于參數(shù): 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

每個子元素的布局是與子元素有關(guān)的。這種關(guān)系的建立使得在上一個子元素結(jié)束的地方元素才開始。子元素可以只涉及那些所列內(nèi)容的面前。因此,建立從 XML 文件開始到結(jié)束的依賴。請注意, 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

每個孩子有一個一個特定的位置,必須在父母布局對象的范圍內(nèi)。 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 文件將呈現(xiàn)。你可以在 Android 的文件更徹底的實例 http://code.google.com/android/samples/ApiDemos/src/com/google/android/samples/view/
注意:如果您是移動開發(fā)方面的新手,當決定如何布置您的應用程序時,您必須重復你的頭一個座右銘: “ 移植,移植,移植。 ” 理想情況下,一個布局的設計將所有可能的工作設備。事實上,這永遠不會奏效。如果你運行應用在多個電話上(如大多數(shù)運營商要求您這樣做),將重點放在動態(tài)的,相對的布局結(jié)構(gòu)。我保證,你的屏幕大小今后將以一種戲劇性的方式變化。減少絕對值 X/ Y 的數(shù)量,并保留那些你在方便使用找到的位置 .

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

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

 

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

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

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 對象,每個連續(xù)的元素附加到以前的元素的底部。

Scrolling

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

 

窺探 TextView

兩個主要 “ 構(gòu)件 ” 工作在原來 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”

/>

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

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

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

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

 

XML 的布局

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

喚醒構(gòu)建

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

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

2 。監(jiān)聽點擊或選擇事件在 Login 按鈕部件上。

獲取的事情句柄

第一個任務就是得到一個在您的 XML 配置文件中定義的元素指針。要做到這一點,你會確保您要訪問的每個 XML 部件有一個 Android : ID 參數(shù)。正如前面簡單提到,使用符號 @+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 );

}

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

public class loginScreen extends Activity

{

private OnClickListener buttonListener =

new OnClickListener()

{

public void onClick(View v)

{

grabEnteredText();

}

};

...

}

當一個選擇通知發(fā)生,以前的內(nèi)聯(lián)函數(shù)定義調(diào)用 grabEnteredText 方法。現(xiàn)在你已經(jīng)定義的點擊偵聽器,您可以使用 btn 對象在 OnCreate 方法中:

public void onCreate(Bundle args)

{

//...

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

btn.setOnClickListener(buttonListener);

}

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

繅絲在文本

現(xiàn)在剩下要做的就是定義 grabEnteredText 來做到這點,正如它名字的含義。在登錄屏幕的最終產(chǎn)品的版本,您要提取輸入的文本,開始一個網(wǎng)絡登錄的調(diào)用,發(fā)動一個載入對話框。現(xiàn)在,你只顯示一個對話框,包含在登錄名和密碼域中輸入的內(nèi)容。下面 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 構(gòu)建的內(nèi)容通過檢索 TextEntry 對象,并將其轉(zhuǎn)換成 String 類。最后,你把兩個字段的內(nèi)容在一起,他們都加入到狀態(tài)文本對象,并彈出一個對話框還包含兩個字符串。
這就是它 —— 現(xiàn)在允許用戶輸入文字,你獲取、操縱,甚至顯示一個對話框包含了該信息。干得好!花一秒鐘輕拍自己在背后,或任何胳膊可以拘著的地方。
到目前為止,您探討如何使用 XML 來做屏幕設計,僅僅使用 “ 社交 ” 畫面屏幕。此時,你已經(jīng)學會了如何使用兩個的混合體在您的登錄屏幕。最后一站關(guān)于 Android 部件表達,就需要單獨使用代碼建立屏幕布局的。

Java 的部件

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

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

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

主菜單

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

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

2 。焦點:您需要建立一個焦點結(jié)構(gòu),使用戶可以通過元素移動。當焦點移動時,你必須調(diào)整每個菜單元素的顏色。

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

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

布局, Java 風格

在簡單主菜單上的第一步是得到所有在屏幕上的菜單元素。正如我剛才所說,你將采用線性布局完成它。您需要在申請前做這一切提請第一次,所以就必須在新的 MainMenu 活動的 OnCreate 方法中。 (請參閱第 1 章,如果你忘記了如何創(chuàng)建并插入一個新的活動。)代碼清單 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 以填補父親(在這種情況下,父親是活動,控制全屏幕)。布局參數(shù),在他們的基地,必須界定規(guī)定部件的高度和寬度。正如您后來可能會發(fā)現(xiàn),在前布局參數(shù)設置之前試圖放入一個部件在 ViewGroup 里,將拋出一個異常。但是,現(xiàn)在你有一個布局對象來填充,你可以開始建立了屏幕。

添加標題

接下來,添加一個簡單的標題,在你的主菜單畫面上方將為本。代碼清單 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);

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

 

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

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

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

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

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

焦點年輕的草蜢 ... 。
為了處理焦點改變事件,你必須創(chuàng)建一個 OnFocusChangeListener 抽象類的實現(xiàn)。該示例的版本,在主菜單內(nèi)定義類的活動在當?shù)兀瑢㈩愃朴诖a 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);

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

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

單擊并選擇活動
你已經(jīng)看到如何登記在 oginscreen onClick 事件,所以你應該能夠通過這一節(jié) 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 語句是調(diào)用 setID 回來的原因當您最初創(chuàng)建并鋪設 TextView 部件。當一個菜單項被選中或指針點擊,的 onClick 函數(shù)被調(diào) 用,并通過相應的視圖是作為參數(shù)。您將負責審查,以確定哪些菜單項被選為通過視圖 ID 。這使您可以采取的菜單中選擇適當?shù)男袆印Mㄟ^這種方式,您可以切換 到先前定義的登錄屏幕,你即將會與 startActivity 方法調(diào)用寫入自定義視圖。

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

ItemOne.setOnClickListener(clickListener);

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

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

這 是你出芽部分游戲開發(fā)商一直在等待 for.Android 允許你定義一個自定義視圖對象只是通過擴展視圖類和執(zhí)行 OnDraw 方法。為了演示自定義視圖在 動畫循環(huán)中運行,我已經(jīng)從舊金山市的探索展示一些啟示我們?nèi)绾慰创齽赢嫼吐曇簟D梢栽?http://www.exploratorium.edu /listen/index.php 更多關(guān)于博物館和有關(guān)的展覽。你可以購買 http://www.nature.com/neuro/journal /v7/n7/full/nn1268.html 科學白皮書。
這個例子將動畫兩個球?qū)Ψ铰糜危缓蠡蛘呋驈椞鸵苿泳嚯x通過。這個例子是為了表明反彈聲音可以看到之間的傳遞對象,看他們相互彈球人的區(qū)別。代碼方面,我將演示了一個自定義視圖幾個重要方面:

Ø         實施意見的 Android

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

Ø         創(chuàng)建動畫循環(huán)

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

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

}

}

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

}

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

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

加載音頻和圖像
在您將繪圖 CustomView 得到,您需要加載初始化稍后將用于一些資源。代碼清單 3-9 顯示了新的構(gòu)造 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;

}

...

}

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

實施環(huán),實施循環(huán),實施 ...
事不宜遲,代碼清單 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 對象和調(diào)用 canvas.drawRect 。油漆對象,結(jié)合 Rectangle 對象,將告訴畫 布畫一個白色盒子,覆蓋整個屏幕。接下來,您將遞增 x 和你的球 Sprite 的 y 值。然后,您需要重新設置他們,如果他們已經(jīng)漂過去屏幕的范圍,并最終繪制 用自己的 drawSprite 給他們打電話。代碼清單 3-11 顯示了該函數(shù)的內(nèi)容。

Code Listing 3-11. Drawing a Bitmap

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

{

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

}

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

添加和控制聲音
由于聽覺錯覺需要能夠打開和關(guān)閉兩個反彈互相對象聲音,您需要設置音頻比賽,他們打,然后為用戶建立一個機制,把這一聲音的和關(guān)閉。
要 播放的音頻,在代碼中添加代碼清單 3 月 12 日 到以前的 OnDraw 函數(shù),因為它也實際上,游戲控制回路。當我說 “ 游戲循環(huán), ” 我指的是無效呼叫在 OnDraw 中結(jié)束,將設立一個重繪 Android 的 UI 事件循環(huán)。請記住, 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 );

}

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

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

提示:使用所有你學到了在本章中,建立這種幻想,它包含了一些說明文字,以及邊界使用 XML.When 活動開始了一個框架,但呈現(xiàn)的 XML 插入到適當?shù)奈恢米远x視圖。對于這項任務,我建議使用的解釋,并為邊境矩形相對布局, TextView 。


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

posted on 2010-05-10 20:54 漂漂 閱讀(1954) 評論(0)  編輯 收藏 引用 所屬分類: android 開發(fā)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本久久a久久免费精品不卡| 欧美中文在线视频| 蜜桃久久av一区| 久久久99精品免费观看不卡| 国产专区综合网| 久久综合久久综合九色| 另类激情亚洲| 亚洲精品乱码久久久久久日本蜜臀| 亚洲大片在线观看| 欧美 日韩 国产一区二区在线视频| 亚洲精品国精品久久99热一| 亚洲黄色天堂| 国产精品推荐精品| 久久久精品视频成人| 亚洲欧美日韩区| 国产精品一区二区久久久| 久久婷婷综合激情| 欧美成人精品| 欧美一区二区福利在线| 久久综合九色综合欧美狠狠| 99re66热这里只有精品4| 亚洲天堂免费观看| 亚洲福利国产| 亚洲一区二区视频在线| 在线看片第一页欧美| 日韩视频―中文字幕| 老色鬼精品视频在线观看播放| 亚洲乱亚洲高清| 欧美一区二区三区四区高清| 亚洲人成精品久久久久| 亚洲欧美日韩精品| 亚洲精品看片| 久久精品一区二区| 亚洲影院在线观看| 女女同性精品视频| 久久综合网络一区二区| 欧美午夜一区二区三区免费大片| 巨乳诱惑日韩免费av| 国产精品美女黄网| 亚洲人体一区| 国内精品写真在线观看| 亚洲私人黄色宅男| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲日本成人| 在线成人www免费观看视频| 一区二区日韩精品| 亚洲精品五月天| 久久综合九色欧美综合狠狠| 久久精品一区二区三区四区| 国产精品99一区二区| 亚洲高清在线精品| 在线观看亚洲精品| 久久大香伊蕉在人线观看热2| 一区二区三区四区在线| 久久久久久亚洲精品不卡4k岛国| 香蕉久久夜色精品国产使用方法| 欧美精品在线免费播放| 亚洲经典一区| 亚洲国产精品www| 噜噜噜躁狠狠躁狠狠精品视频| 久久精品一区二区三区中文字幕| 国产精品第一页第二页第三页| 亚洲人成在线观看| 一区二区三区高清视频在线观看| 蜜桃av久久久亚洲精品| 亚洲电影免费| 亚洲精品你懂的| 欧美精品激情| aa国产精品| 午夜日韩激情| 国产一区二区三区视频在线观看| 亚洲欧美日韩国产综合在线| 欧美在线视频免费| 国产一区99| av成人毛片| 亚洲精品女人| 亚洲级视频在线观看免费1级| 久久嫩草精品久久久精品| 免费久久精品视频| 日韩视频―中文字幕| 欧美日韩国产综合视频在线| 亚洲最新合集| 久久久久久久91| 亚洲日本在线观看| 欧美日韩另类丝袜其他| 亚洲一线二线三线久久久| 久久一区视频| 99天天综合性| 国产丝袜美腿一区二区三区| 国产一区二区三区高清在线观看| 欧美mv日韩mv国产网站app| 亚洲国产日韩一区二区| 欧美日韩性生活视频| 亚洲淫性视频| 欧美黄色视屏| 欧美一区深夜视频| 亚洲国产精品久久久久秋霞蜜臀| 欧美日韩福利视频| 欧美专区亚洲专区| 91久久黄色| 久久久一区二区三区| av不卡在线| 国模精品一区二区三区| 欧美日产在线观看| 久久精品一区蜜桃臀影院 | 亚洲欧美日韩精品在线| 在线免费高清一区二区三区| 欧美日韩亚洲在线| 狼人天天伊人久久| 亚洲欧美三级在线| 最新69国产成人精品视频免费| 亚洲欧美在线aaa| 亚洲精品久久嫩草网站秘色| 国产欧美一区二区三区沐欲| 欧美丰满高潮xxxx喷水动漫| 欧美一级专区免费大片| 一区二区激情| 亚洲人体1000| 欧美黑人在线播放| 免费看黄裸体一级大秀欧美| 亚洲欧美日韩中文视频| 日韩视频一区二区三区| 伊人夜夜躁av伊人久久| 国产午夜精品久久久久久久| 欧美日韩在线视频一区二区| 久久婷婷蜜乳一本欲蜜臀| 国产精品高精视频免费| av成人免费在线| 亚洲成色www8888| 久久婷婷综合激情| 欧美一区二区三区在线| 亚洲无线视频| 亚洲校园激情| 亚洲一区二区三区免费观看| 亚洲精品国产精品国产自| 亚洲第一搞黄网站| 在线欧美小视频| 一区二区三区在线免费视频| 国内外成人在线视频| 国产毛片一区二区| 国产人成一区二区三区影院| 国产精品久久久91| 欧美午夜宅男影院在线观看| 欧美另类一区二区三区| 欧美区高清在线| 欧美日韩成人免费| 欧美日韩一区在线| 久久久精品2019中文字幕神马| 久久精品国产亚洲一区二区| 亚洲欧美日本伦理| 欧美一区二区国产| 欧美国产乱视频| 国产精品永久在线| 亚洲香蕉成视频在线观看 | 国产精品久久看| 99在线热播精品免费| 亚洲欧美综合国产精品一区| 欧美日韩免费网站| 欧美激情精品久久久久久大尺度| av成人免费在线| 国产精品久久久久久一区二区三区| 久久婷婷成人综合色| 欧美sm视频| 一级日韩一区在线观看| 国产噜噜噜噜噜久久久久久久久 | 亚洲一区国产精品| 欧美人牲a欧美精品| 亚洲午夜在线观看视频在线| 日韩视频免费看| 国产在线欧美| 欧美午夜www高清视频| 久久全国免费视频| 亚洲午夜精品一区二区三区他趣| 黑人巨大精品欧美一区二区小视频| 欧美制服第一页| 免费亚洲视频| 欧美在线观看你懂的| 尤物精品国产第一福利三区| 欧美成在线视频| 亚洲欧美另类综合偷拍| 久久婷婷丁香| 亚洲影院高清在线| 日韩一级二级三级| 欧美精品日韩综合在线| 狠狠88综合久久久久综合网| 欧美日韩综合视频网址| 欧美在线一二三四区| 亚洲第一中文字幕| 久久成人国产| 久久人体大胆视频| 欧美电影免费观看大全| 欧美激情欧美狂野欧美精品| 亚洲女人av| 欧美影视一区| 久久综合九色综合欧美狠狠| 欧美电影免费观看网站| 亚洲国产精品成人| 亚洲高清在线| 亚洲精品综合精品自拍| 亚洲欧洲av一区二区|