【问题标题】:Moving an Image in circular motion based on touch events in android基于android中的触摸事件以圆周运动移动图像
【发布时间】:2013-12-31 01:33:03
【问题描述】:

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

基于 onTouch, ACTION_MOVE 事件,我正在尝试移动它。

不,困境是用户可能不会以完美的圆形方式移动手指,但我想确保图像仍然围绕这个圆圈的边缘移动。

我目前在 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;
        }

【问题讨论】:

    标签: android math transform touch-event


    【解决方案1】:
    1. 计算圆的中心点
    2. 获取当前接触点
    3. 计算中心和新接触点之间的角度
    4. 使用圆的角度和半径计算圆上的点 (x = r * cos(angle), y = r * sin(angle))。
    5. 将图像位置重置到新点。

    要获得角度,请使用以下等式

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

    【讨论】:

    • 问题是我没有旋转图像。我正在沿着圆圈移动它,所以我不想旋转它。如何在圆上将图像移动一定角度
    • 非常感谢所有帮助...最后一个问题。由于我的侦听器设置为 imageview,getx() 和 gety() 给我 x, y 相对于图像。我如何找到相对于圆的 x,y。 circle 和 image 都是同一个父级的子级
    • 将监听器添加到ImageView的父级,并根据父级定义你的圈子。
    • 非常感谢您的帮助。顺便说一句,P1-y 和 P1_x 是圆心的坐标,对吧?
    • 好的,这不起作用。它不是围绕圆圈旋转,实际上触摸点已成为旋转的中心点。我已经发布了代码。你能检查一下吗?我已经更新了代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多