android:layout_height="match_parent"
android:background="@drawable/background"
android:id="@+id/mylayout"
>
(2)创建一个名称为RabbitView的Java类,该类继承自android.view.View类,重写带一个参数Context的构造方法和onDraw()方法。其中,在构造方法中设置兔子的默认显示位置,在onDraw()方法中根据图片绘制小兔子。RabbitView类的关键代码如下:
public class RabbitView extends View {
public float bitmapX; //小兔子显示位置的X坐标
public float bitmapY; //小兔子显示位置的Y坐标
public RabbitView(Context context) { //重写构造方法
super(context);
bitmapX = 750; //设置小兔子默认显示位置的X坐标
bitmapY = 500; //设置小兔子默认显示位置的Y坐标
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint(); //创建并实例化Paint的对象
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),
R.drawable.rabbit); //根据图片生成位图对象
canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint); //绘制小兔子
if (bitmap.isRecycled()) { //判断图片是否回收
bitmap.recycle(); //强制回收图片
}
}
}
(3)在主活动的onCreate()方法中,首先获取帧布局管理器并实例化小兔子对象rabbit,然后为rabbit添加触摸事件监听器,在重写的触摸事件中设置rabbit的显示位置并重绘rabbit组件,最后将rabbit添加到布局管理器中,关键代码如下:
FrameLayout frameLayout=(FrameLayout)findViewById(R.id.mylayout); //获取帧布局管理器
final RabbitView rabbit=new RabbitView(MainActivity.this); //创建并实例化RabbitView类
//为小兔子添加触摸事件监听器
rabbit.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
rabbit.bitmapX=event.getX(); //设置小兔子显示位置的X坐标
rabbit.bitmapY=event.getY(); //设置小兔子显示位置的Y坐标
rabbit.invalidate(); //重绘rabbit组件
return true;
}
});
frameLayout.addView(rabbit); //将rabbit添加到布局管理器中
运行本实例,将显示如图3.7所示的运行结果。当用手指在屏幕上拖动时,小兔子将跟随手指的拖动轨迹移动。
图3.7 跟随手指的小兔子
3.2 布局管理器
教学录像:光盘\TM\lx\3\布局管理器.exe
在Android中,每个组件在窗体中都有具体的位置和大小,在窗体中摆放各种组件时,很难进行判断。不过,使用Android布局管理器可以很方便地控制各组件的位置和大小。Android中提供了线性布局管理器(LinearLayout)、表格布局管理器(TableLayout)、帧布局管理器(FrameLayout)、相对布局管理器(RelativeLayout)和绝对布局管理器(AbsoluteLayout),对应于这5种布局管理器,Android提供了5种布局方式,其中,绝对布局在Android 2.0中被标记为已过期,可以使用帧布局或相对布局替代,所以本节将只对前4种布局方式进行详细介绍。
3.2.1 线性布局
线性布局是将放入其中的组件按照垂直或水平方向来布局,也就是控制放入其中的组件横向或纵向排列。在线性布局中,每一行(针对垂直排列)或每一列(针对水平排列)中只能放一个组件,并且Android的线性布局不会换行,当组件排列到窗体的边缘后,后面的组件将不会被显示出来。
说明: 在线性布局中,排列方式由android:orientation属性来控制,对齐方式由android:gravity属性来控制。
在Android中,可以在XML布局文件中定义线性布局管理器,也可以使用Java代码来创建(推荐使用前者)。在XML布局文件中定义线性布局管理器时,需要使用
属性列表
>
在线性布局管理器中,常用的属性包括android:orientation、android:gravity、android:layout_width、android:layout_height、android:id和android:background。其中,前两个属性是线性布局管理器支持的属性,后面4个是android.view.View和android.view.ViewGroup支持的属性,下面进行详细介绍。
1. android:orientation属性
android:orientation属性用于设置布局管理器内组件的排列方式,其可选值为horizontal和vertical,默认值为vertical。其中,horizontal表示水平排列;vertical表示垂直排列。
2. android:gravity属性
android:gravity属性用于设置布局管理器内组件的对齐方式,其可选值包括top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical和clip_horizontal。这些属性值也可以同时指定,各属性值之间用竖线隔开。例如,要指定组件靠右下角对齐,可以使用属性值right|bottom。