public class SurfaceViewDemo extends android.view.SurfaceView {
public static final int DELAY_MILLIS = 1;
private SurfaceHolder mHolder;
private Paint mPaint;
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
startDrawTask();
mHandler.sendEmptyMessageDelayed(123, DELAY_MILLIS);
return false;
}
});
private float mRadius = 10;
public SurfaceViewDemo(Context context) {
this(context,null);
}
public SurfaceViewDemo(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SurfaceViewDemo(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mHolder = getHolder();
/**
* surface生命周期回调
*/
mHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
mHandler.sendEmptyMessageDelayed(123, DELAY_MILLIS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
private void startDrawTask() {
/**
*开始绘制的起始方法;
* 返回的canvas,用来绘制,如果surface没有创建就为null;
* 通过mHolder.addCallback()surface生命周期的回调,判断surface是否创建
*/
Canvas canvas = mHolder.lockCanvas();
mPaint = new Paint();
/**
* surface再次绘制,清空上次绘制内容的方法
*/
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(mPaint);//drawpaint 相当于用这个paint drawRect
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
mRadius += 10;
if (mRadius > 540) {
mRadius = 10;
}
mPaint.setTextSize(30);
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(String.format("重绘间隔:%dms",DELAY_MILLIS),50,50,mPaint);
canvas.drawText(String.format("绘制半径:%dpx",(int)mRadius),50,100,mPaint);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(540,540,mRadius, mPaint); //与invalidate()不同,不会重绘而是覆盖绘制,所以多次绘制考虑清除上次绘制的内容
/**
* 停止对surface的编辑,调用后surface的内容会被展示出来
*/
mHolder.unlockCanvasAndPost(canvas);
}
}
Android SurfaceView 使用
最新推荐文章于 2024-05-08 17:28:07 发布