2016-01-18 3 views
0

Как и в названии, я хочу сделать вращающийся диск, который будет вращаться, когда я нажму игру на медиаплеере. Вот код для моего ImageView (сейчас он движется onTouch):Как подключить вращающийся ImageView к MediaPlayer, чтобы он вращался, когда MediaPlayer играет в android

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

К сожалению, программа замерзает, когда я нажимаю кнопку воспроизведения и раздавливает несколько мгновений спустя.

Любые предложения?

ответ

1

Ваша проблема заключается в том, что вы вводите цикл while(), который останавливает остальную часть вашего приложения во время его обработки. Помните, что вы не в отдельном потоке, так что, пока код в вашем цикле while() не выполняется, ничего больше. Вы пытаетесь сделать самодельный цикл «draw» для выполнения анимации, но вы не можете просто остановить все остальное, чтобы выполнить одно действие. Вместо этого вы должны нажать триггер анимацию, которая начнется при нажатии кнопки воспроизведения. Попробуйте это вместо того, чтобы ...

В вашей папке anim внутри папок res, добавьте в файл поворот анит 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); 

Чтобы остановить анимацию вращения, вы можете просто позвонить clearAnimation() на вашем ImageView.

Надеюсь, это поможет!

+0

Это действительно помогло! Большое спасибо! –

+0

Нет проблем. Рад помочь! – NoChinDeluxe

+0

Есть ли способ остановить анимацию, не очистив ее? Когда я его очищу, ImageView вернется в исходное положение, и я бы хотел, чтобы он оставался таким, каким он остановился. –

0

Рассматривается с помощью gif, показывающего вращающееся изображение?

 Смежные вопросы

  • Нет связанных вопросов^_^