基于android中的触摸事件以圆周运动移动图像

时间:2013-12-12 15:00:53

标签: android math transform ontouchevent

我正在尝试移动ImageView(不是旋转)。运动应该在圆的边缘。此圆圈也是图像视图。

基于onTouch,ACTION_MOVE事件,我试图移动它。

Noe the Dilema是使用可能无法以完美的圆形方式移动手指,但我想确保图像仍然围绕此圆圈的边缘移动。

我目前在ACTION_MOVE中使用以下内容:

mCurrTempIndicator.setTranslationX(event.getX());
mCurrTempIndicator.setTranslationY(event.getY());

但这不会在一个完美的圈子里移动。

有人可以帮忙吗。

更新:代码

@Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:


                        mInitialX = event.getX();
                        mInitialY = event.getY();

                    break;

                case MotionEvent.ACTION_MOVE:

                    mEndX = event.getX();
                    mEndY = event.getY();

                    float deltaX = mEndX - mInitialX;
                    float deltaY = mEndY - mInitialY;
                    double angleInDegrees = Math.atan(deltaY / deltaX) * 180 / Math.PI;

                    mInitialX = mEndX;
                    mInitialY = mEndY;

                    mCurrTempIndicator.setRotation((float)angleInDegrees);
                    mCurrTempIndicator.setTranslationX((float)(310*(Math.cos(angleInDegrees))));
                    mCurrTempIndicator.setTranslationY((float)(310*(Math.sin(angleInDegrees))));




                    break;

                case MotionEvent.ACTION_UP:
                    allowRotating = true;
                    break;
            }



            return true;
        }

1 个答案:

答案 0 :(得分:4)

  1. 计算圆的中心点
  2. 获取当前触摸点
  3. 计算中心与新触点之间的角度
  4. 使用圆的角度和半径计算圆上的点(x = r * cos(角度),y = r * sin(角度))。
  5. 将图像位置重置为新点。
  6. 要获得角度,请使用以下等式

    deltaY = P2_y - P1_y
    deltaX = P2_x - P1_x
    angleInDegrees = arctan(deltaY / deltaX) * 180 / PI
    
    //Code inside ACTION_MOVE case
    mInitialX = event.getX();
    mInitialY = event.getY();
    float deltaX = circleCenter.x - mInitialX;
    float deltaY = circleCenter.y - mInitialY;
    double angleInRadian = Math.atan2(yDiff, xDiff);
    PointF pointOnCircle = new PointF();
    pointOnCircle.x = circleCenter.x + ((float)(circleRadius*(Math.cos(angleInRadian))));
    pointOnCircle.y = circleCenter.y + ((float)(circleRadius*(Math.cos(angleInRadian))));