使用 onTouch MotionEvent.ACTION_MOVE 移动连续旋转的图像视图 android

Moving a continuously rotating imageview android using onTouch MotionEvent.ACTION_MOVE

我正在尝试使用 onTouch 事件移动连续旋转的图像视图,但在重新定位图像视图之后。它不绕着自己的轴旋转,而是绕着一条长长的圆形路径旋转。

我想要的是像下图这样的东西:

CLICK HERE FOR IMAGE

使用 onTouch 事件重新定位后我得到的是:

CLICK HERE FOR IMAGE

到目前为止,我可以使用以下代码围绕其自身的轴旋转图像:

RotateAnimation rotateanimation = new RotateAnimation(0, 360,
            Animation.RELATIVE_TO_SELF, 0.5f,
            Animation.RELATIVE_TO_SELF, 0.5f);

我认为它与我无法弄清楚的 pivotPoints 有关。下面是代码。

    final ImageView iv = findViewById(R.id.imageView);
    final RotateAnimation rotateAnimation;


    RotateAnimation rotateanimation = new RotateAnimation(0, 360,
            Animation.RELATIVE_TO_SELF, 0.5f,
            Animation.RELATIVE_TO_SELF, 0.5f);

    rotateanimation.setDuration(7000);
    rotateanimation.setInterpolator(new LinearInterpolator());
    rotateanimation.setRepeatCount(Animation.INFINITE);
    rotateanimation.setFillAfter(true);
    iv.startAnimation(rotateanimation);


        iv.setOnTouchListener(new View.OnTouchListener() {
        PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
        PointF StartPT = new PointF(); // Record Start Position of 'img'


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


            switch (event.getAction())
            {
                case MotionEvent.ACTION_MOVE :
                    PointF mv = new PointF( event.getX() - DownPT.x -1, event.getY() - DownPT.y -1);
                    iv.setX((int)(StartPT.x+mv.x));
                    iv.setY((int)(StartPT.y+mv.y));

                    iv.setPivotX(StartPT.x+mv.x);
                    iv.setPivotY(StartPT.y+mv.y);

                    //something to do here i guess
                     rotateanimation = new RotateAnimation(0, 360,
                            Animation.RELATIVE_TO_SELF, iv.getPivotX(),
                            Animation.RELATIVE_TO_SELF, iv.getPivotY());

                    iv.startAnimation(rotateanimation);

                    /**************************************************************/

                    StartPT = new PointF( iv.getX(), iv.getY() );
                    break;
                case MotionEvent.ACTION_DOWN :

                    int centerXOnImage= iv.getWidth()/2;
                    int centerYOnImage= iv.getHeight()/2;

                    DownPT.x =centerXOnImage;
                    DownPT.y =centerYOnImage;

                    StartPT = new PointF( iv.getX(), iv.getY() );
                    break;
                case MotionEvent.ACTION_UP :
                    // Nothing have to do
                    break;
                default :
                    break;
            }
            return true;
        }
    });

有什么建议吗??

经过 2 天的摸索和谷歌搜索,我找到了方法。

您需要做的就是使用 event.getRawX() 和 event.getRawY() 而不是 event.getX() 和 event.getY()。它会在用户手指下不断旋转 imageview。

我将 RotateAnimation 更改为 ObjectAnimation,因为当用户触摸围绕正在播放的动画时,标准动画会表现得很奇怪。

代码如下:

ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "rotation",360f);
    anim.setDuration(7000);
    anim.setInterpolator(new LinearInterpolator());
    anim.setRepeatCount(Animation.INFINITE);
    anim.start();





       iv.setOnTouchListener(new View.OnTouchListener() {

        PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
        PointF StartPT = new PointF(); // Record Start Position of 'img'


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




            switch (event.getAction())
            {
                case MotionEvent.ACTION_MOVE :



                    PointF mv = new PointF( event.getRawX()  , event.getRawY());


                    iv.setX((int)event.getRawX() - DownPT.x);
                    iv.setY((int)event.getRawY() - DownPT.y);

                    StartPT = new PointF( iv.getX(), iv.getY() );

                    break;
                case MotionEvent.ACTION_DOWN :

                    int centerXOnImage= iv.getWidth()/2;
                    int centerYOnImage= iv.getHeight()/2;

                    DownPT.x =centerXOnImage;
                    DownPT.y =centerYOnImage;

                    StartPT = new PointF( iv.getX(), iv.getY() );


                    anim.setDuration(2000);
                    anim.start();

                    break;
                case MotionEvent.ACTION_UP :

                   //do stuff here
                    break;
                default :
                    break;
            }
            return true;
        }
    });

希望对以后的人有所帮助:)