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>
我將從原來的列舉中撤出一些具體的線條并且解釋他們的作用在下面部分。注意,你沒有定義組成這個(gè)屏幕元素的任何位置。但是,因?yàn)槟褂玫氖?LinearLayout 對象,每個(gè)連續(xù)的元素附加到以前的元素的底部。
Scrolling
滾動(dòng)一個(gè)超過你設(shè)備屏幕大小的視圖,你只是需要在 ScrollView 中封裝你的布局對象。為了使用垂直滾動(dòng)條,你的 ScrollView 必須設(shè)置參數(shù) android:scrollbars="vertical" ,當(dāng)你向下翻屏?xí)r,將顯示一個(gè)滾動(dòng)條。為了使視圖足夠長以說明這個(gè)對象,我已經(jīng)添加 TextView 作為假聲明在線性布局結(jié)束處。你會(huì)發(fā)現(xiàn),如果你設(shè)置原來的 XML 為活動(dòng)視圖,重點(diǎn)將是向下移動(dòng)的對象,直到到達(dá)的按鈕,此時(shí)滾動(dòng)條將處理鍵和向下移動(dòng)用戶文本的底部。
窺探 TextView
兩個(gè)主要 “ 構(gòu)件 ” 工作在原來 XML.
注意:在 Android 中的一個(gè)小部件是指任何獨(dú)立視圖對象的子類。
為了標(biāo)題和文本輸入標(biāo)簽,使用 TextView 對象。對于用戶控制的文字輸入,使用 EditText 對象。最顯著的,因此,特別值得詳細(xì)描述的是最后的 “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)容將被修改在某個(gè)時(shí)候,通過你的代碼在運(yùn)行的時(shí)候,所以你需要給它一個(gè) ID 。這允許您使用 findViewById 方法后獲得。
@+id/status 將添加到您的 ID 狀態(tài)在 R.java ,如果文件不存在了。這一點(diǎn),你的 IDE 可能會(huì)錯(cuò)誤當(dāng)您在代碼中引用它第一次。不要懼怕,但因?yàn)槭堑谝淮尉幾g,將全部解決了。
接下來,您用 TextView 設(shè)置其寬度達(dá)到其父類的寬度在這種情況下, LinearLayout 對象。你告訴它讓它的高度是由文字大小范圍內(nèi)使用的 layout_height 參數(shù) wrap_content 。您希望文字居住在屏幕的中心,因此您使用 textAlign ,因?yàn)槟阋呀?jīng)設(shè)置其寬度為整個(gè)屏幕。最后,您給它一些簡單的文字顯示在活動(dòng)開始了。后來,你會(huì)改變這一案文以反映當(dāng)前的狀態(tài)。
看到這個(gè)手藝的結(jié)果,只需創(chuàng)建活動(dòng),并設(shè)置這個(gè) XML 的布局是主要內(nèi)容視圖。您應(yīng)該能夠看到屏幕上,在文本輸入字段的類型,并選擇框。這些行動(dòng),但是不會(huì)有任何結(jié)果。為配合該計(jì)劃將他們,讓他們互動(dòng)你就必須繼續(xù)閱讀。
XML 的布局
我們深刻體會(huì)了 XML 的布置方案既簡單又強(qiáng)大。它提供了一個(gè)非編程接口的移動(dòng)屏幕布局和設(shè)計(jì)。它給開發(fā)人員提供了工具去破解打開和修改運(yùn)行時(shí)的飛行這些值,你會(huì)做探討如何相互作用現(xiàn)在 Android 的內(nèi)置部件。
喚醒構(gòu)建
我已經(jīng)說明了如何使用 Android 的 TextView , button 和 EditText 部件。但如何有用的是一個(gè)文本輸入字段,如果你不能攝取你的用戶已經(jīng)進(jìn)入? 這是一個(gè)反問,不要回答,我不能聽你(我希望)。答案是顯而易見的:沒有目的和結(jié)果文本輸入是沒有用處的。要訪問您的 EditText 部件先前定義的內(nèi)容,你就必須做兩件事:
1 。獲取一個(gè)您在 XML 定義部件的對象句柄。
2 。監(jiān)聽點(diǎn)擊或選擇事件在 Login 按鈕部件上。
獲取的事情句柄
第一個(gè)任務(wù)就是得到一個(gè)在您的 XML 配置文件中定義的元素指針。要做到這一點(diǎn),你會(huì)確保您要訪問的每個(gè) XML 部件有一個(gè) Android : ID 參數(shù)。正如前面簡單提到,使用符號(hào) @+id/-id_name_here- 將確保您的 R.java 文件有你需要的 ID 。以下是如何獲得一個(gè)視圖對象指針,當(dāng)您的應(yīng)用程序啟動(dòng)時(shí)。在新的登錄活動(dòng)中,這是 OnCreate 方法,被添加到 GetSplashy 示例應(yīng)用程序:
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)聽,會(huì)通知您當(dāng)按鈕被選中(在手寫筆觸摸屏)或選定中心軟鍵。您將擴(kuò)展 ClickListener 類的內(nèi)聯(lián)函數(shù)如下:
public class loginScreen extends Activity
{
private OnClickListener buttonListener =
new OnClickListener()
{
public void onClick(View v)
{
grabEnteredText();
}
};
...
}
當(dāng)一個(gè)選擇通知發(fā)生,以前的內(nèi)聯(lián)函數(shù)定義調(diào)用 grabEnteredText 方法。現(xiàn)在你已經(jīng)定義的點(diǎn)擊偵聽器,您可以使用 btn 對象在 OnCreate 方法中:
public void onCreate(Bundle args)
{
//...
btn = (Button) findViewById(R.id.loginbutton );
btn.setOnClickListener(buttonListener);
}
如果您放斷點(diǎn)您的按鈕監(jiān)聽的 onClick 方法中,斷點(diǎn)開火當(dāng)您移動(dòng)焦點(diǎn)并選擇登錄按鈕,當(dāng)您用鼠標(biāo)點(diǎn)擊它在運(yùn)行模擬器中。
繅絲在文本
現(xiàn)在剩下要做的就是定義 grabEnteredText 來做到這點(diǎn),正如它名字的含義。在登錄屏幕的最終產(chǎn)品的版本,您要提取輸入的文本,開始一個(gè)網(wǎng)絡(luò)登錄的調(diào)用,發(fā)動(dòng)一個(gè)載入對話框。現(xiàn)在,你只顯示一個(gè)對話框,包含在登錄名和密碼域中輸入的內(nèi)容。下面 grabEnteredTex 的樣子在更新的登錄活動(dòng):
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 類。最后,你把兩個(gè)字段的內(nèi)容在一起,他們都加入到狀態(tài)文本對象,并彈出一個(gè)對話框還包含兩個(gè)字符串。
這就是它 —— 現(xiàn)在允許用戶輸入文字,你獲取、操縱,甚至顯示一個(gè)對話框包含了該信息。干得好!花一秒鐘輕拍自己在背后,或任何胳膊可以拘著的地方。
到目前為止,您探討如何使用 XML 來做屏幕設(shè)計(jì),僅僅使用 “ 社交 ” 畫面屏幕。此時(shí),你已經(jīng)學(xué)會(huì)了如何使用兩個(gè)的混合體在您的登錄屏幕。最后一站關(guān)于 Android 部件表達(dá),就需要單獨(dú)使用代碼建立屏幕布局的。
Java 的部件
當(dāng)你看到我寫的代碼產(chǎn)生即使是很小的選擇菜單,你可能會(huì)像我,有點(diǎn)嚇呆了。等到熟悉的 XML 的屏幕布局,試圖自己用 java 動(dòng)手完成這一切,會(huì)感覺像是用一對破損的保齡球演奏古典音樂。被警告,它涉及許多打字,或許不僅僅是一點(diǎn)挫折。
另一方面,可能有一個(gè)用戶界面布局的具體元素,你要?jiǎng)討B(tài)調(diào)整。因?yàn)檎缥仪懊嫣岬降模荒茉趹?yīng)用程序運(yùn)行時(shí)編輯 XML 文件的布局,它必須有需要修改每一個(gè)用戶界面的代碼在運(yùn)行時(shí)可能片斷的工具。 Android 給你這個(gè)動(dòng)力,只要你是舒適的打字以驚人速度。
引擎蓋下使用
現(xiàn)在您可以在引擎蓋下開始小小的修補(bǔ),用最基本、最直覺式的方法檢驗(yàn) Android 的構(gòu)建。你已經(jīng)了解一個(gè)核心部分的基本外觀,其中許多是您在 XML 形式探討。正如在前面的例子中,為了說明起見,我將保持這種基本。我已經(jīng)在這里討論的界面布局,它應(yīng)該很容易學(xué)以致應(yīng)用到更復(fù)雜的問題。在后來,更多的高級例子,你會(huì)獲得更多的其他 Android 部件。在下面的例子中,我將盡力確保使用很少你從前依賴沒有的 XML 元素。它應(yīng)該給你一個(gè)機(jī)會(huì),獲得良好的處理非 XML 布局,但要記住,實(shí)際上,你必須是瘋狂的做所有的用戶界面,這種方式。
主菜單
幾乎所有的移動(dòng)應(yīng)用,至少在發(fā)行時(shí),首先是圖形主菜單。這個(gè)圖形屏幕引導(dǎo)用戶執(zhí)行移動(dòng)應(yīng)用的各種功能。因?yàn)?“ 主菜單 ” 的概念是如此普遍的移動(dòng)應(yīng)用體驗(yàn),它使一個(gè)很好的和實(shí)際的案例研究。在這個(gè)例子中,你的目標(biāo)是將一個(gè)簡單功能主菜單的放在一起。為了便于比較,你會(huì)使用其他的線性布局, 把一切融合在一起。這個(gè)例子將建立在三個(gè)主要階段:
1 。布局:你會(huì)在屏幕上正確地安排所有的主菜單項(xiàng)。當(dāng)然,這將只使用 Android 的大屏幕版面上的一小部分。但是,大多數(shù)應(yīng)用程序菜單將使用大型圖形,承擔(dān)著更多的空間。
2 。焦點(diǎn):您需要建立一個(gè)焦點(diǎn)結(jié)構(gòu),使用戶可以通過元素移動(dòng)。當(dāng)焦點(diǎn)移動(dòng)時(shí),你必須調(diào)整每個(gè)菜單元素的顏色。
3 。選擇活動(dòng):最后,您需要建立一個(gè)監(jiān)聽,以便當(dāng)一個(gè)元素被選中或單擊,你知情和可以在選定的項(xiàng)目基礎(chǔ)上采取適當(dāng)行動(dòng)。
當(dāng)您完成所有這些任務(wù)的三個(gè),你應(yīng)該有建立主要輸入屏幕的框架,這大約占整個(gè)移動(dòng)應(yīng)用的百分之 80 的工作。雖然不完全現(xiàn)實(shí)(即,我已經(jīng)完全使用 XML 的零),它是極好示范,如何做事情以自定義運(yùn)行時(shí)的驅(qū)動(dòng)方式。當(dāng)您添加更多的功能在你的 “ 社交 ” 應(yīng)用程序中,您填寫此主菜單將更加完善。
布局, Java 風(fēng)格
在簡單主菜單上的第一步是得到所有在屏幕上的菜單元素。正如我剛才所說,你將采用線性布局完成它。您需要在申請前做這一切提請第一次,所以就必須在新的 MainMenu 活動(dòng)的 OnCreate 方法中。 (請參閱第 1 章,如果你忘記了如何創(chuàng)建并插入一個(gè)新的活動(dòng)。)代碼清單 3-2 顯示了它的實(shí)例化和配置的模樣。
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);
之后,您通過什么迄今為止,這在概念上似乎應(yīng)熟悉。您可以設(shè)置背景使用在 /res/drawable/ 文件夾中的圖片,設(shè)置線性布局為垂直方向,并設(shè)置 LayoutParams 以填補(bǔ)父親(在這種情況下,父親是活動(dòng),控制全屏幕)。布局參數(shù),在他們的基地,必須界定規(guī)定部件的高度和寬度。正如您后來可能會(huì)發(fā)現(xiàn),在前布局參數(shù)設(shè)置之前試圖放入一個(gè)部件在 ViewGroup 里,將拋出一個(gè)異常。但是,現(xiàn)在你有一個(gè)布局對象來填充,你可以開始建立了屏幕。
添加標(biāo)題
接下來,添加一個(gè)簡單的標(biāo)題,在你的主菜單畫面上方將為本。代碼清單 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)建文本對象,并設(shè)置文本在 /res/values/strings.xml 中 。我知道我說我不會(huì)用任何 XML ,但我恐怕我會(huì)對此有些撒謊。在開發(fā)中,您需要將所有的字符串移到這個(gè)位置,而不是在代碼中定義。如果你的客戶是像我這樣,你就不會(huì)想拉你的源代碼編輯器并重新編譯每次他們想改變對 screens.Now 之一的措詞,你有一個(gè)標(biāo)題,是時(shí)候添 加更多有趣的和積極的菜單元素。
鋪設(shè)菜單項(xiàng)
現(xiàn)在您可以添加單個(gè)菜單元素。因?yàn)檫@將是第一個(gè)在相當(dāng)重復(fù),我將插入和解釋的第一個(gè)元素,但其余的留給你的你自己的設(shè)備。隨意抓取在 Apress 網(wǎng)站的完整項(xiàng)目,看到菜單項(xiàng)休息。同樣地,你會(huì)填補(bǔ)他們更為您通過 Android 要素各地的發(fā)展。
代碼清單 3-4 顯示的代碼添加單個(gè)菜單項(xiàng)。
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);
天哪,你可能認(rèn)為在仔細(xì)閱讀代碼,這看起來就像你已經(jīng)添加標(biāo)題。你完全正確,多么聰明的 you.The 的一個(gè)對象時(shí)表明的焦點(diǎn)是,當(dāng)它被選中繁重還沒有到,所以不要太自大還。下面是與以前的菜單項(xiàng),上面列出的標(biāo)題文字有差別:
Ø 你需要告訴 TextView 它可以接受的方法調(diào)用 setFocusable 焦點(diǎn)。
Ø 菜單上市項(xiàng)目將需要身份證,因此您可以區(qū)別開來,在選擇處理程序菜單元素的其余部分。
正 如我剛才簡單,只要增加一個(gè)小部件到 ViewGroup 的 LayoutParams 對象必須明確這一觀點(diǎn)內(nèi)組定義的對象。例如,在過去 setLayoutParams 方法調(diào)用,你必須通過在 LinearLayout.LayoutParams 對象。你必須通過正確的子類的布局參數(shù),或機(jī) 器人將你扔在運(yùn)行時(shí)異常。
正如我以前說過,為了使菜單,我將添加兩個(gè)文本元素幾乎完全一樣,以前上市。為貪方便,我不會(huì)在這里一一列舉。一定要參照整個(gè)項(xiàng)目,以滿足你的好奇心。現(xiàn)在,你把所有的菜單項(xiàng)到位,是時(shí)候?qū)ζ溥M(jìn)行修改時(shí),接收或失去焦點(diǎn)
焦點(diǎn)年輕的草蜢 ... 。
為了處理焦點(diǎn)改變事件,你必須創(chuàng)建一個(gè) OnFocusChangeListener 抽象類的實(shí)現(xiàn)。該示例的版本,在主菜單內(nèi)定義類的活動(dòng)在當(dāng)?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 );
}
此外,您必須添加以下行對應(yīng)于每個(gè)菜單中選擇元素附加焦點(diǎn)更改偵聽器對象:
ItemOne.setOnFocusChangeListener(focusListener);
隨 著地方聽眾,您現(xiàn)在每次通知一個(gè)菜單要素收益或失去焦點(diǎn)。在更先進(jìn)的主菜單,這個(gè)方法可以增加地方的形象轉(zhuǎn)變,動(dòng)畫,三維爆炸或其他奇才邦圖形效果。在這 個(gè)例子中,您將不得不滿足于僅僅改變文字的顏色。現(xiàn)在,用戶可以告訴通過顏色的變化,其中菜單項(xiàng),突出顯示,您需要的時(shí)候作出反應(yīng),他們按中心鍵選擇一個(gè) 項(xiàng)目。
提示:它可能通過使用 setTextColor ( ColorStateList 顏色)方法,該方法是貫徹落實(shí)文本簡單的方式為基礎(chǔ)的主要 menu.There 一個(gè) TextView 重點(diǎn),沒有重點(diǎn),并選定顏色總是很多方法可以實(shí)現(xiàn)一個(gè)目標(biāo),一個(gè)很好的 IDE 中,我只是選擇了更通用的(因?yàn)槲?希望你的應(yīng)用超越文本菜單)。有關(guān)使用 setTextColor 信息,請參閱文件 Android 在 http://code.google.com/android /reference/android/widget/TextView.html # setTextColor (整型)。
單擊并選擇活動(dòng)
你已經(jīng)看到如何登記在 oginscreen onClick 事件,所以你應(yīng)該能夠通過這一節(jié) withouttrouble 的微風(fēng)。代碼清單 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 回來的原因當(dāng)您最初創(chuàng)建并鋪設(shè) TextView 部件。當(dāng)一個(gè)菜單項(xiàng)被選中或指針點(diǎn)擊,的 onClick 函數(shù)被調(diào) 用,并通過相應(yīng)的視圖是作為參數(shù)。您將負(fù)責(zé)審查,以確定哪些菜單項(xiàng)被選為通過視圖 ID 。這使您可以采取的菜單中選擇適當(dāng)?shù)男袆?dòng)。通過這種方式,您可以切換 到先前定義的登錄屏幕,你即將會(huì)與 startActivity 方法調(diào)用寫入自定義視圖。
還是有留下的一小步,如果你在示例代碼中的 onCreatefuction 的底部,你會(huì)點(diǎn)它。你需要添加一個(gè)點(diǎn)擊監(jiān)聽到視圖。下面是應(yīng)該運(yùn)行在你建立的部件清單行:
ItemOne.setOnClickListener(clickListener);
回顧
回顧 Java 驅(qū)動(dòng)的主菜單,你做到了幾個(gè)重要 things.First ,您執(zhí)行功能以前只能通過 XML 文件的布局。雖然不完全切合實(shí)際的做一方面,它會(huì)給你足夠的工具來改變和定制應(yīng)用程序的同時(shí)運(yùn)行 XML 視圖。
第二,你注冊為您的所有菜單項(xiàng)的焦點(diǎn)改變事件。當(dāng)焦點(diǎn)更改偵聽叫,你改變了重點(diǎn)項(xiàng)目,以突出顯示它的顏色。在實(shí)際應(yīng)用中,要達(dá)到同樣的事情更有效的方法,但我假設(shè)你想改變的東西代替文本顏色多,可以說,奢華。
第 三,你學(xué)會(huì)了如何傾聽和作出反應(yīng)的選擇事件,洞悉項(xiàng)目選中,并采取適當(dāng)?shù)男袆?dòng)是 selection.Again 基礎(chǔ)上,對所有需要將重點(diǎn)放在手屏幕小部件 出代碼,往往是相當(dāng)昂貴,但是使用你剛剛學(xué)到的工具,你可以修改,增加,以及自定義菜單或工程清單數(shù)據(jù)和用戶偏好為基礎(chǔ),同時(shí)應(yīng)用程序正在運(yùn)行。但是,如 果您需要獲得更多的專業(yè)如何繪制到屏幕上,你需要較少微妙和更代碼重的方法。
自定義用戶界面渲染的畫布
這 是你出芽部分游戲開發(fā)商一直在等待 for.Android 允許你定義一個(gè)自定義視圖對象只是通過擴(kuò)展視圖類和執(zhí)行 OnDraw 方法。為了演示自定義視圖在 動(dòng)畫循環(huán)中運(yùn)行,我已經(jīng)從舊金山市的探索展示一些啟示我們?nèi)绾慰创齽?dòng)畫和聲音。您可以在 http://www.exploratorium.edu /listen/index.php 更多關(guān)于博物館和有關(guān)的展覽。你可以購買 http://www.nature.com/neuro/journal /v7/n7/full/nn1268.html 科學(xué)白皮書。
這個(gè)例子將動(dòng)畫兩個(gè)球?qū)Ψ铰糜危缓蠡蛘呋驈椞鸵苿?dòng)距離通過。這個(gè)例子是為了表明反彈聲音可以看到之間的傳遞對象,看他們相互彈球人的區(qū)別。代碼方面,我將演示了一個(gè)自定義視圖幾個(gè)重要方面:
Ø 實(shí)施意見的 Android
Ø 繪制到屏幕上使用 Canvas 對象
Ø 創(chuàng)建動(dòng)畫循環(huán)
Ø 修改,并從活動(dòng)自定義視圖交互
自定義視圖
您 可以自定義在兩個(gè)方面視圖窗口。第一,是將 View 類。這使您可以通過滾動(dòng)自己創(chuàng)造一個(gè) android.View 可行的子類的 “ 工具 ” 。另一種方法,您就 必須對自己的探索,是子類,如 TextView ,進(jìn)度條,或 ImageView 和修改其行為受保護(hù)的方法使用現(xiàn)有的部件。這個(gè)例子顯示了第一個(gè)選擇,因?yàn)?它的范圍廣泛,比較容易理解。
在最基本的層面,一個(gè)自定義部件重寫保護(hù) OnDraw 方法。代碼清單 3-7 顯示了這樣一個(gè)方法的一個(gè)示例。
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)在是自己的自定義部件驕傲的所有者。當(dāng)然,它只是打招呼,像我 17 歲朋克表妹,但我想你必須從某個(gè)地方開始。對于那些你在與 GameCanvas 的經(jīng)驗(yàn)對象的 Java ME ,這應(yīng)該很熟悉。要接收 OnDraw 中呼叫,您需要設(shè)置作為樣本活動(dòng)的主要內(nèi)容查看。你必須儀式代碼,將實(shí)例化,并使其成為當(dāng)前視圖。代碼清單 3-8 顯示了 CanvasExample 活動(dòng)的外觀。
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);
}
你為你的樣品活動(dòng)的名稱,因?yàn)槟銢]有給它一個(gè)應(yīng)用程序的名稱。然后,它只是一個(gè)創(chuàng)建新 CustomView 對象,并設(shè)置它為當(dāng)前內(nèi)容視圖的問題。這將調(diào)用 您的自定義部件內(nèi)的 OnDraw 方法,并顯示您的有點(diǎn)不合常規(guī)的問候。您現(xiàn)在有一個(gè)掌握在非常基本的繪畫方式到屏幕上。您現(xiàn)在應(yīng)該可以進(jìn)入更復(fù)雜的渲染和 動(dòng)畫的循環(huán)開始。
創(chuàng)建游戲循環(huán)
由于所有游戲程序員會(huì)告訴你,大多數(shù)游戲,其核心,一個(gè)不斷循環(huán) onsist 。用戶輸入的循環(huán)檢查,并 在此輸入和任何其他游戲行動(dòng),屆時(shí)將制訂新的框架 / 幀在您的示例應(yīng)用程序 screen.The 循環(huán)將不會(huì)贏得的復(fù)雜性和獨(dú)創(chuàng)性的任何獎(jiǎng)項(xiàng),但它會(huì)得到你開 始自己的 amerendering 循環(huán)。
注 意:如果你想實(shí)現(xiàn)自己以外的瀏覽自己的動(dòng)畫循環(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ù)的反彈媒體資源從 / 水庫 / 原始位置的文件。因?yàn)槟阕隽藥讉€(gè)其他資源類型此之前,你應(yīng)該是一個(gè)老手了。您還需要加 載一個(gè),將作為 “ 球得出的形象。 ” 你這樣做的資源管理器使用對象,這是從上下文對象 etrieved 。雖然你沒有明確從資源加載位置之前的形象,這好像幾 乎任何其他資源負(fù)載的代碼。
實(shí)施環(huán),實(shí)施循環(huán),實(shí)施 ...
事不宜遲,代碼清單 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();
}
從頂部開始,您的第一個(gè)白色的背景使用 paintstyle 對象和調(diào)用 canvas.drawRect 。油漆對象,結(jié)合 Rectangle 對象,將告訴畫 布畫一個(gè)白色盒子,覆蓋整個(gè)屏幕。接下來,您將遞增 x 和你的球 Sprite 的 y 值。然后,您需要重新設(shè)置他們,如果他們已經(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);
}
這個(gè)功能,現(xiàn)在,只是一個(gè)簡單的調(diào)用 drawBitmap 方法。我已經(jīng)分離出來,這種方法只是因?yàn)槔L制在另一場合雪碧可能需要比這個(gè)簡單的例子功能。最 后,回到 OnDraw 函數(shù),你會(huì)打電話給你的只有無效運(yùn)行標(biāo)志是真實(shí)的。調(diào)用無效的看法是 Android 的強(qiáng)迫重繪的首選方式。在這種情況下,您自己無效,這將調(diào) 用 OnDraw 中,整個(gè)過程中,再度開始。如果你簡單地設(shè)置運(yùn)行的標(biāo)志虛假暫停或退出和無效時(shí)再恢復(fù)它的動(dòng)畫應(yīng)該留在同其母公司活動(dòng)的重點(diǎn)步驟。
添加和控制聲音
由于聽覺錯(cuò)覺需要能夠打開和關(guān)閉兩個(gè)反彈互相對象聲音,您需要設(shè)置音頻比賽,他們打,然后為用戶建立一個(gè)機(jī)制,把這一聲音的和關(guān)閉。
要 播放的音頻,在代碼中添加代碼清單 3 月 12 日 到以前的 OnDraw 函數(shù),因?yàn)樗矊?shí)際上,游戲控制回路。當(dāng)我說 “ 游戲循環(huán), ” 我指的是無效呼叫在 OnDraw 中結(jié)束,將設(shè)立一個(gè)重繪 Android 的 UI 事件循環(huán)。請記住, playSound 是一個(gè)布爾宣布 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)注意到,你開始音頻播放時(shí),小精靈, 16 像素遠(yuǎn)離對方。這是一個(gè)沒有行賄的時(shí)間,讓音頻開始。我要指出,這更加證明我不能編輯音頻文件而不 是針對一個(gè)缺乏效率的音頻負(fù)荷和 Android 播放時(shí)間。您還必須確保以播放音頻只有 playSound 布爾是真實(shí)的。這個(gè)變量是一類的活動(dòng)在其中自定義視圖定義 的成員。使用此布爾,你會(huì)得到了來自內(nèi)部的屏幕活動(dòng)自定義視圖類的控制。要打開和關(guān)閉音頻,您現(xiàn)在只需實(shí)施
在代碼的方法,在活動(dòng)清單 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);
}
此代碼應(yīng)類似于你如何駁回了在第 2 章惡作劇的應(yīng)用。
把它同在一起
如果您已經(jīng)按照一直密切(或欺騙,只是下載完成的項(xiàng)目),您應(yīng)該能夠運(yùn)行應(yīng)用程序,看的幻覺。新聞中心方向鍵打開和關(guān)閉音頻。與音頻 起飛,它應(yīng)該像他們通過互相進(jìn)行表決,看起來他們反彈,即走各的路。在這個(gè)例子中,我演示了如何創(chuàng)建自己的視圖類,如何用它來畫在屏幕上,如何建立一個(gè)游 戲渲染循環(huán),以及如何控制,簡單的循環(huán)利用關(guān)鍵事件。
使用用戶界面
在本章中,您已經(jīng)了解,詳細(xì),如何布局屏幕使用 Android 的 XML 架構(gòu),以及如何相互作用和修改了一些 Java 的 code.Next 運(yùn)行的模式,學(xué)習(xí)了如何 UI 部件布局和視圖組使用源碼單。這是一個(gè)不那么實(shí)際應(yīng)用 的 Android 用戶界面工具,但重要的是去理解的但為了通過。最后,您探索建設(shè) gamerendering 循環(huán)的重要工具。您加入到把一些簡單的多媒體和用戶控 制,創(chuàng)建了一個(gè)簡單的聽覺幻想,應(yīng)該讓 yourvery 討厭鬼的朋友。
提示:使用所有你學(xué)到了在本章中,建立這種幻想,它包含了一些說明文字,以及邊界使用 XML.When 活動(dòng)開始了一個(gè)框架,但呈現(xiàn)的 XML 插入到適當(dāng)?shù)奈恢米远x視圖。對于這項(xiàng)任務(wù),我建議使用的解釋,并為邊境矩形相對布局, TextView 。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx
posted on 2010-05-10 20:54
漂漂 閱讀(1936)
評論(0) 編輯 收藏 引用 所屬分類:
android 開發(fā)