自定义view 小案例
public class SJ extends View{
private Context context;
private int h;
private int w;
private Path path01;
private Path path02;
private Path path03;
private Path path04;
private Paint paint01;
private Paint paint02;
private Paint paint03;
private Paint paint04;
public SJ(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.context=context;
init();
}
private void init() {
WindowManager manager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics= new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(displayMetrics);
w=displayMetrics.widthPixels;
h=displayMetrics.heightPixels;
paint01=new Paint();
paint02=new Paint();
paint03=new Paint();
paint04=new Paint();
path01=new Path();
path02= new Path();
path03 = new Path();
path04= new Path();
path01.moveTo(0,0);
path01.lineTo(w/2,h/2);
path01.lineTo(w,0);
paint01.setAntiAlias(true);
paint01.setStyle(Paint.Style.STROKE);
paint01.setColor(Color.RED);
paint01.setStrokeWidth(10);
path02.moveTo(0,0);
path02.lineTo(w/2,h/2);
path02.lineTo(0,h);
paint02.setAntiAlias(true);
paint02.setStyle(Paint.Style.STROKE);
paint02.setColor(Color.BLUE);
paint02.setStrokeWidth(5);
path03.moveTo(0,h);
path03.lineTo(w/2,h/2);
path03.lineTo(w,h);
paint03.setAntiAlias(true);
paint03.setStyle(Paint.Style.STROKE);
paint03.setColor(Color.YELLOW);
paint03.setStrokeWidth(5);
path04.moveTo(w,0);
path04.lineTo(w/2,h/2);
path04.lineTo(w,h);
paint04.setAntiAlias(true);
paint04.setStyle(Paint.Style.STROKE);
paint04.setColor(Color.GREEN);
paint04.setStrokeWidth(5);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path01,paint01);
canvas.drawPath(path04,paint04);
canvas.drawPath(path02,paint02);
canvas.drawPath(path03,paint03);
}
public int Downx,Downy;
@Override
public boolean onTouchEvent(MotionEvent event) {
int x= (int) event.getX();
int y= (int) event.getY();
Downx=x;
Downy=y;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//todo 创建一个矩形
RectF rectF1 = new RectF();
RectF rectF2 = new RectF();
RectF rectF3 = new RectF();
RectF rectF4 = new RectF();
//todo 用路径分隔为矩形
path01.computeBounds(rectF1,true);
path02.computeBounds(rectF2,true);
path03.computeBounds(rectF3,true);
path04.computeBounds(rectF4,true);
//todo 区域
Region region1 = new Region();
Region region2 = new Region();
Region region3 = new Region();
Region region4 = new Region();
//todo 创建新区域
region1.setPath(path01,new Region((int) rectF1.left,(int)rectF1.top,(int)rectF1.right,(int)rectF1.bottom));
region2.setPath(path02,new Region((int) rectF2.left,(int)rectF2.top,(int)rectF2.right,(int)rectF2.bottom));
region3.setPath(path03,new Region((int) rectF3.left,(int)rectF3.top,(int)rectF3.right,(int)rectF3.bottom));
region4.setPath(path04,new Region((int) rectF4.left,(int)rectF4.top,(int)rectF4.right,(int)rectF4.bottom));
boolean contains1 = region1.contains(Downx, Downy);
boolean contains2 = region2.contains(Downx, Downy);
boolean contains3 = region3.contains(Downx, Downy);
boolean contains4 = region4.contains(Downx, Downy);
if(contains1){
paint01.setStyle(Paint.Style.FILL);
Toast.makeText(context, "上", Toast.LENGTH_SHORT).show();
}
if(contains2){
paint02.setStyle(Paint.Style.FILL);
}
if(contains3){
paint03.setStyle(Paint.Style.FILL);
}
if(contains4){
paint04.setStyle(Paint.Style.FILL);
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
invalidate();
return true;
}
}
小案例2
public class BBB extends View{
private Context context;
private Paint paint;
private int w;
private int h;
private Bitmap bitmap1;
private Canvas my_Canvas;
private Bitmap bitmap2;
//手指移动轨迹
private Path path;
private int MIN_PATH = 10;
//设置一个全局的起点
private int Downx,Downy;
public BBB(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.context=context;
init();
}
private void init() {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
w=displayMetrics.widthPixels;
h=displayMetrics.heightPixels;
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(30);
//抗抖动、抗锯齿
paint.setDither(true);
paint.setAntiAlias(true);
//设置色值(透明)
paint.setARGB(128,255,0,0);
//设置混合模式 DIS_IH
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//设置路径结合处样式
paint.setStrokeJoin(Paint.Join.ROUND);
//设置笔触类型
paint.setStrokeCap(Paint.Cap.ROUND);
//生成前景的Bitmap 图片的质量参数
bitmap1 = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
//加入画布
my_Canvas = new Canvas(bitmap1);
//灰色背景
my_Canvas.drawColor(0XFF808080);
//生成背景画布
bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.ooo);
bitmap2 = Bitmap.createScaledBitmap(bitmap2,w,h,true);
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bitmap2,0,0,null);
//设置前景
canvas.drawBitmap(bitmap1,0,0,null);
my_Canvas.drawPath(path,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//清空上一次的path路径
path.reset();
path.moveTo(x,y);
Downx = x;
Downy = y;
break;
case MotionEvent.ACTION_MOVE:
int absX = Math.abs(x - Downx);
int absY = Math.abs(x - Downy);
if (absX > MIN_PATH || absY > MIN_PATH){
//存储路径
path.quadTo(Downx,Downy,x,y);
}
path.quadTo(Downx,Downy,x,y);
Downx = x;
Downy = y;
break;
case MotionEvent.ACTION_UP:
path.lineTo(x,y);
break;
}
invalidate();
return true;
}
}