如何将旋转的 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?