android 自定义view--点击屏幕生成圆点,点击圆点可以拖动

本文详细介绍了如何在Android应用中创建自定义View,通过监听屏幕点击事件动态生成圆点,并允许用户对生成的圆点进行拖动操作,以此实现更丰富的交互体验。

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

package com.minibox.mycpp;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.Nullable;

/**
 * Created by lingbeijing on 2020/9/5.
 */
public class DragBoll extends View implements GestureDetector.OnGestureListener {
    
    private Paint mPaint;
    private float point_x;
    private float point_y;
    private final float radio = 43.0f;
    private RectF targetRectF;
    private List<RectF> mCircles;
    
    private GestureDetector mDetector;
    public DragBoll(Context context) {
        super(context);
    }

    public DragBoll(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public DragBoll(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
    }

    public DragBoll(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(mDetector.onTouchEvent(event)){
            return true;
        }
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                targetRectF = getTarget(event);
                break;
            case MotionEvent.ACTION_MOVE:
                point_x = event.getX();
                point_y = event.getY();
                //在触摸点位置为中心绘制圆
                Log.i("lingbj", "draw:");
                if(targetRectF != null) {
                    targetRectF.left = point_x - radio;
                    targetRectF.right = point_x + radio;
                    targetRectF.bottom = point_y + radio;
                    targetRectF.top = point_y - radio;
                    invalidate();
                    
                }
                break;
            case MotionEvent.ACTION_CANCEL:
                point_x = 0;
                point_y = 0;
                targetRectF = null;
                invalidate();
                break;
        }
        return true;
    }

    private void init(){
        mPaint = new Paint();
        mCircles = new ArrayList<>();
        mDetector = new GestureDetector(getContext(),this);
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.GREEN);
        mPaint.setStrokeWidth(5);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    }

    private RectF getTarget(MotionEvent event){
        for(RectF rect: mCircles){
            if(rect.contains(event.getX(), event.getY())) {
                return rect;
            }
        }
        return null;
    }
    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        for (RectF rect : mCircles) {
            canvas.drawRoundRect(rect, radio, radio, mPaint);
        }
    }

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {

        Log.i("lingbj", "onSingleTapUp");
        if (mCircles.size() < 10) {
            float x = motionEvent.getX();
            float y = motionEvent.getY();
            RectF rectF = new RectF();
            rectF.left = x - radio;
            rectF.right = x + radio;
            rectF.bottom = y + radio;
            rectF.top = y - radio;
            mCircles.add(rectF);
            invalidate();
        }
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值