笔记73 | 实现音乐转盘的旋转和暂停效果

RotateAnimation实现转动动画:

package com.jikexueyuan.rotateanimation;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;

public class MainActivity extends Activity {


    private RotateAnimation ra;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ra = new RotateAnimation(
                0 //fromDegrees起始角度
                , 360 //toDegrees旋转角度
                , Animation.RELATIVE_TO_SELF, 0.5f,//pivotXType 旋转中心的X轴
                //RELATIVE_TO_SELF:相对自身
                Animation.RELATIVE_TO_SELF, 0.5f//pivotXValue 旋转中心的Y轴
                );
        ra.setDuration(1000);

        findViewById(R.id.btnRotateMe).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                arg0.startAnimation(ra);
            }
        });
    }
}

在ra.xml中实现动画:

package com.jikexueyuan.rotateanimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;

public class MainActivity extends Activity {


    private RotateAnimation ra;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btnRotateMe).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                arg0.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.ra));
            }
        });
    }
}

ra.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:duration="1000"
    android:pivotX="50%"
    android:pivotY="50%" >

</rotate>

使用RotateAnimation实现旋转暂停

package com.even.Demo;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;

public class rotateImageView_ro extends ImageView{

    public static final int STATE_PLAYING =1;//正在播放
    public static final int STATE_PAUSE =2;//暂停
    public static final int STATE_STOP =3;//停止
    public int state;

    private float angle;//记录RotateAnimation中受插值器数值影响的角度
    private float angle2;//主要用来记录暂停时停留的角度,即View初始旋转角度
    private int viewWidth;
    private int viewHeight;
    private MusicAnim musicAnim;

    public rotateImageView_ro(Context context) {
        super(context);
        init();
    }

    public rotateImageView_ro(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public rotateImageView_ro(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init(){
        state = STATE_STOP;
        angle = 0;
        angle2 = 0;
        viewWidth = 0;
        viewHeight = 0;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        viewWidth = getMeasuredWidth();
        viewHeight = getMeasuredHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.rotate(angle2,viewWidth/2,viewHeight/2);
        super.onDraw(canvas);
    }

    public class MusicAnim extends RotateAnimation{
        public MusicAnim(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
            super(fromDegrees, toDegrees, pivotX, pivotY);
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            angle = interpolatedTime * 360;
        }
    }

    public void playMusic(){
        if(state == STATE_PLAYING){
            angle2 = (angle2 + angle)%360;//可以取余也可以不取,看实际的需求
            musicAnim.cancel();
            state = STATE_PAUSE;
            invalidate();
        }else {
            musicAnim = new MusicAnim(0,360,viewWidth/2,viewHeight/2);
            musicAnim.setDuration(3000);
            musicAnim.setInterpolator(new LinearInterpolator());//动画时间线性渐变
            musicAnim.setRepeatCount(ObjectAnimator.INFINITE);
            startAnimation(musicAnim);
            state = STATE_PLAYING;
        }
    }

    public void stopMusic(){
        angle2 = 0;
        clearAnimation();
        state = STATE_STOP;
        invalidate();
    }
}

使用ObjectAnimator实现旋转暂停:

public class rotateImageView_ob extends ImageView{

    ObjectAnimator rotateanimation;
    public static int PLAY = 1;
    public static int PAUSE = 2;
    public static int STOP = 3;


    public rotateImageView_ob(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public rotateImageView_ob(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public rotateImageView_ob(Context context) {
        super(context);
        init();
    }

    public int statics = 0;
    private void init(){
        statics = PAUSE;
        rotateanimation = ObjectAnimator.ofFloat(this, "rotation", 0f , 360f);
        rotateanimation.setDuration(12000);
        rotateanimation.setInterpolator(new LinearInterpolator());
        rotateanimation.setRepeatCount(ObjectAnimator.INFINITE);
        rotateanimation.setRepeatMode(ObjectAnimator.RESTART);
    }

    public void Play(){
        if (statics == STOP) {
            rotateanimation.start();
            statics = PLAY;
        }else if(statics == PAUSE){
            rotateanimation.resume();
            statics = PLAY;
        }else if (statics == PLAY) {
            rotateanimation.pause();
            statics = PAUSE;
        }
    }

    public void stop(){
        rotateanimation.end();
        statics = STOP;
    }
}

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2018-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴小龙同學

GitHub之PhotoView使用

PhotoView使用在ViewPager中 GitHub地址:https://github.com/chrisbanes/PhotoView 1 2 3...

3416
来自专栏非著名程序员

Android实现竖着的滑动刻度尺效果,选择身高(竖向的)

这次是你想要的效果哦!高兴了吧?高兴地话,你不用给我打赏,分享到朋友圈,我就很高兴了。 群里有人问我要竖着的滑动尺效果,前天我贱贱地分享了一个横向的滑动效果,...

1946
来自专栏吴小龙同學

Android Lollipop新特性-Palette

效果预览 ? 使用方法 Palette可以提取的颜色如下 Vibrant (有活力的) Vibrant dark(有活力的 暗色) Vibrant light(...

2977
来自专栏Samego开发资源

ViewPager使用FragmentPagerAdapter适配器

1513
来自专栏向治洪

android 自定义下拉菜单

    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计。弹出的动画效果主要用到了translate...

1856
来自专栏指尖下的Android

FragmentTabHost中切换Fragment保存状态

892
来自专栏向治洪

Android实现仿支付宝流水

今天给大家讲的是如何自定义下拉的ListView实现支付宝账单的效果,月份是需要悬浮的,然后没一个月归为一类,先看一个效果图吧。 ? 场景:后台下发的数据就是一...

3888
来自专栏编程之路

羊皮书APP(Android版)开发系列(十七)Android 底部菜单栏实现

872
来自专栏向治洪

android上拉下拉加载更多数据

最近项目中用到了ListView的下拉刷新的功能,总结了一下前辈们的代码,单独抽取出来写了一个demo作为示例。 效果图 下拉刷新: ? 加载更多: ? Cu...

2346
来自专栏非著名程序员

Android学习笔记(一)之仿正点闹钟时间齿轮滑动的效果

看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在...

19510

扫码关注云+社区