Android自定义View学习一

本文分享了Android自定义View的步骤,包括重写构造方法、定义画笔、绘制图形和编写触摸事件处理。通过一个RectView实例,详细阐述了自定义View的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人学习经历,仅供参考
自定义view的步骤:
1.重写构造方法
我写了一个自定义类RectView,重写了三个

public class RectView extends View {
	public RectView(Context context) {
	//在java代码中调用,比如new RectView();
        super(context);
    }
    public RectView(Context context, AttributeSet attrs) {
    //在布局的xml中定义的时候调用
        super(context, attrs);
    }
    public RectView(Context context, AttributeSet attrs, int defStyleAttr) {
    //有style属性的时候调用
        super(context, attrs, defStyleAttr);
    }
 }

2.画笔的定义

 private void init() {
        paint.setFlags(Paint.ANTI_ALIAS_FLAG);  //设置一些标志,比如抗锯齿,下划线等等。
        paint.setStrokeWidth(5f);  //设置画笔的宽度
        paint.setColor(Color.RED);  //设置画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔的样式  填充
        // Paint.Style.FILL_AND_STROKE;   填充+描边
        // Paint.Style.STROKE;     描边
    }

更多关于Paint的方法:Android Paint的使用详解
3.在onDraw()方法中画出你想要的图形

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(500,500,200,paint);
    }

效果图
在这里插入图片描述
4.全部代码
RectView .java

public class RectView extends View {
    Paint paint=new Paint();  //画笔
    public RectView(Context context) {
        super(context);
    }

    public RectView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();  //在xml中调用的,所以在这里初始化
    }

    public RectView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void init() {
        paint.setFlags(Paint.ANTI_ALIAS_FLAG);  //设置一些标志,比如抗锯齿,下划线等等。
        paint.setStrokeWidth(5f);  //设置画笔的宽度
        paint.setColor(Color.RED);  //设置画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔的样式  填充
        // Paint.Style.FILL_AND_STROKE;   填充+描边
        // Paint.Style.STROKE;     描边
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(500,500,200,paint);
    }
}

在布局文件中引用即可

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <pc.test.RectView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>

5.添加触摸事件

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d("TOUCH", "onTouchEvent: 按下");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("TOUCH", "onTouchEvent: 移动");
                break;
            case MotionEvent.ACTION_UP:
                Log.d("TOUCH", "onTouchEvent: 抬起 ");
                break;
        }
        return false;
        /*设为true 和 false的效果是有区别的:
        setOnTouchListener 单独使用的时候返回值需要为true,这样才能保证移动的时候能后获取相应的监听,而非一次监听(即每次只有一个按下的事件)
        setOnTouchListener 和 setOnClickListener 同时使用时,onTouch 的返回值要设为 false,这样既可以保证按下移动抬起事件可以被监听,并且点击事件也会被监听。*/
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值