随笔 - 224  文章 - 41  trackbacks - 0
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

享受编程

常用链接

留言簿(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=

"http://schemas.android.com/apk/res/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=

"http://schemas.android.com/apk/res/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=

"http://schemas.android.com/apk/res/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=

"http://schemas.android.com/apk/res/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=

"http://schemas.android.com/apk/res/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 来做到这点,正如它名字的含义。在登录屏幕的最终产品的版本,您要提取输入的文本,开始一个网络登录的调用,发动一个载入对话框。现在,你只显示一个对话框,包含在登录名和密码域中输入的内容。下面 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 对象。你必须通过正确的子类的布局参数,或机 器人将你扔在运行时异常。

正如我以前说过,为了使菜单,我将添加两个文本元素几乎完全一样,以前上市。为贪方便,我不会在这里一一列举。一定要参照整个项目,以满足你的好奇心。现在,你把所有的菜单项到位,是时候对其进行修改时,接收或失去焦点

焦点年轻的草蜢 ... 。
为了处理焦点改变事件,你必须创建一个 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);

随 着地方听众,您现在每次通知一个菜单要素收益或失去焦点。在更先进的主菜单,这个方法可以增加地方的形象转变,动画,三维爆炸或其他奇才邦图形效果。在这 个例子中,您将不得不满足于仅仅改变文字的颜色。现在,用户可以告诉通过颜色的变化,其中菜单项,突出显示,您需要的时候作出反应,他们按中心键选择一个 项目。

提示:它可能通过使用 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 方法,并显示您的有点不合常规的问候。您现在有一个掌握在非常基本的绘画方式到屏幕上。您现在应该可以进入更复杂的渲染和 动画的循环开始。
创建游戏循环
由于所有游戏程序员会告诉你,大多数游戏,其核心,一个不断循环 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 中,整个过程中,再度开始。如果你简单地设置运行的标志虚假暂停或退出和无效时再恢复它的动画应该留在同其母公司活动的重点步骤。

添加和控制声音
由于听觉错觉需要能够打开和关闭两个反弹互相对象声音,您需要设置音频比赛,他们打,然后为用户建立一个机制,把这一声音的和关闭。
要 播放的音频,在代码中添加代码清单 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 漂漂 阅读(1922) 评论(0)  编辑 收藏 引用 所属分类: android 开发

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理