首页 > 解决方案 > 如何在 Android Canvas 上移动两个圆圈?

问题描述

我只能在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);
    }
}

标签: androidcanvas

解决方案


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;
   }

推荐阅读