android简单的GDI绘图方法

参照Android中SurfaceView的使用示例,写了个最简单的绘图应用。

在屏幕上画了个红色的矩形框。

这里使用的View不是普通的类型,因为普通类型都是有UI线程来绘制的。SurfaceView可使用独立线程绘制,比如以前也使用过,用于视频输出,见编写简单自定义VideoView。

此外,还需要使用SurfaceHolder接口,它是用于处理SurfaceView包含的Surface的,Surface可直译为表面,可以看作是一个可绘制的视图部分。需要通过SurfaceHolder来操作它。

Surface可以设置Canvas,即画布,顾名思义,是用来作画的。Canvas涉及到四个基本对象概念:

  • Bitmap,位图,可以看作是矩形像素点的集合
  • Canvas,画布,通过Canvas写入Bitmap
  • 基本的作画元素,比如矩形框Rect对象,作画路径Path对象,文本以及位图Bitmap
  • Paint,描述作画的颜色以及风格(比如是填满,还是只画线条等)

以上是作画需要了解的静态对象和结构,具体动作,需要通过SurfaceHolder的Callback接口来实现。开发者实现该接口,然后由Android回调来绘制所需的内容。

分析一下源代码,Activity代码很简单,这里都没用到layout文件:

1
2
3
4
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(new MySurfaceView(this)); 
}

主要看MySurfaceView的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.easymorse.surface;
 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView;
 
public class MySurfaceView extends SurfaceView {
 
    public MySurfaceView(Context context) { 
        super(context); 
        this.getHolder().addCallback(new Callback() {
 
            @Override 
            public void surfaceDestroyed(SurfaceHolder holder) { 
            }
 
            @Override 
            public void surfaceCreated(final SurfaceHolder holder) { 
                new Thread() { 
                    public void run() { 
                        Canvas canvas=holder.lockCanvas(); 
                        Paint paint=new Paint(); 
                        paint.setColor(Color.RED); 
 
                        canvas.drawRect(new Rect(40, 60, 180, 180), paint);
                        holder.unlockCanvasAndPost(canvas); 
                    } 
                }.start(); 
            }
 
            @Override 
            public void surfaceChanged(SurfaceHolder holder, int format, 
                    int width, int height) { 
            } 
        }); 
    }
 
}

主要代码就是加入Callback实现的回调。

只需实现surfaceCreated方法就可以完成红色矩形框的绘制。

在绘制前,需要得到Canvas对象,通过锁住SurfaceHolder得到。这时才可以开始对Canvas编辑。编辑完毕后,想着解锁,调用unlockCanvasAndPost可做到这一点。该方法还会提交编辑,在屏幕上显示刚刚编辑的内容。

如果忘记调用unlockCanvasAndPost方法,将不能写入到屏幕,而且会造成应用失去响应,报错是:

ERROR/ActivityManager(92): Reason: keyDispatchingTimedOut

本例画的内容很简单,创建了Paint,并且声明了颜色。矩形的生成参数和iOS有区别,前者是取左上定点和右下定点的坐标,后者是取左上定点坐标,以及矩形的长和宽。觉得后者比较直观一些。

另外,了解了一下Paint中style的含义,比如设置:

paint.setStyle(Paint.Style.STROKE);

则画出来的矩形是这样的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值