美文网首页
SurfaceView涂鸦板(带截屏)

SurfaceView涂鸦板(带截屏)

作者: Amy_LuLu__ | 来源:发表于2018-09-05 14:38 被阅读0次

    文章来自于
    SurfaceView的基本使用
    Android截屏SurfaceView黑屏问题解决办法

    目录

    1. 创建SurfaceView
    2. 使用SurfaceView

    1.创建SurfaceView

    public class FirstSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
    
        //SurfaceHolder
        private SurfaceHolder mHolder;
        //用于绘图的Canvas
        private Canvas mCanvas;
        //子线程标志位
        private boolean mIsDrawing;
        //画笔
        private Paint mPaint;
        //路径
        private Path mPath;
    
    
        public FirstSurfaceView(Context context) {
            super(context);
            initView();
        }
    
        public FirstSurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView();
        }
    
        public FirstSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView();
        }
    
        private void initView() {
            mHolder = getHolder();
    
            //添加回调
            mHolder.addCallback(this);
    
            mPath = new Path();
            //初始化画笔
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(6);
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.RED);
    
            setFocusable(true);
            setFocusableInTouchMode(true);
            this.setKeepScreenOn(true);
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mIsDrawing = true;
            new Thread(this).start();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mIsDrawing = false;
        }
    
        @Override
        public void run() {
            long start = System.currentTimeMillis();
            while (mIsDrawing) {
                try {
                    //锁定画布并返回画布对象
                    mCanvas = mHolder.lockCanvas();
                    //接下去就是在画布上进行一下draw
                    drawIt(mCanvas);
    
                } catch (Exception e) {
                } finally {
                    //当画布内容不为空时,才post,避免出现黑屏的情况。
                    if (mCanvas != null)
                        mHolder.unlockCanvasAndPost(mCanvas);
                }
    
    
                long end = System.currentTimeMillis();
                if (end - start < 100) {
                    try {
                        Thread.sleep(100 - end + start);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private void drawIt(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            canvas.drawPath(mPath, mPaint);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mPath.moveTo(x, y);
                    break;
                case MotionEvent.ACTION_MOVE:
                    mPath.lineTo(x, y);
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
            return true;
        }
    
        /**
         * 清屏
         *
         * @return true
         */
        public boolean reDraw() {
            mPath.reset();
            return true;
        }
    
        public Bitmap getBitmap() {
            Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            drawIt(canvas);
            return bitmap;
        }
    }
    

    2. 使用SurfaceView

    新建一个activity

    布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <xxx.lulu.view.FirstSurfaceView
            android:id="@+id/view_surfaceview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    
        <Button
            android:id="@+id/btn_clear"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/purple"
            android:text="clear"
            android:textColor="@color/white" />
    </LinearLayout>
    

    java文件:

    public class SurfaceViewActivity extends BaseActivity {
        private static final int PERMISSION_EXTERNAL = 1;
        @BindView(R.id.view_surfaceview)
        FirstSurfaceView viewSurfaceview;
        @BindView(R.id.btn_clear)
        Button btnClear;
        @BindView(R.id.btn_save)
        Button btnSave;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_surfaceview, "surfaceview");
            ButterKnife.bind(this);
    
        }
    
        @OnClick({R.id.btn_clear, R.id.btn_save})
        public void onViewClicked(View view) {
            switch (view.getId()) {
                case R.id.btn_clear:
                    viewSurfaceview.reDraw();
                    break;
                case R.id.btn_save:
                    if (ContextCompat.checkSelfPermission(SurfaceViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                        //没有授权,则申请授权
                        //ActivityCompat.requestPermissions() 参数一:context 参数二:申请的权限名数组 参数三:请求码,要求唯一值
                        ActivityCompat.requestPermissions(SurfaceViewActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_EXTERNAL);
                    } else {
                        save();
                    }
                    break;
            }
        }
    
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case PERMISSION_EXTERNAL:
                    if (resultCode != Activity.RESULT_OK) return;
                    save();
                    break;
            }
        }
    
        private void save() {
    /*        View dView = getWindow().getDecorView();
            dView.setDrawingCacheEnabled(true);
            dView.buildDrawingCache();*/
            Bitmap bitmap = viewSurfaceview.getBitmap();
            if (bitmap != null) {
                try {
                    // 获取内置SD卡路径
                    File dir = Environment.getExternalStorageDirectory();
                    // 图片文件路径
                    File file = new File(dir, "123.png");
                    FileOutputStream os = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
                    os.flush();
                    os.close();
                    Toast.makeText(this, "存储完成", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                 
                }
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:SurfaceView涂鸦板(带截屏)

          本文链接:https://www.haomeiwen.com/subject/utyawftx.html