PRELOADER

不念过去 不负现在 不畏将来

当前文章 : 《猜歌游戏小结(三) 设置动画效果》

12/4/2018 —— 

一、说明

在该游戏中,中间有一个唱片机会旋转,表示正在播放音乐,配套还有一个唱片杆,配合实现整个唱片机的效果。因此,需要实现动画效果。盘片会旋转,而唱片杆会绕一个固定点旋转。

二、方法

  • 1、首先实现唱片布局。将几个图片进行组合,最终形成一个完整的唱片机布局,包括一个盘片,一个唱片杆,在唱片上放置一个点击按钮,这个按钮需要设置一个点击效果,即小结(二)的内容。

  • 2、这个布局是一个子布局,这个布局需要在主布局里进行include.

  • 3、引入动画类Animation,LinearInterpolator.

    //盘片
    private Animation mPanAnim;
    private LinearInterpolator mPanLin;

    //拨杆
    private Animation mBarInAnim;
    private LinearInterpolator mBarInLin;
  • 4、在res中新建anim文件夹,设置动画效果文件,如下为盘片旋转效果。
    `
    <?xml version=”1.0” encoding=”utf-8”?>

    <rotate

      android:duration="2400"
      android:fromDegrees="0"
      android:pivotX="50%"
      android:pivotY="50%"
      android:repeatCount="3" //重复次数为3次
      android:toDegrees="359" /> 旋转角度360
    


- 5、在该文件夹下,设置拨杆的动画效果。由于拨杆进入和退出时两种不同的动画,所以要定义两个文件。

- 6、在java代码中,进行动画初始化。

```java
    mPanAnim = AnimationUtils.loadAnimation(this,R.anim.rotate);
    mPanLin = new LinearInterpolator();
    mPanAnim.setInterpolator(mPanLin);
  • 7、由于动画效果,是通过点击盘片上的按钮来实现切换的,而动画效果是配合播放按钮来体现的,因此动画效果的开始和结束应该在按钮的点击事件中进行处理。也因此,需要先初始化一个按钮(imageButton),并设置其点击事件。
//播放按钮事件
    private void handlePlayButton() {
        if (mViewPanBar != null) {
            if (!mIsRunning) {
                mIsRunning = true;
                // 开始拨杆进入动画
                mViewPanBar.startAnimation(mBarInAnim);
                mBtnPlayStart.setVisibility(View.INVISIBLE);//隐藏播放按钮

                //播放音乐
                MyPlayer.playSong(MainActivity.this,mCurrentSong.getSongFileName());
            }
        }
    }
  • 8、 设置动画监听器。因为这几个动画效果之间具有一定的逻辑,执行的时候具有先后顺序,并且一个动画结束意味着需要进行下一个动画。所以需要监听各个动画的执行。类似的一个动画效果均设置动画监听。
mPanAnim.setAnimationListener(new Animation.AnimationListener() {
            @Override
            //动画开始执行的时候
            public void onAnimationStart(Animation animation) {

            }

            @Override
            //动画结束执行的时候
            public void onAnimationEnd(Animation animation) {
                //唱片旋转结束后,拨杆退出,恢复原形
                mViewPanBar.startAnimation(mBarOutAnim);
            }

            @Override
            //动画重复执行的时候
            public void onAnimationRepeat(Animation animation) {

            }
        });