在MainActivity中使用
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RelativeLayout layout=(RelativeLayout) findViewById(R.id.main); layout.addView(new DrawGeometryView(this)); } 2.1 绘制简单几何图形运行结果:
定义显示闪烁的信号灯View
public { private int count=0; public SignalLightView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); } @Override protected void onDraw(Canvas canvas) { if(count<100){ count++; }else{ count=0; } Paint paint=new Paint(); paint.setStrokeWidth(3.0f); switch(count%4){ case 0: paint.setColor(Color.GREEN); break; case 1: paint.setColor(Color.RED); break; case 2: paint.setColor(Color.BLUE); break; case 3: paint.setColor(Color.YELLOW); break; default: paint.setColor(Color.WHITE); break; } canvas.drawCircle(80, 160, 50, paint);// 画圆,圆心的坐标(cx,cy)和半径radius }}在MainActivity中使用信号灯
package cmo.learn.ui;import android.app.Activity;import android.os.Bundle;import android.widget.RelativeLayout;public Runnable{ @Override public void run() { while(!Thread.currentThread().isInterrupted()){ try { Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } signalView.postInvalidate();//使得原来的View重绘即重新调用onDraw方法 } } }}举第二个例子只是为了简单演示View的绘制即显示机制,正如前面所说的View的效果是在onDraw中完成的,那么onDraw除了系统自动调用执行以外,我们是否能自主去触发呢?答案是肯定的,其中一种方式就是通过调用invalidate方法(主线程中是通过invalidate方法;子线程里则是调用postInvalidate),只要我们主动去通过自定义View去调用invalidate方法致使Canvas失效,Android就会自动再去触发onDraw方法。
小结深究下去,我们可以把这个Canvas看成Android系统提供给我们的一块内存区域(但其实质上只是一套绘图的API,真正的内存里保存的是Bitmap),而且它还提供了一整套对该内存区域进行操作的方法。这种方式根据环境还分为两种:一种就是使用普通View的Canvas画图,还有一种就是使用专门的SurfaceView的Canvas来画图。两者的区别在于可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏、播放视频等,高品质动画方面的绘图