认识
SurfaceView 子线程中绘制完成,提交到主线程。在家里把作业写好,回到学校交给老师。
使用
- 集成SurfaceView 实现SurfaceHolder.Callback接口
- 获取到SurfaceHolder,这个Surface的控制器。
- 新建绘图线程。通过surfaceHolder.lockCanvas();拿到canvas.
- holder.unlockCanvasAndPost(canvas); 提交画板。
package com.x603.dbox.surfaceviewdemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* surface的简单使用。
* Created by azezer0 on 16/10/7.
*/
public class CircleSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
public static final String Tag = CircleSurfaceView.class.getSimpleName();
private SurfaceHolder mSurfaceHolder;
private DrawThread mDrawThread;
public CircleSurfaceView(Context context) {
this(context, null);
}
public CircleSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
mDrawThread = new DrawThread(mSurfaceHolder);
}
@Override
public void surfaceCreated(SurfaceHolder holder) { //surface创建时候,就在这里启动画画
mDrawThread.isRun = true;
mDrawThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //surface大小发生变化时
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {//surface结束画画,
mDrawThread.isRun = false;
}
private class DrawThread extends Thread {
public boolean isRun = true;
private SurfaceHolder holder;
public DrawThread(SurfaceHolder mSurfaceHolder) {
holder = mSurfaceHolder;
}
@Override
public void run() {
int count = 0;
while (isRun) {
Canvas canvas = null;
try {
synchronized (holder) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.BLUE);
Paint p = new Paint();
p.setColor(Color.WHITE);
Rect r = new Rect(20, 20, 400, 500);
canvas.drawRect(r, p);
p.setTextSize(30);
p.setColor(Color.RED);
canvas.drawText("这是第" + count++ + "秒", 20, 300, p);
Thread.sleep(1000);
}
} catch (Exception e) {
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
}
}
}
实例

exception
- IllegalThreadStateException: Thread already started
不管Thread.isAlive() 返回true or false,都会报这个异常。在surfaceCreated(),新建线程,并启动。在surfaceDestroyed() 结束掉。
网友评论