描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302495789丛书名: 21世纪高等学校计算机类课程创新规划教材·微课版
本书在叙述上浅显易懂,对每一个知识点都配了相应的例题。本书提供了所有例题的源代码、电子课件,以及本书大部分例题的视频教学演示(扫描二维码)。
本书可以作为高等院校及各类培训学校Android系统课程的教材,也可以作为学习Android程序设计的编程人员的自学用书。
第1章 Android系统及其开发过程… 1
1.1
Android系统概述… 1
1.2 安装Android SDK开发环境… 2
1.2.1 安装Android SDK前必要的准备… 2
1.2.2 安装Android SDK详解… 3
1.2.3
设置环境变量… 7
1.3
Android API和在线帮助文档… 7
1.4
Android应用程序的开发过程… 8
1.4.1
开发Android应用程序的一般过程… 8
1.4.2
生成Android应用程序框架… 9
1.4.3 编写MainActivity.java. 10
1.4.4
配置应用程序的运行参数… 11
1.4.5
在模拟器中运行应用程序… 12
1.5
Android应用程序结构… 12
1.5.1
目录结构… 12
1.5.2 Android应用程序架构分析… 18
1.6
Android应用程序设计示例… 19
习题1. 21
第2章 Java语法概述… 22
2.1 语法基础… 22
2.1.1
数据类型… 22
2.1.2 常量与变量… 23
2.1.3 对变量赋值… 24
2.1.4 关键字… 24
2.1.5 转义符… 24
2.2 基本数据类型应用示例… 25
2.2.1 整型与浮点型… 25
2.2.2 字符型… 27
2.2.3 布尔型… 28
2.2.4
数据类型的转换… 29
2.3 程序控制语句… 30
2.3.1
语句的分类… 30
2.3.2
顺序控制语句… 31
2.3.3 if语句… 32
2.3.4
switch语句… 34
2.3.5
循环语句… 35
2.3.6 转语句… 40
2.4 类与对象… 42
2.4.1
类的定义… 42
2.4.2
对象… 44
2.4.3
接口… 46
2.4.4
包… 47
2.5 XML语法简介… 47
习题2. 51
第3章 Android用户界面设计… 53
3.1 用户界面组件包widget和View类… 53
3.2 文本标签与按钮… 54
3.2.1
文本标签… 54
3.2.2
按钮… 56
3.3 文本编辑框… 61
3.4 Android布局管理… 64
3.4.1
布局文件的规范与重要属性… 64
3.4.2
常见的布局方式… 65
3.5 进度条和选项按钮… 72
3.5.1
进度条… 72
3.5.2
选项按钮… 74
3.6 图像显示与画廊组件… 80
3.6.1
图像显示ImageView类… 80
3.6.2
画廊组件Gallery与图片切换器ImageSwitcher 84
3.7 消息提示… 88
3.8 列表组件… 91
3.8.1
列表组件ListView类… 91
3.8.2
列表组件ListActivity类… 94
3.9 滑动抽屉组件… 96
习题3. 100
第4章 多个用户界面的程序设计… 102
4.1 页面切换与传递参数值… 102
4.1.1 传递参数组件Intent 102
4.1.2 Activity页面切换… 102
4.1.3 应用Intent在Activity页面之间传递数据… 106
4.2 菜单… 110
4.2.1
选项菜单… 110
4.2.2
上下文菜单… 112
4.3 对话框… 114
4.3.1
消息对话框… 114
4.3.2
其他几种常用对话框… 120
习题4. 123
第5章 异常处理与多线程… 124
5.1 异常处理… 124
5.2 多线程… 126
5.2.1 线程与多线程… 126
5.2.2 线程的生命周期… 127
5.2.3 线程的数据通信… 128
5.2.4 创建线程… 130
习题5. 137
第6章 图形与多媒体处理… 138
6.1 绘制几何图形… 138
6.1.1 几何图形绘制类… 138
6.1.2
几何图形的绘制过程… 139
6.2 触摸屏事件处理… 144
6.2.1
简单触摸屏事件… 144
6.2.2
手势识别事件… 150
6.3 音频播放… 153
6.3.1 多媒体处理包… 153
6.3.2 媒体处理播放器… 154
6.3.3 播放音频文件… 155
6.4 视频播放… 161
6.4.1
应用媒体播放器播放视频… 161
6.4.2
应用视频视图播放视频… 164
6.5 录音与拍照… 166
6.5.1
用于录音、录像的MediaRecorder类… 166
6.5.2
录音示例… 167
6.5.3
拍照… 170
6.6 将文本转换成语音… 176
6.7 图像处理技术… 178
6.7.1
处理图像的颜色矩阵… 178
6.7.2
处理图像的坐标变换矩阵… 184
习题6. 192
第7章 后台服务与系统服务技术… 193
7.1 后台服务Service. 193
7.2 信息广播机制Broadcast 197
7.3 系统服务… 206
7.3.1 Android的系统服务… 206
7.3.2
系统通知服务Notification. 206
7.3.3
系统定时服务AlarmManager 209
7.3.4
系统功能的调用… 212
习题7. 215
第8章 数据存储… 216
8.1
SQLite数据库… 216
8.1.1 SQLite数据库简介… 216
8.1.2 管理和操作SQLite数据库的对象… 217
8.1.3 SQLite数据库的操作命令… 218
8.2 文件处理… 230
8.2.1 输入流和输出流… 230
8.2.2 处理文件流… 231
8.3 轻量级存储SharedPreferences 237
习题8. 240
第9章 网络通信… 241
9.1 网络编程的基础知识… 241
9.1.1 IP地址和端口号… 241
9.1.2 套接字… 244
9.2 基于TCP的网络程序设计… 246
9.3 基于HTTP的网络程序设计… 251
9.4
Web视图… 255
9.4.1 浏览器引擎WebKit 255
9.4.2 Web视图对象… 255
9.4.3 调用JavaScript 258
9.5 无线网络通信技术WiFi 266
习题9. 272
第10章 地图服务及传感器检测技术… 273
10.1
Google地图… 273
10.1.1 Google Maps包… 273
10.1.2 导入Google地图API的Maps包… 274
10.1.3 显示地图MapView类… 274
10.1.4 添加Google地图的贴图… 279
10.2 位置服务… 282
10.3 传感器检测技术… 286
10.3.1 传感器简介… 286
10.3.2
加速度传感器的应用示例… 289
习题10. 297
附录A JavaSDK及Eclipse的安装与配置… 298
附录B Android的调试工具… 300
附录C Map API
Key的申请过程
findViewById(int id)与id所对应的组件建立关联android:visibilitysetVisibility(int)设置组件的可见性android:clickablesetClickable(boolean)设置组件是否响应单击事件3.2 文本标签与按钮3.2.1 文本标签 文本标签(TextView)用于显示文本内容,是常用的组件之一。其常用方法见表3-3。表3-3 文本标签(TextView)常用方法方 法功 能getText();获取文本标签的文本内容setText(CharSequence text);设置文本标签的文本内容setTextSize(float);设置文本标签的文本大小setTextColor(int color);设置文本标签的文本颜色 其常用的XML文件元素属性见表3-4。表3-4 文本标签(TextView)常用的XML文件元素属性元 素 属 性说 明android:id文本标签标识android:layout_width文本标签(TextView)的宽度,通常取值”fill_parent”(屏幕宽度)或以像素为单位pt的固定值android:layout_height文本标签(TextView)的高度,通常取值”wrap_content”(文本的高)或以像素px为单位的固定值android:text文本标签(TextView)的文本内容android:textSize文本标签(TextView)的文本大小 【例3-1】设计一个文本标签组件程序。 创建名为Ex03_01的新项目,包名为com.ex03_01。打开系统自动生成的项目框架,需要设计的文件为:* 界面布局文件activity_main.xml;* 控制文件MainActivity.java;* 资源文件strings.xml。 (1)设计界面布局文件activity_main.xml。在界面布局文件activity_main.xml中加入文本标签TextView,设置文本标签组件的id属性,如图3.1所示。 activity_main.xml代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > 6 android:id=”@ id/textView1″ 8 android:layout_width=”fill_parent” 9 android:layout_height=”wrap_content” 10 android:text=”@string/hello” /> 11
图3.1 在界面布局中设置文本标签 (2)设计控制文件MainActivity.java。在控制文件MainActivity.java中添加文本标签组件,并将界面布局文件中所定义的文本标签元素属性值赋给文本标签,与界面布局文件中的文本标签建立关联。程序代码如下: 1 package com.ex03_01; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.graphics.Color; 5 import android.widget.TextView; 6 7 public class MainActivity extends Activity 8 { 9 private TextView txt; 10 public void onCreate(Bundle savedInstanceState) 11 { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 txt=(TextView)findViewById(R.id.textView1); 15 txt.setTextColor(Color.WHITE); 16 } 17 } (3)设计资源文件strings.xml。修改资源文件strings.xml中属性为”hello”的元素项的文本内容: 1 2 3 n 荷塘月色 4 n 剪一段时光缓缓流淌, 5 n 流进了月色中微微荡漾, 6 n 弹一首小荷淡淡的香, 7 n 美丽的琴音就落在我身旁. 8 9 Ex03_01 10 保存项目,配置应用程序的运行参数。程序的运行结果如图3.2所示。
图3.2 文本标签3.2.2 按钮 按钮(Button)用于处理人机交互事件,在一般应用程序中经常会用到。由于按钮是文本标签(TextView)的子类,其继承关系如图3.3所示。按钮继承了文本标签的所有方法和属性。 按钮在程序设计中常用的方式是实现OnClickListener监听接口,当单击按钮时,通过OnClickListener监听接口触发onClick()事件,实现用户需要的功能。OnClickListener接口有一个onClick()方法,在按钮实现OnClickListener接口时,一定要重写这个方法。 按钮调用OnClickListener接口对象的方法如下: 按钮对象.setOnClickListener(OnClickListener对象); 【例3-2】编写程序,实现单击按钮页面标题及文本标签的文字内容发生变化的功能,如图3.4所示。
单击按钮前 单击按钮后图3.4 单击按钮后,文本标签的文字内容发生变化 创建名为Ex03_02的新项目,包名为com.ex03_02。 (1)设计界面布局文件activity_main.xml。在界面布局文件中添加一个按钮,将其id设置为button1。其代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > 6 11 16 (2)设计控制文件MainActivity.java。在控制文件MainActivity.java中设计一个实现按钮监听接口的内部类mClick,当单击按钮时,触发onClick()事件。其代码如下: 1 package com.ex03_02; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.view.View.OnClickListener; 6 import android.widget.TextView; 7 import android.widget.Button; 8 9 public class MainActivity extends Activity 10 { 11 private TextView txt; 12 private Button btn; 13 public void onCreate(Bundle savedInstanceState) 14 { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 txt=(TextView) findViewById(R.id.textView1); 18 btn=(Button)findViewById(R.id.button1); 19 btn.setOnClickListener(new mClick()); 20 } 21 class mClick implements OnClickListener 22 { 23 public void onClick(View v) 24 { 25 MainActivity.this.setTitle(“改变标题”); 26 txt.setText(R.string.newStr); 27 } 28 } 29 } (3)设计资源文件strings.xml,其代码如下: 1 2 3 Hello World, 这是Ex03_02的界面! 4 Ex03_02 5 单击我! 6 改变了文本标签的内容 7 【例?3-3】编写程序,实现单击按钮改变文本标签的文字及背景颜色的功能,如图?3.5所示。
图3.5 单击按钮后,文本标签的文字及背景颜色发生变化 本例题涉及颜色定义,Android系统在android.graphics.Color中定义了12种常见的颜色常数,其颜色常数见表3-5。表3-5 常见的颜色常数颜 色 常 数十六进制数色码意 义Color.BLACK0xff000000黑色Color.BLUE0xff00ff00蓝色Color.CYAN0xff00ffff青绿色Color.DKGRAY0xff444444灰黑色Color.GRAY0xff888888灰色Color.GREEN0xff0000ff绿色Color.LTGRAY0xffcccccc浅灰色Color.MAGENTA0xffff00ff红紫色Color.RED0xffff0000红色Color.TRANSPARENT0x00ffffff透明Color.WHITE0xffffffff白色Color.YELLOW0xffffff00黄色 创建名为Ex03_03的新项目,包名为com.ex03_03。 (1)设计界面布局文件activity_main.xml。 在XML文件中表示颜色的方法有多种。* #RGB:用3位十六进制数分别表示红、绿、蓝颜色。* #ARGB:用4位十六进制数分别表示透明度,以及红、绿、蓝颜色。* #RRGGBB:用6位十六进制数分别表示红、绿、蓝颜色。* #AARRGGBB:用8位十六进制数分别表示透明度,以及红、绿、蓝颜色。 下面程序是用8位十六进制数表示透明度,以及红、绿、蓝颜色。 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:background=”#ff7f7c” 6 android:orientation=”vertical” > 7 android:id=”@ id/textView1″ 9 android:layout_width=”fill_parent” 10 android:layout_height=”wrap_content” 11 android:textColor=”#ff000000″ 12 android:text=”@string/hello” /> 13 (2)设计控制文件MainActivity.java,其代码如下: 1 package com.ex03_03; 2 import android.app.Activity; 3 import android.graphics.Color; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 public class MainActivity extends Activity 11 { 12 /** Called when the activity is first created. */ 13 private TextView txt; 14 private Button btn; 15 @Override 16 public void onCreate(Bundle savedInstanceState) 17 { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 btn=(Button)findViewById(R.id.button1); 21 txt=(TextView)findViewById(R.id.textView1); 22 btn.setOnClickListener(new click()); 23 } 24 class click implements OnClickListener 25 { 26 public void onClick(View v) 27 { 28 int BLACK=0xffcccccc; 29 txt.setText(“改变了文字及背景颜色”); 30 txt.setTextColor(Color.YELLOW); 31 txt.setBackgroundColor(BLACK); 32 } 33 } 34 } (3)设计资源文件strings.xml,其代码如下: 1 2 3 Hello World, MainActivity! 4 Ex03_03 5 单击我,改变文字背景颜色 6 3.3 文本编辑框 文本编辑框(EditText)用于接收用户输入的文本信息内容。文本编辑框继承于文本标签,其继承关系如图3.6所示。 文本编辑框主要继承文本标签的方法,其常用方法见表3-6。表3-6 文本编辑框(EditText)的常用方法方 法功 能EditText(Context context)构造方法,创建文本编辑框对象getText()获取文本编辑框的文本内容setText(CharSequence text)设置文本编辑框的文本内容 其常用的XML文件元素属性见表3-7。表3-7 文本编辑框(EditText)常用的XML文件元素属性元 素 属 性说 明android:editable设置是否可编辑,其值为true或falseandroid:numeric设置TextView 只能输入数字,其参数默认值为falseandroid:password设置密码输入,字符显示为圆点,其值为true或falseandroid:phoneNumber设置只能输入电话号码,其值为true或false 定义框EditText元素的android:numeric属性,其取值只能是下列常量(可由“|”连接多个常量)。* integer:可以输入数值。* signed:可以输入带符号的数值。* decimal:可以输入带小数点的数值。 【例3-4】设计一个密码验证程序,其运行界面如图3.7所示。
图3.7 文本编辑框 创建名为Ex03_04的新项目,包名为com.ex03_04。 (1)设计界面布局文件activity_main.xml。在界面布局中,设置一个编辑框,用于输入密码,再设置一个按钮,判断密码是否正确,设置两个文本标签,其中一个显示提示信息“请输入密码”,另一个显示密码正确与否。其代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > ? 6 /> ? 15 ? 23 ? 30 38 (2)设计控制文件MainActivity.java。在控制文件MainActivity.java中,主要是设计按钮的监听事件,当单击按钮后,从文本编辑框中获取输入的文本内容,与密码“abc123”进行比较。其代码如下: 1 package com.ex03_04; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.view.View.OnClickListener; 6 import android.widget.EditText; 7 import android.widget.TextView; 8 import android.widget.Button; 9 public class MainActivity extends Activity 10 { 11 private EditText edit; 12 private TextView txt1,txt2; 13 private Button mButton01; 14 @Override 15 public void onCreate(Bundle savedInstanceState) 16 { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 txt1=(TextView)findViewById(R.id.myTextView01); 20 txt2=(TextView)findViewById(R.id.myTextView02); 21 edit=(EditText)findViewById(R.id.myEditText); 22 mButton01=(Button)findViewById(R.id.myButton); 23 mButton01.setOnClickListener(new mClick()); 24 } 25 class mClick implements OnClickListener 26 { 27 public void onClick(View v) 28 { 29 String passwd; 30 passwd=edit.getText().toString(); 31 if(passwd.equals(“abc123”)) 32 txt2.setText(“欢迎进入快乐大本营!”); 33 else 34 txt2.setText(“非法用户,请立刻离开!”); 35 } 36 } 37 }3.4 Android布局管理 Android系统按照MVC(Model-View-Controller)设计模式,将应用程序的界面设计与功能控制设计分离,从而可以单独地修改用户界面,而不需要去修改程序代码。应用程序的用户界面通过XML定义组件布局来实现。 Android系统的布局管理是指在XML布局文件中设置组件的大小、间距、排列及对齐方式等。Android系统中常见的布局方式有5种,它们分别是LinearLayout、FrameLayout、TableLayout、RelativeLayout、AbsoluteLayout。3.4.1 布局文件的规范与重要属性 1.布局文件的规范 Android系统应用程序的XML布局文件有以下规范: (1)布局文件作为应用项目的资源存放在reslayout目录下,其扩展名为.xml。 (2)布局文件的根结点通常是一个布局方式,在根结点内可以添加组件作为结点。 (3)布局文件的根结点必须包含一个命名空间: xmlns:android=”http://schemas.android.com/apk/res/android” (4)如果要在实现控制功能的Java程序中控制界面中的组件,则必须为界面布局文件中的组件定义一个ID,其定义格式为: android:id=”@ id/” 2.布局文件的重要属性 在一个界面布局中会有很多元素,这些元素的大小和位置由其属性决定。下面简述布局文件中的几个重要属性。 1)设置组件大小的属性* wrap_content:根据组件内容的大小来决定组件的大小。* fill_parent(或match_parent):使组件填充父组件容器的所有空间。 2)设置组件大小的单位* px(pixels):像素,即屏幕上的发光点。* dp(或dip,即device independent pixels):设备独立像素,一种支持多分辨率设备的抽象单位,和硬件相关。* sp(scaled pixels):比例像素,设置字体大小。 3)设置组件的对齐方式 在布局文件中,由android:gravity属性控制组件的对齐方式,其属性值有上(top)、下(bottom)、左(left)、右(right)、水平方向居中(center_horizontal)、垂直方向居中(center_vertical)等。3.4.2 常见的布局方式 1.线性布局 线性布局(LinearLayout)是Android系统中常用的布局方式之一,它将组件按照水平或垂直方向排列。在XML布局文件中,由根元素LinearLayout来标识线性布局。 在布局文件中,由android:orientation属性来控制排列方向,其属性值有水平(horizontal)和垂直(vertical)两种。* 设置线性布局为水平方向: android:orientation=”horizontal” * 设置线性布局为垂直方向: android:orientation=”vertical” 【例3-5】线性布局应用示例。 创建名为Ex03_05的新项目,包名为com.ex03_05。生成项目框架后,修改界面布局文件activity_main.xml的代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > 6 7 程序的运行结果如图3.8(a)所示。如果将代码中的第5行android:orientation=”vertical”(垂直方向的线性布局)更改为android:orientation=”horizontal”(水平方向的线性布局),则运行结果如图3.8(b)所示。
图3.8 线性布局示例 2.帧布局 帧布局FrameLayout是将组件放置到左上角位置,当添加多个组件时,后面的组件将遮盖之前的组件。在XML布局文件中,由根元素FrameLayout来标识帧布局。 【例3-6】帧布局应用示例。 创建名为Ex03_06的新项目,包名为com.ex03_06。生成项目框架后,将事先准备的图像文件img.png复制到resdrawable-hdpi目录下。 (1)设计界面布局文件activity_main.xml,其代码如下: 1 2 xmlns:android=”http://schemas.android.com/apk/res/android” 4 android:layout_width=”fill_parent” 5 android:layout_height=”fill_parent”> 6 android:id=”@ id/mImageView” 8 android:layout_width=”60px” 9 android:layout_height=”wrap_content” 10 /> 11 android:layout_width=”wrap_content” 13 android:layout_height=”wrap_content” 14 android:text=”快乐大本营” 15 android:textSize=”18sp” 16 /> 17 (2)设计控制文件MainActivity.java,其代码如下: 1 package com.ex03_06; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.widget.ImageView; 5 public class MainActivity extends Activity 6 { 7 ImageView imageview; 8 @Override 9 public void onCreate(Bundle savedInstanceState) 10 { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 imageview=(ImageView) this.findViewById(R.id.mImageView); 14 imageview.setImageResource(R.drawable.img); 15 } 16 } 程序运行结果如图?3.9?所示,可见在界面布局文件中添加的文本框组件遮挡了之前的图像组件。 3.表格布局 表格布局(TableLayout)是将页面划分成由行、列构成的单元格。在XML布局文件中,由根元素TableLayout来标识表格布局。 表格的列数由android:shrinkColumns定义。例如,android:shrinkColumns = “0, 1, 2″,表示表格为3列,其列编号为第1、2、3。 表格的行由?定义。组件放置到哪一列,由android:layout_column指定列编号。 【例3-7】表格布局应用示例。设计一个3行4列的表格布局,组件安排如图3.10所示。 ?图3.9 帧布局示例 图3.10 3行4列的表格布局 创建名为Ex03_07的新项目,包名为com.ex03_07。生成项目框架后,将准备好的图像文件img1.png、img2.png、img3.png、img4.png、img5.png复制到resdrawable-hdpi目录下。 (1)设计表格的界面布局文件activity_main.xml。在图3.10所示的界面布局中,由于有显示图片的空白单元格,这时,可以使用文本标签组件将其文字内容设置为空,这样显示出来的就是空白的单元格了。该文件的代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent”> 5 6 android:layout_width=”wrap_content ” 8 android:layout_height=”wrap_content” 9 android:src=”@drawable/img1″ /> 10 android:layout_width=”wrap_content ” 12 android:layout_height=”wrap_content” 13 android:src=”@drawable/img2″ /> 14 15 16 android:id=”@ id/textView1″ 18 android:layout_width=”wrap_content” 19 android:layout_height=”wrap_content” /> 20 android:layout_width=”wrap_content ” 22 android:layout_height=”wrap_content” 23 android:src=”@drawable/img3″ /> 24 android:layout_width=” wrap_content ” 26 android:layout_height=”wrap_content” 27 android:src=”@drawable/img4″ /> 28 29 30 android:id=”@ id/textView2″ 32 android:layout_width=”wrap_content” 33 android:layout_height=”wrap_content” /> 34 android:id=”@ id/textView3″ 36 android:layout_width=”wrap_content” 37 android:layout_height=”wrap_content” /> 38 android:id=”@ id/textView4″ 40 android:layout_width=”wrap_content” 41 android:layout_height=”wrap_content” /> 42 android:layout_width=”wrap_content ” 44 android:layout_height=”wrap_content” 45 android:src=”@drawable/img5″ /> 46 47 (2)设计控制文件MainActivity.java,其代码如下: 1 package com.ex03_07; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.widget.ImageView; 5 public class MainActivity extends Activity 6 { 7 ImageView img1, img2, img3, img4, img5; 8 @Override 9 public void onCreate(Bundle savedInstanceState) 10 { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 img1=(ImageView)this.findViewById(R.id.mImageView1); 14 img2=(ImageView)this.findViewById(R.id.mImageView2); 15 img3=(ImageView)this.findViewById(R.id.mImageView3); 16 img4=(ImageView)this.findViewById(R.id.mImageView4); 17 img5=(ImageView)this.findViewById(R.id.mImageView5); 18 img1.setImageResource(R.drawable.img1); 19 img2.setImageResource(R.drawable.img2); 20 img3.setImageResource(R.drawable.img3); 21 img4.setImageResource(R.drawable.img4); 22 img5.setImageResource(R.drawable.img5); 23 } 24 } 4.相对布局 相对布局(RelativeLayout)是采用相对其他组件的位置的布局方式。在相对布局中,通过指定id关联其他组件,以右对齐、上对齐、下对齐或居中对齐等方式来排列组件。 在XML布局文件中,由根元素RelativeLayout来标识相对布局。相对布局由于属性较多,下面简单介绍几种常用属性。 设置该控件与父元素右对齐: android:layout_alignParentRight=”true” 设置该控件在id为re_edit_0控件的下方: android:layout_below=”@id/re_edit_0″ 设置该控件在id为re_image_0控件的左边: android:layout_toLeftOf=”@id/re_iamge_0″ 设置当前控件与id为name控件的上方对齐: android:layout_alignTop=”@id/name” 设置偏移的像素值: android:layout_marginRight=”30dip” 该布局方式的属性较多,下面简单归纳一下:* 类:属性值为true或false。 android:layout_centerHrizontal android:layout_centerVertical android:layout_centerInparent android:layout_alignParentBottom android:layout_alignParentLeft android:layout_alignParentRight android:layout_alignParentTop android:layout_alignWithParentIfMissing * 第二类:属性值必须为id的引用名“@id/id-name”。 android:layout_below android:layout_above android:layout_toLeftOf android:layout_toRightOf android:layout_alignTop * 第三类:属性值为具体的像素值,如30dp。 android:layout_marginBottom android:layout_marginLeft android:layout_marginRight android:layout_marginTop 【例3-8】应用相对布局设计一个组件排列如图3.11所示的应用程序。
图3.11 应用相对布局设计组件排列 创建名为Ex03_08的新项目,包名为com.ex03_08。生成项目框架后,修改界面布局文件activity_main.xml的代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent”> 5 android:id=”@ id/label” 7 android:layout_width=”fill_parent” 8 android:layout_height=”wrap_content” 9 android:textSize=”24sp” 10 android:text=”相对布局”/> 11 android:id=”@ id/edit” 13 android:layout_width=”fill_parent” 14 android:layout_height=”wrap_content” 15 android:background=”@android:drawable/editbox_background” 16 android:layout_below=”@id/label”/> 17
图3.18 布局设计 其代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:gravity=”center|fill” 6 android:orientation=”vertical” > 7 android:layout_width=”fill_parent” 9 android:layout_height=”wrap_content” 10 android:gravity=”center” > 11 android:id=”@ id/img” 13 android:layout_width=”240dp” 14 android:layout_height=”240dp” 15 android:layout_centerVertical=”true” 16 android:src=”@drawable/img1″ /> 17 18 android:layout_width=”fill_parent” 20 android:layout_height=”wrap_content” > 21
图3.19 图像显示示例3.6.2 画廊组件Gallery与图片切换器ImageSwitcher Gallery是Android中控制图片展示的组件,它可以横向显示一列图像。Gallery的常用属性及方法见表3-13。表3-13 Gallery的常用属性及方法元 素 属 性对 应 方 法说 明android:spacingsetSpacing(int)设置图片之间的间距,以像素为单位android: unselectedAlphasetUnselectedAlpha(float)设置未选中图片的透明度(Alpha) android: animationDurationset AnimationDuration(int)设置布局变化时动画转换所需的时间(毫秒级),仅在动画开始时计时
onTouchEvent(MotionEvent event)触摸屏幕时触发MotionEvent事件
onDown(MotionEvent e)按下屏幕时触发MotionEvent事件 Gallery经常与图片切换器ImageSwitcher配合使用,用图片切换器ImageSwitcher展示图片效果。使用ImageSwitcher时必须用ViewFactory接口的makeView()方法创建视图。ImageSwitcher的常用方法见表3-14。表3-14 ImageSwitcher的常用方法方 法说 明setInAnimation (Animation inAnimation) 设置动画对象进入屏幕的方式setOutAnimation(Animation outAnimation)设置动画对象退出屏幕的方式setImageResource(int resid)设置显示的初始图片showNext()显示下一个视图showPrevious()显示前一个视图 【例3-14】画廊展示图片示例。 在界面设计中,安排一个画廊组件Gallery和一个图片切换器ImageSwitcher,单击画廊中的小图片,可以在图片切换器中显示放大的图片,如图3.20所示。 图3.20 画廊展示图片示例 程序设计步骤: (1)在界面布局文件中声明画廊组件Gallery和图片切换器ImageSwitcher,采用表格布局。 (2)把事先准备好的图片文件img1.jpg、img2.jpg、…、img8.jpg复制到项目的资源目录resdrawable-hdpi中,在Activity中创建一个图像文件数组imgs[],其数组元素为图片文件。 (3)在Activity中创建画廊组件Gallery和图片切换器ImageSwitcher组件的实例对象。 (4)在Activity中创建一个实现ViewFactory接口的内部类,重写makeView()方法建立imageView图像视图。图片切换器ImageSwitcher通过该图像视图显示放大的图片。 (5)在Activity中创建一个BaseAdapter适配器,用于安排放在画廊Gallery中的图片文件及显示方式。 程序代码: (1)设计界面布局文件activity_main.xml的代码如下: 1 2 ??android:layout_width=”wrap_content” 4 ??android:layout_height=”wrap_content” 5 ??xmlns:android=”http://schemas.android.com/apk/res/android” 6 ??android:layout_gravity=”center”> 7 ?? 12 ?? android:layout_width=”wrap_content” 14 android:layout_height=”wrap_content” 15 android:spacing=”10dp”/> 16 ?? android:layout_width=”wrap_content” 18 android:layout_height=”wrap_content” > 19 ?? ImageSwitcher> 20 /TableLayout> (2)设计控制文件MainActivity.java。在控制文件MainActivity.java中创建图像文件序列数组,并编写按钮的事件处理代码。通过ViewFactory接口建立imageView图像视图,并实现OnItemSelectedListener接口来选择图片。其代码如下: 1 package com.ex03_14; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.view.animation.AnimationUtils; 7 import android.widget.AdapterView; 8 import android.widget.BaseAdapter; 9 import android.widget.Gallery; 10 import android.widget.ImageSwitcher; 11 import android.widget.ImageView; 12 import android.widget.AdapterView.OnItemSelectedListener; 13 import android.widget.ViewSwitcher.ViewFactory; 14 15 public class MainActivity extends Activity 16 { 17 private ImageSwitcher imageSwitcher; 18 Gallery gallery; 19 private int[] imgs={ 20 R.drawable.img1, 21 R.drawable.img2, 22 R.drawable.img3, 23 R.drawable.img4, 24 R.drawable.img5, 25 R.drawable.img6, 26 R.drawable.img7, 27 R.drawable.img8, 28 }; 29 30 @Override 31 public void onCreate(Bundle savedInstanceState) 32 { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 imageSwitcher=(ImageSwitcher)findViewById(R.id.ImageSwitcher01); 36 imageSwitcher.setFactory(new viewFactory()); 37 imageSwitcher.setInAnimation(AnimationUtils 38 .loadAnimation(this, android.R.anim.fade_in) ); 39 imageSwitcher.setOutAnimation(AnimationUtils 40 .loadAnimation(this, android.R.anim.fade_out)); 41 imageSwitcher.setImageResource(R.drawable.img1); 42 gallery=(Gallery)findViewById(R.id.Gallery01); 43 gallery.setOnItemSelectedListener( 44 new onItemSelectedListener()); 45 gallery.setSpacing(10); 46 gallery.setAdapter(new baseAdapter()); 47 } 48 //通过ViewFactory接口建立一个imageView图像视图 49 class viewFactory implements ViewFactory 50 { 51 @Override 52 public View makeView() 53 { 54 ImageView imageView=new ImageView(MainActivity.this); 55 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 56 return imageView; 57 } 58 } 59 //实现选项监听接口,获取选择的图片 60 class onItemSelectedListener implements OnItemSelectedListener 61 { 62 @Override 63 public void onItemSelected(AdapterView> parent, 64 View view,int position, long id) 65 { 66 imageSwitcher.setImageResource( 67 (int)gallery.getItemIdAtPosition(position)); 68 } 69 @Override 70 public void onNothingSelected(AdapterView> arg0) { } 71 } 72 //设置一个适配器,安排放在画廊gallery中的图片文件及显示方式 73 class baseAdapter extends BaseAdapter 74 { 75 //取得gallery内的照片数量 76 public int getCount() 77 {return imgs.length;} 78 public Object getItem(int position) 79 { return null; } 80 //取得gallery内选择的某一张图片文件 81 public long getItemId(int position) 82 { return imgs[position]; } 83 //将选择的图片放置在imageView,且设定显示方式为居中,大小为60?×?60 84 public View getView(int position, View convertView, ViewGroup parent) 85 { 86 ImageView imageView = new ImageView(MainActivity.this); 87 imageView.setImageResource(imgs[position]); 88 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 89 imageView.setLayoutParams(new Gallery.LayoutParams(60, 60)); 90 return imageView; 91 } 92 } 93 } 3.7 消 息 提 示 在Android系统中,可以用Toast来显示帮助或提示消息。该提示消息以浮于应用程序之上的形式显示在屏幕上。因为它并不获得焦点,不会影响用户的其他操作,使用消息提示组件Toast的目的就是为了尽可能不中断用户操作,并使用户看到提供的信息内容。Toast类的常用方法见表3-15。表3-15 Toast类的常用方法常 用 方 法说 明Toast(Context context) Toast的构造方法,构造一个空的Toast对象makeText(Context context, CharSequence text, int duration)以特定时长显示文本内容,参数text为显示的文本,参数duration为显示时间,较长时间取值LENGTH_LONG,较短时间取值LENGTH_SHORTgetView()返回视图setDuration(int duration) 设置存续时间setView(View view) 设置要显示的视图setGravity(int gravity, int xOffset, int yOffset) 设置提示信息在屏幕上的显示位置setText(int resId) 更新makeText()方法所设置的文本内容show()显示提示信息LENGTH_LONG提示信息显示较长时间的常量LENGTH_SHORT提示信息显示较短时间的常量 【例3-15】消息提示Toast分别按默认方式、自定义方式和带图标方式显示的示例。 将事先准备好的图标文件icon.jpg复制到resdrawable-hdpi目录下,以作提示消息的图标之用。 (1)设计界面布局文件activity_main.xml。在界面设计中,设置一个文本标签和3个按钮,分别对应消息提示Toast的3种显示方式。代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > 6 android:layout_width=”fill_parent” 8 android:layout_height=”wrap_content” 9 android:gravity=”center” 10 android:text=”消息提示Tost” 11 android:textSize=”24sp” /> 12
图3.21 消息提示Tost的3种方式3.8 列 表 组 件3.8.1 列表组件ListView类 ListView类是Android程序开发中经常用到的组件,该组件必须与适配器配合使用,由适配器提供显示样式和显示数据。 ListView类的常用方法见表3-16。表3-16 ListView类的常用方法常 用 方 法说 明ListView(Context context)构造方法setAdapter(ListAdapter adapter)设置提供数组选项的适配器addHeaderView(View v)设置列表项目的头部addFooterView(View v)设置列表项目的底部setOnItemClickListener(AdapterView.OnItemClickListener listener)注册单击选项时执行的方法,该方法继承于父类android. widget.AdapterView 【例3-16】列表组件示例。 在界面设计中,设置一个文本标签和一个列表组件ListView。 程序设计步骤: (1)在界面布局文件中声明列表组件ListView。 (2)在Activity中获得相关组件实例。 (3)通过触发列表的选项事件,调用mClick类的onClick()方法显示相应提示内容。 程序代码: (1)设计界面布局文件activity_main.xml。 1 2 6 11 15 (2)设计控制文件MainActivity.java。 1 package com.ex03_16; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.widget.AdapterView; 6 import android.widget.AdapterView.OnItemClickListener; 7 import android.widget.ArrayAdapter; 8 import android.widget.ListView; 9 import android.widget.TextView; 10 import android.widget.Toast; 11 public class MainActivity extends Activity 12 { 13 ListView list; 14 @Override 15 public void onCreate(Bundle savedInstanceState) 16 { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 list= (ListView)findViewById(R.id.ListView01); 20 //定义数组 21 String[] data ={ 22 “(1)荷塘月色”, 23 “(2)炫民族风”, 24 “(3)天蓝蓝”, 25 “(4)美天下”, 26 “(5)自由飞翔”, 27 }; 28 //为ListView设置数组适配器ArrayAdapter 29 list.setAdapter(new ArrayAdapter(this, 30 android.R.layout.simple_list_item_1, data)); 31 //为ListView设置列表选项监听器 32 list.setOnItemClickListener(new mItemClick()); 33 } 34 //定义列表选项监听器的事件 35 class mItemClick implements OnItemClickListener 36 { 37 @Override 38 public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) 39 { 40 Toast.makeText(MainActivity,”您选择的项目是:” 41 ((TextView)arg1).getText(), Toast.LENGTH_SHORT).show(); 42 } 43 } 44 } 语句说明: (1)android.R.layout.simple_list_item_1是一个Android系统内置的ListView布局方式。* android.R.layout.simple_list_item_1:一行text。* android.R.layout.simple_list_item_2:一行title,一行text。* android.R.layout.simple_list_item_single_choice:单选按钮。* android.R.layout.simple_list_item_multiple_choice:多选按钮。 (2)OnItemClickListener是个接口,用于监听列表组件选项的触发事件。 (3)Toast.makeText().show()显示提示消息框。 程序的运行结果如图3.22所示。
图3.22 列表组件示例3.8.2 列表组件ListActivity类 当整个Activity中只有一个ListView组件时,可以使用ListActivity。其实,ListActivity和一个只包含一个ListView组件的普通Activity没有太大区别,只是实现了一些封装而已。ListActivity类继承于Activity类,默认绑定了一个ListView组件,并提供了一些与ListView处理相关的操作。 ListActivity类常用的方法为getListView(),该方法返回绑定的ListView组件。 【例3-17】ListActivity应用示例。 (1)设计界面布局文件activity_main.xml,其代码如下: 1 2 android:layout_width=”fill_parent” 4 android:layout_height=”fill_parent” 5 android:orientation=”vertical” > 6 android:id=”@ id/android:list” 8 android:layout_height=”wrap_content” 9 android:layout_width=”fill_parent” /> 10 说明: ListActivity布局文件中的ListView组件的id应设为”@id/android:list”。 (2)设计控制文件MainActivity.java,其代码如下: 1 package com.ex03_17; 2 import android.app.ListActivity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.widget.AdapterView; 6 import android.widget.ArrayAdapter; 7 import android.widget.ListView; 8 import android.widget.TextView; 9 import android.widget.Toast; 10 import android.widget.AdapterView.OnItemClickListener; 11 public class MainActivity extends ListActivity 12 { 13 @Override 14 public void onCreate(Bundle savedInstanceState) 15 { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 //定义数组 19 String[] data={ 20 “(1)荷塘月色”, 21 “(2)炫民族风”, 22 “(3)天蓝蓝”, 23 “(4)美天下”, 24 “(5)自由飞翔”, 25 }; 26 //获取列表项 27 ListView list=getListView(); 28 //设置列表项的头部 29 TextView header=new TextView(this); 30 header.setText(“凤凰传奇经典歌曲”); 31 header.setTextSize(24); 32 list.addHeaderView(header); 33 //设置列表项的底部 34 extView foot=new TextView(this); 35 foot.setText(“请选择”); 36 foot.setTextSize(24); 37 list.addFooterView(foot); 38 setListAdapter(new ArrayAdapter(this, 39 android.R.layout.simple_list_item_1, data)); 40 list.setOnItemClickListener(new mItemClick()); 41 } 42 //定义列表选项监听器 43 class mItemClick implements OnItemClickListener 44 { 45 @Override 46 public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) 47 { 48 Toast.makeText(getApplicationContext(), 49 “您选择的项目是:” ((TextView)arg1).getText(), 50 Toast.LENGTH_SHORT).show(); 51 } 52 } 53 } 程序的运行结果如图3.23所示。
图3.23 ListActivity应用示例3.9 滑动抽屉组件 在日常生活中,当杂乱的物品很多时,可以把这些物品分类整理好放在不同的抽屉中,这样在使用物品时,打开抽屉,里面的东西一目了然。在Android系统中,也可以把多个程序放到一个应用程序的抽屉里。如图3.24(a)所示,单击“向上”按钮(称为手柄)时,打开抽屉;如图3.24(b)所示,单击“向下”按钮时,关闭抽屉。 ? (a)单击“向上”按钮,将打开抽屉 ??? (b)单击“向下”按钮,将关闭抽屉图3.24 滑动抽屉示例 使用?Android?系统提供的?SlidingDraw?组件可以实现滑动抽屉的功能。先来看一下SlidingDraw类的重要方法和属性,其重要的XML属性如表3-17所示。表3-17 SlidingDraw类重要的XML属性属 性说 明android:allowSingleTap设置通过手柄打开或关闭滑动抽屉android:animateOnClick单击手柄时,是否加入动画,默认为trueandroid:handle指定抽屉的手柄handleandroid:content隐藏在抽屉里的内容android:orientation滑动抽屉内的对齐方式 SlidingDraw类的重要方法如表3-18所示。表3-18 SlidingDraw类的重要方法方 法说 明animateOpen()关闭时实现动画animateOpen()打开时实现动画getContent()获取内容getHandle()获取手柄setOnDrawerOpenListener(SlidingDrawer.OnDrawerOpenListener onDrawerOpenListener)打开抽屉的监听器setOnDrawerCloseListener(SlidingDrawer.OnDrawerCloseListener onDrawerCloseListener)关闭抽屉的监听器setOnDrawerScrollListener(SlidingDrawer.OnDrawerScrollListener onDrawerScrollListener)打开/关闭切换时的监听器 【例3-18】实现图3.24所示的滑动抽屉SlidingDraw组件的应用示例。 事先准备好两个图标文件,分别命名为up.jpg和down.jpg,将它们复制到resdrawable-hdpi目录下,以作滑动抽屉的手柄之用。 (1)设计界面布局文件Activity_main.xml。 在XML文件中设置一个SlidingDraw组件,然后设置一个图标按钮ImageButton作为抽屉手柄。activity_main.xml的代码如下: 1 xmlns:tools=”http://schemas.android.com/tools” 3 android:id=”@ id/LinearLayout1″ 4 android:layout_width=”match_parent” 5 android:layout_height=”match_parent” 6 android:orientation=”vertical” > 7 8 android:layout_width=”fill_parent” 10 android:layout_height=”fill_parent” 11 android:handle=”@ id/handle” 12 android:content=”@ id/content” 13 android:orientation=”vertical” 14 android:id=”@ id/slidingdrawer” > 15 16 21 22 android:id=”@id/content” 24 android:layout_width=”fill_parent” 25 android:layout_height=”fill_parent” 26 android:background=”#66cccc” 27 android:focusable=”true” > 28 29 30 (2)设计控制文件MainActivity.java。在控制程序MainActivity.java中,主要是实现滑动抽屉的几个监听事件。其代码如下: 1 package com.example.ex03_18; 2 import android.os.Bundle; 3 import android.app.Activity; 4 import android.widget.ArrayAdapter; 5 import android.widget.ImageButton; 6 import android.widget.LinearLayout; 7 import android.widget.ListView; 8 import android.widget.SlidingDrawer; 9 import android.widget.Toast; 10 11 public class MainActivity extends Activity 12 { 13 SlidingDrawer mDrawer; 14 ImageButton imgBtn; 15 ListView listView; 16 LinearLayout layout; 17 String data[]=new String[]{“使命召唤”,”植物大战僵尸”,”愤怒的小鸟”}; 18 @Override 19 public void onCreate(Bundle savedInstanceState) 20 { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 layout=(LinearLayout) findViewById(R.id.content); 24 listView = new ListView(MainActivity.this); 25 listView.setAdapter(new ArrayAdapter( 26 MainActivity.this, 27 android.R.layout.simple_expandable_list_item_1, 28 data)); 29 layout.addView(listView); 30 imgBtn=(ImageButton)findViewById(R.id.handle); 31 mDrawer=(SlidingDrawer)findViewById(R.id.slidingdrawer); 32 mDrawer.setOnDrawerOpenListener(new mOpenListener()); 33 mDrawer.setOnDrawerCloseListener(new mCloseListener()); 34 mDrawer.setOnDrawerScrollListener(new mScrollListener()); 35 } 36 37 class mOpenListener implements SlidingDrawer.OnDrawerOpenListener 38 { 39 @Override 40 public void onDrawerOpened() 41 { 42 imgBtn.setImageResource(R.drawable.down); 43 } 44 } 45 46 class mCloseListener implements SlidingDrawer.OnDrawerCloseListener 47 { 48 @Override 49 public void onDrawerClosed() 50 { 51 imgBtn.setImageResource(R.drawable.up); 52 } 53 } 54 55 class mScrollListener implements SlidingDrawer.OnDrawerScrollListener 56 { 57 @Override 58 public void onScrollEnded() 59 { 60 Toast.makeText(MainActivity.this, “结束拖动”, 61 Toast.LENGTH_SHORT).show(); 62 } 63 @Override 64 public void onScrollStarted() 65 { 66 Toast.makeText(MainActivity.this, “窗口拖动开始”, 67 Toast.LENGTH_SHORT).show(); 68 } 69 } 70 } 习 题 3 1.编写程序,实现如图3.25所示的功能,即单击按钮,在文本编辑框中输入的文字内容显示到文本标签中。
图3.25 文本编辑框中的文字内容显示到文本标签中 2.设计一个加法计算器,如图3.26所示,在前两个文本编辑框中输入整数,单击“=”按钮时,在第3个文本编辑框中显示这两个数之和。
图3.26 加法计算器 3.设计如图3.27所示的用户界面布局。
图3.27 设计用户界面 4.参照例3-14,将画廊的小图片显示到屏幕的下方,在图片切换器中显示的放大图片显示在屏幕的上方。
评论
还没有评论。