自定义View,创建一个小圆点,单击可以拖动

<?xml version="1.0" encoding="utf-8"?>
<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="com.xx.viewview.MainActivity">
	//这里定义的是自定义的那个View继承的VIew的类
    <com.xx.viewview.NewView//这里是你自定义VIew的包名+类名
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

//自定义一个自定义View的类,继承View,在activity_main布局中应用

public class NewView extends View {
    //画笔
    private Paint paint;
    //圆的半径
    private float mRadius = 50f;
    //圆的圆心的X坐标
    private float paintx = mRadius;
    //圆的圆心的Y坐标
    private float painty = mRadius;
    //判断是否可以移动  true是可以移动
    private boolean moveable;

    public NewView(Context context) {
        super(context);
    }

    public NewView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //创建一个画笔
        paint = new Paint();
        //这是画笔的颜色
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //根据圆心的坐标来绘制圆心的位置,而圆心的坐标在我们触摸屏幕的时候被我们修改了
        canvas.drawCircle(paintx, painty, mRadius, paint);
    }
    //要单点拖动,保证手指在圆上的时候才移动,我们需要判断触摸的位置

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN://按下的事件
                float x = event.getX();//你当前点击的位置的X轴坐标
                float y = event.getY();//你当前点击的位置的Y轴的坐标
                /** 在手机屏幕边缘是有一层物理边缘,所以圆心的位置减去半径,总会和屏幕边缘有一点距离
                 *  x > paintx - mRadius  判断当前你点击的位置,是否大于 圆心的位置减去半径,如果大于则
                 *  证明你当前点击的位置在圆的左边缘里面,同时又不能超出圆的右边缘
                 *  x < paintx + mRadius 就是判断你当前点的X的位置有没有超出圆的右边缘,
                 *      如果你点击的X位置小于 圆心的位置+圆的半径,则证明没有抄错圆的右边缘
                 *
                 *  同理判断Y轴
                 *  y > painty -mRadius 判断当前你点击的位置的Y轴,大于 圆心减去半径,
                 *  则证明你点击的位置超过了圆的上边缘,同时不能超出圆的下边缘,
                 *  所以 判断 y < painty + mRadius 你点击的位置y轴不超过圆的下边缘,所以当前的Y轴位置
                 *  小于 圆心的位置加半径,则证明你点击的Y轴没有超过原的下边缘
                 *
                 *  就是判断你当前的位置在没在这个圆里面,如果在这个圆里面就可以拖动,在圆的外面不能拖动
                 *
                 */
                if (x > paintx - mRadius && x < paintx + mRadius && y > painty -
                        mRadius && y < painty + mRadius) {
                    //判断你触摸的位置如果在圆里面,让moveable变成true可以拖动
                    moveable = true;
                    Toast.makeText(getContext(), "我按下了", Toast.LENGTH_SHORT).show();
                } else {
                    moveable = false;
                }
                break;
            case MotionEvent.ACTION_MOVE://移动的事件
                //如果是true的话可以移动,
                //重新设置一下圆心的位置,把圆心的位置(paintx,painty)
                //设置成我们当前触摸的位置(event.getX(),event.getY())
                if (moveable) {
                    paintx = event.getX();
                    painty = event.getY();
                    //去重新绘制一个圆,会重新走onDraw()方法
                    invalidate();
                    Toast.makeText(getContext(), "我移动了", Toast.LENGTH_SHORT).show();
                }
                break;
            case MotionEvent.ACTION_UP://抬起的事件
                Toast.makeText(getContext(), "我抬起来了", Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义一个单选框,可以继承自 Android 的 View 类,并实现一些必要的方法。下面是一个简单的例子: ```java public class MyRadioButton extends View { private boolean isChecked = false; private Paint paint = new Paint(); public MyRadioButton(Context context) { super(context); init(); } public MyRadioButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 设置画笔的颜色和样式 paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 设置 view 的大小,这里设置为 50x50 setMeasuredDimension(50, 50); } @Override protected void onDraw(Canvas canvas) { // 画一个圆形 canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 5, paint); // 如果被选中,画一个小圆点 if (isChecked) { canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 4, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { // 监听击事件,如果被击,就改变选中状态 if (event.getAction() == MotionEvent.ACTION_DOWN) { isChecked = !isChecked; invalidate(); } return super.onTouchEvent(event); } } ``` 这个自定义单选框只是一个简单的例子,可以根据需要添加更多的功能。要使用这个自定义单选框,只需要在布局文件中添加一个 MyRadioButton 即可: ```xml <com.example.myapplication.MyRadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值