Android SurfaceView 使用


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);


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值