今天开始学习了Android中的动态图形的绘制,直接用个例子上手;


基本思路如下:

一:创建一个继承与View类自定义类,本例是(CanvasView),必须要有构造方法(可以使用1:public View(Context context);2:public View(Context context, AttributeSet attrs);3:public View(Context context, AttributeSet attrs, int defStyle)的其中一个);

二:覆盖其中的onDraw()方法;使用其中Canvas对象在界面上面绘制图形;

三;然后我们可以通过postInvalidate()或者invalidate()方法来调用onDraw()方法来进行图形的重绘.


【注:invalidate ()和postInvalidate()方法的选择:文档中已经写的很清楚了,如果要使用invalidate()必须要在UI主线程当中,如果不在UI主线程中,就要去调用postInValidate()】

下面是我写的一个例子:使用了两种更新的方法1:Handler结合invalidate();2:直接使用postInvalidate()

实现的效果是:在屏幕上面画一个矩形,然后开个线程,让矩形每隔一秒改变颜色,并且矩形以x轴和y轴分别同时加+1想右下角移动.

看下效果图:

第一种方法代码如下:【直接使用postInvalidate()】

package com.jiangqq.csdn;/** * 自定义组件画组件 */import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.View;public class CanvasView extends View {public int x = 0;public int y = 0;public int mIndex = 0;//必须加入构造函数,也可以使用另外两个构造函数public CanvasView(Context context) {super(context);//下面两个设置聚焦和触摸模式,可以不设置,这里设置了,因为其他地方要加入这两个事件setFocusable(true);setFocusableInTouchMode(true);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return false;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (mIndex < 100) {mIndex++;} else {mIndex = 0;}Paint _Paint = new Paint();switch (mIndex % 4) {case 0:_Paint.setColor(Color.RED);break;case 1:_Paint.setColor(Color.BLUE);break;case 2:_Paint.setColor(Color.YELLOW);break;case 3:_Paint.setColor(Color.LTGRAY);break;}canvas.drawRect(x, y, x + 100, y + 100, _Paint);}}
主Activity类如下:
private CanvasView _CanvasView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);_CanvasView = new CanvasView(this);setContentView(_CanvasView);new Thread(new MyGameCanvas()).start();}class MyGameCanvas implements Runnable {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}update();_CanvasView.postInvalidate();}}}/** * 更新坐标方法 */private void update() {int w = getWindowManager().getDefaultDisplay().getWidth();_CanvasView.x += 1;_CanvasView.y += 1;if (_CanvasView.x >= w) {_CanvasView.x = 0;}}


第二种方法Handler和invalidate()结合使用:

首先是线程方法(里面有Handler发送消息):

class MyThread implements Runnable {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(100);                    //发送消息来更新界面 Message msg=new Message(); msg.what=1; mHandler.sendMessage(msg);} catch (InterruptedException e) {e.printStackTrace();}}}}
接下来是Handler的接受消息的处理方法:

private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:update();_CanvasView.invalidate();break;}}};


源代码下载链接:

http://download.csdn.net/detail/jiangqq781931404/4072840


更多相关文章

  1. android中菜单以及自定义组件的使用
  2. 在android中使用OpenGL
  3. Android的移动存储解决方案之SharedPreferences
  4. Android(安卓)Service生命周期
  5. 浅谈Java中Collections.sort对List排序的两种方法
  6. 箭头函数的基础使用
  7. NPM 和webpack 的基础使用
  8. Python list sort方法的具体使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. Android(安卓)shape 参数
  2. Android(安卓)WebView对https无响应
  3. android常用权限
  4. android attr.xml文件
  5. Android定义宽高比控件
  6. android 调用摄像头
  7. android manifest文件结构
  8. android 加密字符串
  9. Android版本名称、版本号、API level对应
  10. android manifest文件结构