You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何绘制并触摸移动无限个矩形(替代手动变量)

解决Android无限创建可拖动红色矩形的方案

嘿,作为Android新手能写出这样的交互逻辑已经很棒啦!你现在遇到的问题核心是用固定数量的变量没法动态创建无限个矩形,咱们换个思路,用集合(比如ArrayList)来统一管理所有矩形的数据,就能轻松实现无限创建的需求了。

第一步:创建矩形数据类

咱们先定义一个简单的类,用来存储每个红色矩形的中心坐标,这样每个矩形的位置都能单独管理:

public class RectData {
    public float x;
    public float y;

    public RectData(float x, float y) {
        this.x = x;
        this.y = y;
    }
}

第二步:重构DrawView类,用集合替代固定变量

把原来的xpos1、ypos1这类变量全部删掉,换成ArrayList<RectData>来保存所有矩形。然后修改绘制和触摸事件的逻辑:

修改后的完整DrawView.java代码:

public class DrawView extends View {
    // 用集合存储所有矩形数据
    private ArrayList<RectData> rectList = new ArrayList<>();
    // 当前正在拖动的矩形索引,-1表示没有拖动
    private int draggingIndex = -1;
    private Paint paint = new Paint();
    private int width;
    private int height;
    // 矩形的大小:宽高都是100(从中心±50)
    private static final int RECT_SIZE = 100;
    private static final int HALF_RECT = RECT_SIZE / 2;

    public DrawView(Context c) {
        super(c);
        setFocusable(true);
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        width = metrics.widthPixels;
        height = metrics.heightPixels;
        // 初始化第一个矩形,放在左下角
        rectList.add(new RectData(70, height - 90));
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 绘制底部灰色区域(原来的代码保留)
        paint.setStrokeWidth(0);
        paint.setColor(Color.GRAY);
        canvas.drawRect(0, height - 150, width, height, paint);
        paint.setColor(Color.LTGRAY);
        canvas.drawRect(0, height - 160, width, height - 150, paint);

        // 遍历集合绘制所有红色矩形
        paint.setColor(Color.RED);
        for (RectData rect : rectList) {
            canvas.drawRect(rect.x - HALF_RECT, rect.y - HALF_RECT,
                    rect.x + HALF_RECT, rect.y + HALF_RECT, paint);
        }

        // 测试用的绿色矩形(可选保留)
        paint.setColor(Color.GREEN);
        canvas.drawRect(50, 50, 70 + (rectList.size() - 1) * 20, 70 + (draggingIndex != -1 ? 20 : 0), paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 从后往前找(最新创建的矩形在最上层,优先响应)
                for (int i = rectList.size() - 1; i >= 0; i--) {
                    RectData rect = rectList.get(i);
                    // 判断触摸点是否在矩形范围内
                    if (touchX >= rect.x - HALF_RECT && touchX <= rect.x + HALF_RECT
                            && touchY >= rect.y - HALF_RECT && touchY <= rect.y + HALF_RECT) {
                        draggingIndex = i;
                        break;
                    }
                }
                break;

            case MotionEvent.ACTION_MOVE:
                // 如果正在拖动某个矩形,更新它的坐标
                if (draggingIndex != -1) {
                    RectData draggingRect = rectList.get(draggingIndex);
                    draggingRect.x = touchX;
                    draggingRect.y = touchY;
                    // 边界限制:不让矩形超出屏幕范围
                    draggingRect.x = Math.max(HALF_RECT, Math.min(width - HALF_RECT, draggingRect.x));
                    draggingRect.y = Math.max(HALF_RECT, Math.min(height - 75, draggingRect.y));
                }
                break;

            case MotionEvent.ACTION_UP:
                if (draggingIndex != -1) {
                    // 如果拖动的是最后一个(最新的)矩形,松开后添加新的矩形到左下角
                    if (draggingIndex == rectList.size() - 1) {
                        rectList.add(new RectData(70, height - 90));
                    }
                    draggingIndex = -1;
                }
                break;
        }

        invalidate();
        return true;
    }
}

关键改动说明

  • 用ArrayList<RectData>替代固定变量:这样不管创建多少个矩形,都能动态添加到集合里,不用手动加变量。
  • 拖动逻辑优化:从后往前遍历判断触摸的矩形,保证最新创建的(最上层)矩形优先响应触摸。
  • 边界限制简化:把原来重复的边界判断逻辑合并,代码更简洁。
  • 自动添加新矩形:每次拖动最后一个矩形并松开后,自动在左下角生成新的矩形,实现无限创建。

其他文件说明

  • MainActivity.java不用修改,保持原来的代码即可。
  • activity_main.xml也不需要修改,因为你是用代码创建的DrawView并设置为ContentView。

这样修改后,你就能无限拖动创建红色矩形啦,再也不用受限于固定的变量数量了!

内容的提问来源于stack exchange,提问作者Argos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:21