原创 Android笔记4-界面编程之会动的小球

2014-7-29 20:26 3270 22 29 分类: 软件与OS 文集: Android
  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”引用该组件。
保存,运行。
效果如下图:
120806.jpg
PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户403664 2013-12-17 13:48

你跟老前辈Galee说一起加油~

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

非常详细,赞! 我虽然写了好几个安卓程序了,可是大框架都是COPY的,知其然不知其所以然,哈哈

用户403664 2013-12-13 09:57

你就来开篇啦!

345002072_353389109 2013-12-8 21:47

好像博客里没有几个人搞安卓开发吧。。好吧。其实有兴趣的学习也不错的。现在安卓开发工作可好找了。

用户403664 2012-9-25 17:28

欢迎
相关推荐阅读
啊左不是蜗牛 2015-01-28 09:21
【博客大赛】那样的人生,看不穿
         昨晚11点跟PM姐姐聊天,问她今晚要不要加班,她回:刚刚开发哥哥陪她出来打的。。。我以为我十点半从实验室回去已经够晚了。。我脸红了。        我问她为什么不早点回去...
啊左不是蜗牛 2015-01-13 19:41
【智能手机】三个观点说说国产手机未来
在此篇文章之前还有一个各大手机品牌的总结,请点击查看。 智能手机之论英雄出处      谈手机之前换个角度,类比一下PC领域。 PC领域毛利最高的时候,国产PC一直混在低端。随着时代发...
啊左不是蜗牛 2015-01-09 17:56
【智能手机】论英雄出处
我认为,如果你不知道对手的底细,那么你就很难战胜对手。知己知彼,百战百胜。所以,我简单地说说我对这几家手机品牌的看法。个人之见,欢迎讨论。   苹果: 1976年成立,在乔布斯这样的天...
啊左不是蜗牛 2014-11-19 13:48
【博客大赛】蜗牛求职记之华为篇
1、前言说明          蜗牛是电赛出身,本科做硬件嵌入式,画板子和写C程序,然后研究生阶段是转战android,但是由于项目涉及到硬件,导师项目众多,小伙伴少,于是我也负责部分st...
啊左不是蜗牛 2014-08-16 14:38
以另一种位图的思想来解决一道OJ题目
前言: 以前所接触到的位图的思想都是以1位的形式去存储某个数出现的次数是1次还是0次。常见的例子不外乎在《编程珠玑》上的开篇例子里,1千万个数的排序统计,用1.25M的内存空间就可以达到遍历一...
啊左不是蜗牛 2014-08-15 11:57
Android 笔记之 listview 性能优化
列表显示需要三个元素, (1)listview 视图,用来显示列表的View ; (2)适配器,用来把数据映射到listView上面的 (3)数据,具体将被映射的数据,包括字符串,图片...
EE直播间
更多
我要评论
7
22
关闭 站长推荐上一条 /3 下一条