【问题标题】:How to move two Circles on Android Canvas?如何在 Android Canvas 上移动两个圆圈?
【发布时间】:2020-06-19 23:59:35
【问题描述】:

我只能在onTouchEvent方法中移动一个圆圈

我注意到的另一个问题是,当您触摸 Canvas 上的任何位置时,Circle One 的位置会发生变化

只有在触摸/拖动圆圈时才会发生这种情况

Canvas 似乎只能识别触摸

我该如何解决这个问题?

public class Example extends View {    
    private Paint circleOne, circleTwo;

    float xCircleOne, yCircleOne, xCircleTwo, yCircleTwo;

    int radiusCircleOne = 100;
    int radiusCircleTwo = 50;

    public Example(Context context) {
        super(context);

        init();
    }

    private void init() {
        circleOne = new Paint();
        circleTwo = new Paint();

        ...
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                xCircleOne = event.getX();
                yCircleOne = event.getY();

                invalidate();
                break;
        }

        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // Circles
        canvas.drawCircle(xCircleOne, yCircleOne, radiusCircleOne, circleOne);
        canvas.drawCircle(xCircleTwo, yCircleTwo, radiusCircleTwo, circleTwo);
    }
}

【问题讨论】:

标签: android canvas


【解决方案1】:
int xonTouch,yonTouch,xonMotion,yonMotion;
boolean trackStatus;
int xdistance=xCircleTwo-xCircleOne;
int ydistance=yCircleTwo-YCircleOne;

@SuppressLint("ClickableViewAccessibility")
   @Override
   public boolean onTouchEvent(MotionEvent event) {

      switch (event.getAction()) {
           case MotionEvent.ACTION_DOWN://getInitialCoordinates when when you Touch;
            xonTouch=event.getX();
            yonTouch=event.geyY();
//TO move only when touching and dragging
//check if these xonTouch and yonTouch are inside the circle by comparing the coordinates of circle if these lie inside cirlce return true to track motion else return false so the ACTION_MOVE is not triggered
i.e          if(condition)//condition=xonTouch and yonTouch lie inside circle.
            trackStatus=true;
else trackStatus=false;



            break;
           case MotionEvent.ACTION_MOVE:
//to move circle two use following 
               xCircleOne = event.getX();
               yCircleOne = event.getY();
                xCircleTwo= xCircleOne+xdistance;
               yCircleTwo = yCircleOne+ydistance;
trackStatus=true;



               invalidate();
               break;
       }
case MotionEvent.ACTION_UP:
trackStatus=false;
break;}

       return trackStatus;
   }

【讨论】:

  • 检查点 (x,y) 是否位于以 (p,s) 为中心且半径为 r 的圆内,条件应为 condition=x>(p-r)&&x(s-r)&&y
  • canvas.drawCircle(xCircleOne, yCircleOne, radiusCircleOne, circleOne);在这个(xCircleOne,yCircleOne)表示圆心,如果你想移动圆,当你想相应地移动圆时改变这些值。第三个参数radiusCircleOne是半径。改变这个来改变圆的大小。如果你想要移动第二个圆圈,也相应地更改第二个圆圈的值。
  • 代码 -> link 我的方法对吗?我一步一步来
  • 哦,对不起,我没有看到在条件下用 xCircleOne 和 yCircleOne 正确替换 xonFinger 和 yonFinger。
  • 哈哈哈。圆圈与另一个圆圈一起移动=(我想要的是将每个圆圈分开,但线仍然在两个圆圈之间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多