Android SurfaceView 使用

来源:互联网 发布:知耻阅读答案 编辑:程序博客网 时间:2024/06/14 06:39
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);    }}

原创粉丝点击