自定义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>
效果