使用 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;
}
});
希望对以后的人有所帮助:)
我正在尝试使用 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;
}
});
希望对以后的人有所帮助:)