今天开始学习了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); }  @Override public boolean onTouchEvent(MotionEvent event) { return false; }  @Override protected 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; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _CanvasView = new CanvasView(this); setContentView(_CanvasView); new Thread(new MyGameCanvas()).start(); }  class MyGameCanvas implements Runnable {  @Override public 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 { @Override public 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() { @Override public 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中SQLiteOpenHelper类的onUpgrade方法的作用
  2. android TabHost(选项卡)的使用方法
  3. Android使用系统方法实现分享到QQ和微信!
  4. Android多种方法获取系统时间
  5. intelliJ IDEA 创建maven android工程的方法
  6. Android5.1系统通过包名给应用开放系统权限的方法
  7. Android MP4取得播放时长的方法
  8. Android中执行java命令的方法及java代码执行并解析shell命令

随机推荐

  1. mac下eclipse使用
  2. Android之指南针学习
  3. fedora20 cocos2d-x 3.2 开发环境配置(fo
  4. Android(安卓)Studio如何更改JDK和SDK的
  5. pc android sqlcipher 加密
  6. Android(安卓)学习记录-SQLite
  7. Android(安卓)Widevine 基本概念
  8. 杂乱之android的Spinner应用
  9. android OTA差分包的生成方法
  10. Android实现三级联动下拉框 下拉列表spin