Android 自定义View学习——PorterDuffXfe

作者: 英勇青铜5 | 来源:发表于2016-09-08 22:54 被阅读269次

    最简单基础的刮刮乐

    简易效果的刮刮乐
    public class XferModeView extends View {
        private Paint mPaint;
        private Bitmap dstBitmap, srcBitmap;
        private Canvas mCanvas;
        private Path mPath;
    
        public XferModeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initPaint();
        }
    
        private void initPaint() {
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
            mPaint.setAlpha(0);
            mPaint.setStrokeWidth(50);
            mPaint.setStyle(Paint.Style.STROKE);
            dstBitmap = decodeBitmapFormRes(getResources(), R.drawable.text, getWidth(),600);
            srcBitmap = Bitmap.createBitmap(dstBitmap.getWidth(), dstBitmap.getHeight(), Bitmap.Config.ARGB_8888);//这里不能RGB565
            mCanvas = new Canvas(srcBitmap);
            mCanvas.drawColor(Color.GRAY);
            mPath = new Path();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawBitmap(dstBitmap, 0, 0, null);
            drawPath();
            canvas.drawBitmap(srcBitmap, 0, 0, null);
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mPath.reset();//路径复位空白
                    mPath.moveTo(event.getX(), event.getY());
                    break;
                case MotionEvent.ACTION_MOVE:
                    mPath.lineTo(event.getX(), event.getY());
                    break;
            }
            invalidate();
            return true;
        }
    
        private void drawPath() {
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
            mCanvas.drawPath(mPath, mPaint);
        }
    
        /**
         * 测量
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);
            int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);
            int hSpecMode = MeasureSpec.getMode(heightMeasureSpec);
            int hSpecSize = MeasureSpec.getSize(heightMeasureSpec);
    
            if (wSpecMode == MeasureSpec.AT_MOST && hSpecMode == MeasureSpec.AT_MOST) {
                setMeasuredDimension(300, 300);
            } else if (wSpecMode == MeasureSpec.AT_MOST) {
                setMeasuredDimension(300, hSpecSize);
            } else if (hSpecMode == MeasureSpec.AT_MOST) {
                setMeasuredDimension(wSpecSize, 300);
            }
        }
    
        /**
         * 图片的缩放
         */
        private Bitmap decodeBitmapFormRes(Resources resources, int resId, int targetWidth, int targetHeight) {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            options.inJustDecodeBounds = false;
            BitmapFactory.decodeResource(resources, resId, options);
            int inSample = calculateInSample(options, targetWidth, targetHeight);
            options.inSampleSize = inSample;
            return BitmapFactory.decodeResource(resources, resId, options);
        }
    
        private int calculateInSample(BitmapFactory.Options options, int targetWidth, int targetHeight) {
            if (targetWidth <= 0 || targetHeight <= 0) {
                return 1;
            }
            int inSample = 1;
            final int rawWidth = options.outWidth;
            final int rawHeight = options.outHeight;
            if (rawWidth > targetWidth || rawHeight > targetHeight) {
                final int halfWidth = rawWidth / 2;
                final int halfHeight = rawHeight / 2;
                while ((halfWidth / inSample >= targetWidth) && (halfHeight / inSample >= targetHeight)) {
                    inSample *= 2;
                }
            }
            return inSample;
        }
    }
    
    

    待解决问题:

    1. 图片大时,滑动画笔会卡
    2. 图片小时,不能全屏,屏幕边缘有空白

    两个问题,暂时想到解决思路:

    1. 继承SurfaceViewAndroid SurfaceView入门学习
      2.使用Matrix.setRectToRect()方法,View的测量方法onMeasure()学习有实际案例

    相关文章

      网友评论

        本文标题:Android 自定义View学习——PorterDuffXfe

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