如何将旋转的 ImageView 连接到 MediaPlayer,以便在 android 中播放 MediaPlayer 时旋转
How to connect a rotating ImageView to MediaPlayer so that it rotates when MediaPlayer is playing in android
如标题所示,我想做一个旋转的光盘,当我在媒体播放器上点击播放时,它会旋转。这是我的 ImageView 的代码(现在它在 Touch 上移动):
public class DjDiscsHandler {
public static double mCurrAngle = 0;
public static double mPrevAngle = 0;
public static void Discs(final ImageView djDisc, final String side) {
djDisc.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final float xc = djDisc.getWidth() / 2;
final float yc = djDisc.getHeight() / 2;
final float x = event.getX();
final float y = event.getY();
switch(side) {
case "left":
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
break;
}
case MotionEvent.ACTION_MOVE: {
mPrevAngle = mCurrAngle;
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
Log.i("Current Angle", "" + mCurrAngle);
animate(mPrevAngle, mCurrAngle, 0, djDisc);
break;
}
case MotionEvent.ACTION_UP: {
mPrevAngle = mCurrAngle = 0;
break;
}
}
break;
case "right":
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
break;
}
case MotionEvent.ACTION_MOVE: {
mPrevAngle = mCurrAngle;
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
animate(mPrevAngle, mCurrAngle, 0, djDisc);
break;
}
case MotionEvent.ACTION_UP: {
mPrevAngle = mCurrAngle = 0;
break;
}
}
break;
}
return true;
}
});
}
public static void animate(double fromDegrees, double toDegrees, long durationMillis, final ImageView djDiscLeft) {
final RotateAnimation rotate = new RotateAnimation((float) fromDegrees, (float) toDegrees,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(durationMillis);
rotate.setFillEnabled(true);
rotate.setFillAfter(true);
djDiscLeft.startAnimation(rotate);
}
}
我在这里找到了代码:How can i use RotateAnimation to rotate a circle?
现在我想将它添加到我的 mediaplyer 处理程序中:
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Deck.mediaplayerReadyLeft) {
Deck.mediaplayerLeft.start();
double mCurrAngle = 0;
while(Deck.mediaplayerLeft.isPlaying()) {
DjDiscsHandler.animate(mCurrAngle, mCurrAngle + 1, 0, Deck.djDiscLeft);
mCurrAngle++;
}
}
}
});
不幸的是,当我按下播放键时程序卡住了,片刻之后就崩溃了。
有什么建议吗?
您的问题是您正在进入一个 while()
循环,该循环会在处理过程中停止您的应用程序的其余部分。请记住,您在这里不在单独的线程上,因此当 while()
循环中的代码执行时,没有其他任何东西。您实质上是在尝试做一个临时 "draw" 循环来执行动画,但您不能只是停止其他所有操作来执行该操作。相反,您可能希望在按下播放按钮时 触发 动画开始。试试这个...
在 res
文件夹内的 anim
文件夹中,添加此旋转动画 xml 文件...
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
然后当开始播放动画时(即,当您点击播放按钮时),您将执行类似这样的操作...
Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
ImageView yourImageView = (ImageView) findViewById(R.id.your_image_view);
yourImageView.startAnimation(rotateAnimation);
要停止旋转动画,只需在 ImageView 上调用 clearAnimation()
。
希望对您有所帮助!
是否考虑使用显示旋转图像的 gif?
如标题所示,我想做一个旋转的光盘,当我在媒体播放器上点击播放时,它会旋转。这是我的 ImageView 的代码(现在它在 Touch 上移动):
public class DjDiscsHandler {
public static double mCurrAngle = 0;
public static double mPrevAngle = 0;
public static void Discs(final ImageView djDisc, final String side) {
djDisc.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final float xc = djDisc.getWidth() / 2;
final float yc = djDisc.getHeight() / 2;
final float x = event.getX();
final float y = event.getY();
switch(side) {
case "left":
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
break;
}
case MotionEvent.ACTION_MOVE: {
mPrevAngle = mCurrAngle;
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
Log.i("Current Angle", "" + mCurrAngle);
animate(mPrevAngle, mCurrAngle, 0, djDisc);
break;
}
case MotionEvent.ACTION_UP: {
mPrevAngle = mCurrAngle = 0;
break;
}
}
break;
case "right":
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
break;
}
case MotionEvent.ACTION_MOVE: {
mPrevAngle = mCurrAngle;
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
animate(mPrevAngle, mCurrAngle, 0, djDisc);
break;
}
case MotionEvent.ACTION_UP: {
mPrevAngle = mCurrAngle = 0;
break;
}
}
break;
}
return true;
}
});
}
public static void animate(double fromDegrees, double toDegrees, long durationMillis, final ImageView djDiscLeft) {
final RotateAnimation rotate = new RotateAnimation((float) fromDegrees, (float) toDegrees,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(durationMillis);
rotate.setFillEnabled(true);
rotate.setFillAfter(true);
djDiscLeft.startAnimation(rotate);
}
}
我在这里找到了代码:How can i use RotateAnimation to rotate a circle?
现在我想将它添加到我的 mediaplyer 处理程序中:
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Deck.mediaplayerReadyLeft) {
Deck.mediaplayerLeft.start();
double mCurrAngle = 0;
while(Deck.mediaplayerLeft.isPlaying()) {
DjDiscsHandler.animate(mCurrAngle, mCurrAngle + 1, 0, Deck.djDiscLeft);
mCurrAngle++;
}
}
}
});
不幸的是,当我按下播放键时程序卡住了,片刻之后就崩溃了。
有什么建议吗?
您的问题是您正在进入一个 while()
循环,该循环会在处理过程中停止您的应用程序的其余部分。请记住,您在这里不在单独的线程上,因此当 while()
循环中的代码执行时,没有其他任何东西。您实质上是在尝试做一个临时 "draw" 循环来执行动画,但您不能只是停止其他所有操作来执行该操作。相反,您可能希望在按下播放按钮时 触发 动画开始。试试这个...
在 res
文件夹内的 anim
文件夹中,添加此旋转动画 xml 文件...
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
然后当开始播放动画时(即,当您点击播放按钮时),您将执行类似这样的操作...
Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
ImageView yourImageView = (ImageView) findViewById(R.id.your_image_view);
yourImageView.startAnimation(rotateAnimation);
要停止旋转动画,只需在 ImageView 上调用 clearAnimation()
。
希望对您有所帮助!
是否考虑使用显示旋转图像的 gif?