自定义View点击填充/实现擦除

自定义View点击填充/实现擦除

自定义View实现点击填充

自定义类继承View

public class MyView3 extends View {

Context context;
int width;//宽
int height;//高
Paint paint = new Paint();
Paint paint1 = new Paint();
Paint paint2 = new Paint();
Paint paint3 = new Paint();

Path path = new Path();
Path path1 = new Path();
Path path2 = new Path();
Path path3 = new Path();
//设置标记
int flag=0;
int flag1=0;
int flag2=0;
int flag3=0;
public MyView3(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;

    initPaint();
}

private void initPaint() {
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    width = windowManager.getDefaultDisplay().getWidth();//获取宽
    height = windowManager.getDefaultDisplay().getHeight();//获取高


    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(2);
    paint.setAntiAlias(true);
    paint.setColor(Color.RED);

    paint1.setStyle(Paint.Style.STROKE);
    paint1.setStrokeWidth(2);
    paint1.setAntiAlias(true);
    paint1.setColor(Color.GRAY);

    paint2.setStyle(Paint.Style.STROKE);
    paint2.setStrokeWidth(2);
    paint2.setAntiAlias(true);
    paint2.setColor(Color.BLUE);

    paint3.setStyle(Paint.Style.STROKE);
    paint3.setStrokeWidth(2);
    paint3.setAntiAlias(true);
    paint3.setColor(Color.YELLOW);

    path.moveTo(0,0);
    path.lineTo(width/2,height/2);
    path.lineTo(width,0);

    path1.moveTo(0,height);
    path1.lineTo(width/2,height/2);
    path1.lineTo(width,height);

    path2.moveTo(0,0);
    path2.lineTo(width/2,height/2);
    path2.lineTo(0,height);

    path3.moveTo(width,0);
    path3.lineTo(width/2,height/2);
    path3.lineTo(width,height);


}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawPath(path,paint);

    canvas.drawPath(path1,paint1);
    canvas.drawPath(path2,paint2);
    canvas.drawPath(path3,paint3);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.e("####",event.getX()+"-----"+event.getY());
    int y = (int) event.getY();
    int x = (int) event.getX();
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:

            //创建一个矩形
            RectF rectF = new RectF();
            //用pat分割成矩形
            path.computeBounds(rectF,true);
            //一个区域
            Region region = new Region();
            //path 和 长方形的区域  交集
            region.setPath(path,new Region((int)rectF.left,(int)rectF.top,(int)rectF.right,(int)rectF.bottom));

            boolean contains = region.contains(x, y);
            if (contains){
                if (flag==0){
                    paint.setStyle(Paint.Style.FILL);
                    flag=1;
                }else{
                    paint.setStyle(Paint.Style.STROKE);
                    flag=0;
                }

            }

            RectF rectF1 = new RectF();
            path1.computeBounds(rectF1,true);
            Region region1= new Region();
            region1.setPath(path1,new Region((int)rectF1.left,(int)rectF1.top,(int)rectF1.right,(int)rectF1.bottom));

            boolean contains1 = region1.contains(x, y);

            if (contains1){
                if (flag1==0){
                    paint1.setStyle(Paint.Style.FILL);
                    flag1=1;
                }else{
                    paint1.setStyle(Paint.Style.STROKE);
                    flag1=0;
                }

            }


            RectF rectF2 = new RectF();
            path2.computeBounds(rectF2,true);
            Region region2 = new Region();
            region2.setPath(path2,new Region((int)rectF2.left,(int)rectF2.top,(int)rectF2.right,(int)rectF2.bottom));

            boolean contains2 = region2.contains(x, y);
            if (contains2){
                if (flag2==0){
                    paint2.setStyle(Paint.Style.FILL);
                    flag2=1;
                }else{
                    paint2.setStyle(Paint.Style.STROKE);
                    flag2=0;
                }

            }


            RectF rectF3 = new RectF();
            path3.computeBounds(rectF3,true);
            Region region3 = new Region();
            region3.setPath(path3,new Region((int)rectF3.left,(int)rectF3.top,(int)rectF3.right,(int)rectF3.bottom));

            boolean contains3 = region3.contains(x, y);
            if (contains3){
                if (flag3==0){
                    paint3.setStyle(Paint.Style.FILL);
                    flag3=1;
                }else{
                    paint3.setStyle(Paint.Style.STROKE);

                    flag3=0;
                }

            }

            break;
    }
    invalidate();
    return true;
    }
}

Activity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MyView3 myView = findViewById(R.id.myview);

}
}

布局xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<com.example.a123.day5lianxi2.MyView3
    android:id="@+id/myview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

效果
在这里插入图片描述

自定义View实现擦除

自定义类继承View

public class MyView extends View {
    Context context;
    Paint paint = new Paint();
    int width;
    int height;
    Bitmap prospectbitmap;//前景Bitmap
    Canvas mycanvas;//前景画布的canvas
    Bitmap backgroundbitmap;//背景画布
    Path path = new Path();//存储的是手指移动的轨迹
public EraserView(Context context,  AttributeSet attrs) {
    super(context, attrs);
    this.context=context;
    initPaint();
}

private void initPaint() {
   
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
     width = windowManager.getDefaultDisplay().getWidth();//获取宽
     height = windowManager.getDefaultDisplay().getHeight();//获取高


     paint.setAntiAlias(true);
     paint.setDither(true);
     //设置透明度
     paint.setARGB(128,255,0,0);
     //设置混合模式
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
     //设置描边
    paint.setStyle(Paint.Style.STROKE);
    //设置路径结合处样式
    paint.setStrokeJoin(Paint.Join.ROUND);
    //设置笔触类型
    paint.setStrokeCap(Paint.Cap.ROUND);
    //设置宽度
    paint.setStrokeWidth(40);
    //生成前景的Bitmap 设置图片的质量参数
    prospectbitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    //将其注入画布
    mycanvas = new Canvas(prospectbitmap);
    //灰色
    mycanvas.drawColor(Color.GRAY);
    //生成背景画布
    backgroundbitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.t2);
    backgroundbitmap = Bitmap.createScaledBitmap(backgroundbitmap,width,height,true);
   

}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //设置背景
    canvas.drawBitmap(backgroundbitmap,0,0,null);
    //设置前景
    canvas.drawBitmap(prospectbitmap,0,0,null);
    mycanvas.drawPath(path,paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //获取当前手指所在位置的点
    float y = event.getY();
    float x = event.getX();
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            path.moveTo(x,y);
            break;
        case MotionEvent.ACTION_MOVE:
           path.lineTo(x,y);
            break;
        case MotionEvent.ACTION_UP:

            break;
    }

    invalidate();

    return true;

}
}

Activity

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MyView myView = findViewById(R.id.myview);

}
}

布局xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<com.example.a123.day5lianxi2.MyView
    android:id="@+id/myview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

效果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值