SurfaceView组件能够实现高效率的绘制二维图或者显示图像,在游戏开发中常常用到。在android中,已经提供了SurfaceView组件。使用时,通常是经过继承的方法实现自定义surfaceView,也能够在MainActivity中经过接口surfaceHolder.callback接口实现,这里介绍经过接口实现surfaceView绘图,固然,绘图能够是静态图(在指定区域只绘制一次),也能够是动态图(指定区域-->绘制-->再循环)。java
SurfaceView组件的使用流程:经过findViewById()实例化SurfaceView组件,获得实例化对象;利用getHolder()方法获得SurfaceViewHolder类对象,为该对象添加callBack(Context context)回调;在surfaceCreate()方法中添加surfaceView刚显示的初始化代码,这个方法在实例化SurfaceView组件时执行,好比能够初始化背景颜色,绘图区显示出的形状、坐标等;surfaceChanged()方法主要是在surfaceView对象大小、形状改变时调用;surfaceDestroyed()方法是在surfaceView销毁时调用,通常是添加kill代码。android
在SurfaceView组件显示区域上,实现绘制二维图形须要三个类:Paint、Canvas和SurfaceHolder类。其中Paint类指的是画笔,能够设置画笔的颜色(相似于红笔芯仍是蓝笔芯),画笔显示的线宽(相似于0.35mm仍是0.5mm)等;Canvas类至关于画布,它经过SurfaceHolder类中的lockCanvas()方法得到,这个lockCanvas()方法能够带有参数,用来指定锁定画布的区域(也就是说,画布锁定的区域不必定是surfaceView定义的所有区域,也能够是参数指定的部分区域),当锁定了区域以后,就能够经过Canvas类实例对象所提供的方法来绘制点、线、圆、矩形、图像等,这些方法中的参数通常会有Paint类对象。canvas
须要注意的一点是,在锁定画布区域进行绘制图形或者图像的代码,通常是开一个独立线程进行的,这个线程能够在surfaceCreate()方法中开启。app
唉,图片加不上去,只能贴代码了。ide
package com.main.dfa_surfaceview; import android.support.v7.app.ActionBarActivity; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback { Button btn1=null; SurfaceView sfc=null; SurfaceHolder holder=null; Paint paint_one=null; Paint paint_two=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn1=(Button)findViewById(R.id.btn1); sfc=(SurfaceView)findViewById(R.id.surfaceView1); holder=sfc.getHolder(); //获得surfaceView的holder,相似于surfaceView的控制器 holder.addCallback(this); paint_one=new Paint(); //获取画笔实例 paint_two=new Paint(); paint_one.setColor(Color.BLUE); //画笔颜色 paint_two.setColor(Color.GREEN); paint_one.setStrokeWidth(20); //设置线宽 paint_two.setStrokeWidth(10); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show(); MyThread mthread=new MyThread(); mthread.start(); } }); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub //当surfaceView建立的时候执行 init_background();//初始化绘图界面 } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub } private void init_background(){ Canvas canvas=null; canvas=holder.lockCanvas();//获取目标画图区域 canvas.drawColor(Color.RED);//画布背景颜色 holder.unlockCanvasAndPost(canvas); //解除锁定并显示 } private class MyThread extends Thread{ public void run(){ Canvas canvas=null; canvas=holder.lockCanvas();//获取目标画图区域,无参数表示锁定的是所有绘图区 canvas.drawColor(Color.RED);//画布背景颜色设置 canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)为圆心,画一个半径为50像素的圆 canvas.drawCircle(50, 50, 50, paint_two); holder.unlockCanvasAndPost(canvas); //解除锁定并显示 } } }