自定义View小案例两个

本文介绍了如何创建自定义View,通过SJ类为例,展示了自定义View的基本结构和实现细节。
摘要由CSDN通过智能技术生成
自定义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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值