万书网 > 文学作品 > Android从入门到精通 > 第14页

第14页





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。