zoukankan      html  css  js  c++  java
  • PorterDuffXfermode之PorterDuff.Mode.SRC_OUT

    package com.loaderman.customviewdemo.view;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    import com.loaderman.customviewdemo.R;
    
    
    public class EraserView_SRCOUT extends View {
        private Paint mBitPaint;
        private Bitmap BmpDST, BmpSRC, BmpText;
        private Path mPath;
        private float mPreX, mPreY;
    
        public EraserView_SRCOUT(Context context, AttributeSet attrs) {
            super(context, attrs);
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            mBitPaint = new Paint();
            mBitPaint.setColor(Color.RED);
            mBitPaint.setStyle(Paint.Style.STROKE);
            mBitPaint.setStrokeWidth(45);
    
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
    
            BmpText = BitmapFactory.decodeResource(getResources(), R.drawable.guaguaka_text, null);
            BmpSRC = BitmapFactory.decodeResource(getResources(), R.drawable.dog, options);
            BmpDST = Bitmap.createBitmap(BmpSRC.getWidth(), BmpSRC.getHeight(), Bitmap.Config.ARGB_8888);
            mPath = new Path();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawBitmap(BmpText, null, new RectF(0, 0, BmpDST.getWidth(), BmpDST.getHeight()), mBitPaint);
    
            int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
    
            //先把手指轨迹画到目标Bitmap上
            Canvas c = new Canvas(BmpDST);
            c.drawPath(mPath, mBitPaint);
    
            //然后把目标图像画到画布上
            canvas.drawBitmap(BmpDST, 0, 0, mBitPaint);
    
            //计算源图像区域
            mBitPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));//橡皮擦效果
            canvas.drawBitmap(BmpSRC, 0, 0, mBitPaint);
    
            mBitPaint.setXfermode(null);
            canvas.restoreToCount(layerId);
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mPath.moveTo(event.getX(), event.getY());
                    mPreX = event.getX();
                    mPreY = event.getY();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    float endX = (mPreX + event.getX()) / 2;
                    float endY = (mPreY + event.getY()) / 2;
                    mPath.quadTo(mPreX, mPreY, endX, endY);
                    mPreX = event.getX();
                    mPreY = event.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
            postInvalidate();
            return super.onTouchEvent(event);
        }
    }
      <com.loaderman.customviewdemo.view.EraserView_SRCOUT
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

    效果:

  • 相关阅读:
    Vue--运行项目发送http://localhost:8080/sockjs-node/info请求报错,造成浏览器不能热更新
    Vue笔记--同局域网下访问本地项目
    Vue笔记--通过自定义指令实现按钮操作权限
    css/css3实现未知宽高元素的垂直居中和水平居中
    【转载】Vue路由history模式踩坑记录:nginx配置解决404问题
    给动态生成的input框,添加readonly属性
    layui-form下隐藏元素的验证问题
    layui的省市县三级联动
    webstorm-激活码
    采坑
  • 原文地址:https://www.cnblogs.com/loaderman/p/10215032.html
Copyright © 2011-2022 走看看