Android 应用的绝大部分UI组件都放在——android.widget包及其子包、android.view包及其子包中。
Android 应用的所有UI都继承了View类。
View 类还有一个重要的子类——ViewGroup ,但是它通常是作为其他组件的容器使用。
Android 推荐使用XML布局文件来开发定义用户界面,而不是使用JAVA代码来开发。尽管而已,Android
里的所有组件,还是提供了这两种不同的方式来控制组件的行为。
(1)在XML中利用XML属性进行控制;
(2)在Java程序代码中通过调用方法来进行控制;
下面就结合这两者,XML和JAVA程序来开发一个简单的安卓手机程序——跟着鼠标动的小球。
一、程序及详细注释
1、java 程序
public class DrawView extends View
{
public float currentX = 40; //定义浮点型公共变量,当前X=40;
public float currentY = 50;
// 定义、并创建画笔
Paint p = new Paint(); //Paint 是继承于Object大类下的一个公共类,其中公共构造方法有三个,Paint()是其中一个,创建一个新的默认所有状态的画笔
public DrawView(Context context) //定义一个构造方法
{
super(context); //调用父类的构造方法,用super,context 是背景的意思
}
//View父类的公共构造方法有三个,上面用的是第一个,作用是:简单地创建一个视图,第二个则用在下面,作用是使得该构造方法
可以在布局文件XML中被调用
public DrawView(Context context , AttributeSet set) //调用父类构造方法,背景和设置
{
super(context ,set);
}
@Override
public void onDraw(Canvas canvas) //定义一个无返回值的成员方法
{
super.onDraw(canvas);
// 设置画笔的颜色
p.setColor(Color.RED); //引用画笔的一个设置颜色的方法,具体参考http://developer.android.com/intl/zh-cn/reference/android/graphics/Paint.html
// 绘制一个小圆(作为小球)
canvas.drawCircle(currentX, currentY, 15, p);
//关于drawCircle 当然是Canvas类的一个方法
void android.graphics.Canvas.drawCircle(float cx, float cy, float radius, Paint paint)
public void drawCircle (float cx, float cy, float radius, Paint paint)x坐标,y坐标,半径和画笔
Draw the specified circle using the specified paint. If radius is <= 0, then nothing will be drawn. The circle will be filled or framed based on the Style in the paint.
}
// 为该组件的触碰事件重写事件处理方法,返回值为布尔型
@Override
public boolean onTouchEvent(MotionEvent event)
{
// 修改currentX、currentY两个属性
currentX = event.getX(); //getx() 是MotionEvent 类的一个最终方法,返回当前x坐标值
currentY = event.getY();
// 通知当前组件重绘自己
invalidate(); //废止,刷新的意思, 刷新view的方法这里主要有invalidate(int l, int t, int r, int b) 刷新局部,四个参数分别为左、上、右、下。整个view刷新 invalidate(),刷新一个矩形区域 invalidate(Rect dirty) ,刷新一个特性Drawable, invalidateDrawable(Drawable drawable) ,执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。
// 返回true表明该处理方法已经处理该事件
return true;
}
}
/*-----------------------------------------------------------*/
2、XML程序
XML布局文件的内容如下:
<>
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/root">
对上述代码的分析:
(1)xmlns 是XHTML namespace的缩写,“HTML名字空间”的意思,,XML中允许用户自定义标识,但是为了避免在文件交换或者共享的时候,与他人定义的名字重复而产生冲突,所以XML采用xmlns 名字空间声明,允许你给他一个网址,作为其内容;通过一个网址来指向识别你的名字;
(2)orientation 就是方向的意思,有两个选择,垂直方向是vertical ,水平方向是horizontal
(3) android:layout_width="fill_parent"
android:layout_height="fill_parent"
这两个就是布局宽度和高度的设定了,一般有两种选择
-
fill_parent 布满整个屏幕
-
wrap_content 根据内容自动拉伸
(4)android:id="@+id/root"
布局文件ID号,root 是默认的,你可以修改,但是在主java程序里获取线性布局容器时候,要一一对应。如,我这里改为android:id="@+id/test" ,那么在java中,R.id.test 必须对应。
LinearLayout root = (LinearLayout)findViewById(R.id.test);
在上面的例子当中,我们使用的是在Activity 中添加这个画圆的组件,但是
//获取布局文件中的线性布局容器
// LinearLayout root = (LinearLayout)findViewById(R.id.test);
// //创建DrawView 组件
// final DrawView draw = new DrawView(this);
// //设置自定义组件的最大宽度和高度
// draw.setMinimumHeight(200);
// draw.setMinimumWidth(300);
// root.addView(draw);
这一段代码我仍然觉得多了,不如,我们换一个方法——在XML中管理该组件,一样可以实现该组件。
在java文件中将上述代码注释掉或者删掉。
然后再XML文件中添加如下代码
<>
android:layout_width="match_parent"
android:layout_height="match_parent"/>
注意,开始的com.example.test2是你的包名字,在java文件一开头自己建工程那会设定的,然后“.DrawView”引用该组件。
保存,运行。
效果如下图:
用户403664 2013-12-17 13:48
345002072_353389109 2013-12-17 11:26
345002072_353389109 2013-12-17 11:25
用户1720630 2013-12-14 16:39
用户1376226 2013-12-13 14:05
用户403664 2013-12-13 09:57
345002072_353389109 2013-12-8 21:47
用户403664 2012-9-25 17:28