您的位置:首页 > 移动开发 > Android开发

Android模仿QQ音乐播放旋转的圆形ImageView

2015-09-29 10:35 537 查看
这里会用到背景虚化和圆形的ImageView控件,可以参考我之前的博文。

背景虚化

圆形ImageView

首先继承AnimatorUpdateListener类,对控件状态进行更新,代码如下:

class MyAnimatorUpdateListener implements AnimatorUpdateListener {
public MyAnimatorUpdateListener(ObjectAnimator animator) {
this.animator = animator;
}

/**
* 暂停状态
*/
private boolean isPause = false;
/**
* 是否已经暂停,如果一已经暂停,那么就不需要再次设置停止的一些事件和监听器了
*/
private boolean isPaused = false;

private boolean isPlay = true;
/**
* 当前的动画的播放位置
*/
private float fraction = 0.0f;
/**
* 当前动画的播放运行时间
*/
private long mCurrentPlayTime = 0l;

/**
* 是否是暂停状态
*
* @return
*/
private ObjectAnimator animator;

public boolean isPause() {
return isPause;
}

public boolean isPlay() {
return isPlay;
}

/**
* 停止方法,只是设置标志位,剩余的工作会根据状态位置在onAnimationUpdate进行操作
*/
public void pause() {
isPause = true;
isPlay = false;
}

public void play() {
isPause = false;
isPaused = false;
isPlay = true;
}

@Override
public void onAnimationUpdate(ValueAnimator animation) {
/**
* 如果是暂停则将状态保持下来,并每个刷新动画的时间了;来设置当前时间,让动画
* 在时间上处于暂停状态,同时要设置一个静止的时间加速器,来保证动画不会抖动
*/
if (isPause) {
if (!isPaused) {
mCurrentPlayTime = animation.getCurrentPlayTime();
fraction = animation.getAnimatedFraction();
animation.setInterpolator(new TimeInterpolator() {
@Override
public float getInterpolation(float input) {
return fraction;
}
});
isPaused = true;
}
// 每隔动画播放的时间,我们都会将播放时间往回调整,以便重新播放的时候接着使用这个时间,同时也为了让整个动画不结束
new CountDownTimer(ValueAnimator.getFrameDelay(),
ValueAnimator.getFrameDelay()) {

@Override
public void onTick(long millisUntilFinished) {
}

@Override
public void onFinish() {
animator.setCurrentPlayTime(mCurrentPlayTime);
}
}.start();
} else {
// 将时间拦截器恢复成线性的,如果您有自己的,也可以在这里进行恢复
animation.setInterpolator(null);
}
}
}


然后声明一个ObjectAnimator对象,一个MyAnimatorUpdateListener对象,核心使用代码如下:

LinearInterpolator lin = new LinearInterpolator();//声明为线性变化
anim = ObjectAnimator.ofFloat(v, "rotation", 0f, 360f);//设置动画为旋转动画,角度是0-360
anim.setDuration(15000);//时间15秒,这个可以自己酌情修改
anim.setInterpolator(lin);
anim.setRepeatMode(Animation.RESTART);//设置重复模式为重新开始
anim.setRepeatCount(-1);//重复次数为-1,就是无限循环
listener = new MyAnimatorUpdateListener(anim);//将定义好的ObjectAnimator传给MyAnimatorUpdateListener监听
anim.addUpdateListener(listener);//给动画加监听
bt.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {

Button bt = (Button) arg0;

if (isFirst) {//如果是第一次进入或者点击,开始动画
anim.start();
bt.setText("pause");
isFirst = false;
} else {

if (listener.isPause()) {//不是第一次,则判断当前动画的状态,如果是播放就暂停........
listener.play();
bt.setText("pause");
} else if (listener.isPlay()) {
listener.pause();
bt.setText("start");
}
}
}
});


上张效果图:



最后附上完整代码,有需要的可以下载研究。

点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: