SurfaceView extends View
其实View是在UI线程中进行绘制
SurfaceView是在一个子线程中对自己进行绘制,优势:避免造成UI线程阻塞
其实呢,我们SurfaceView中包含一个专门用于绘制的Surface,Surface中包含一个Canvas
如何获得Canvas?
getHolder->SurfaceHolder
holder ->Canvas +管理SurfaceView的生命周期
surfaceCreated
surfaceChanged
surfaceDestroyed
Surface模板
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* Created by TONG on 2017/3/22.
*/
public class SurfaceTemplate extends SurfaceView implements SurfaceHolder.Callback,Runnable {
private SurfaceHolder mHolder;
private Canvas mCanvas;
/**
* 用于绘制的线程
*/
private Thread t;
/**
* 线程的控制开关
*/
private boolean isRunning;
public SurfaceTemplate(Context context) {
this(context,null);
}
public SurfaceTemplate(Context context, AttributeSet attrs) {
super(context, attrs);
mHolder=getHolder();
mHolder.addCallback(this);
//获得焦点
setFocusable(true);
setFocusableInTouchMode(true);
//设置常量
setKeepScreenOn(true);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
isRunning=true;
t=new Thread(this);
t.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
isRunning=false;
}
@Override
public void run() {
//不断进行绘制
while (isRunning){
draw();
}
}
private void draw() {
try {
mCanvas=mHolder.lockCanvas();
if(mCanvas!=null){
//draw something
}
} catch (Exception e) {
}finally {
if(mCanvas!=null)
{
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
}