android中的属性动画暂停功能的实现

来源:互联网 发布:数据库安全性实验报告 编辑:程序博客网 时间:2024/06/05 13:34

        android 在3.0之前经常使用的tween animation在网上已经有人实现了动画的暂停效果,但是对于property animation的暂停尚未实现,由于项目需要,我将属性动画的暂停、停止、播放的三个操作整理如下

对于视图和属性动画的实例化和事件,请直接看代码

暂停animator首先要达到时间停止,把动画停留在某个时间点,继续播放的时候要从这个时间点继续执行。很幸运的是animator给U我们提供了setCurrentPlayTime的方法,但是这个方法只能让动画回到一个指定的时间点,然后继续执行,所以我们需要寻找一个机制,在动画到达下一个时间点之前,将动画的时间点重新设置到暂停的时间点。ValueAnimator提供了addUpdateListener的方法,我们定义一个AnimatorUpdateListener,在onAnimationUpdate中,调用setCurrentPlayTime回置到暂停的时间点即可。这个时候需要注意,直接调用setCurrentPlayTime会触发onAnimationUpdate会造成死循环,在这里需要使用CountDownTimer来调用setCurrentPlayTime来规避。

要暂停视图的状态就比较容易,同样我们在AnimatorUpdateListener中的onAnimationUpdate,做一些手脚。暂停的时候我们通过ValueAnimator.getAnimatedFraction(); 获取动画当前的状态值临时保存起来。并且在暂停的时候设置 停止状态的TimeInterpolator,在这个TimeInterpolator里面的getInterpolation方法我们直接返回之前临时保存的fraction,这样就能达到状态的暂停。

       重新播放怎么办?

重新播放的时候我们要判断当前如果是暂停的状态,我们就需要将onAnimationUpdate中不再设置setCurrentPlayTime,同时去掉我们设置的暂停TimeInterpolator。

       语言组织比较乱,还是直接上代码吧。


TextView text;Button btnPause;Button btnStop;Button btnPlay;ObjectAnimator animator;static final int ID_BTN_PLAY=1001,ID_BTN_PAUSE=1002,ID_BTN_STOP=1003;MyAnimatorUpdateListener updateListener = new MyAnimatorUpdateListener();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//初始化页面视图,以及增加事件监听LinearLayout container = new LinearLayout(this);container.setOrientation(LinearLayout.VERTICAL);container.setBackgroundColor(Color.rgb(192, 192, 192));setContentView(container);btnPlay = new Button(this);btnPlay.setText("播放");btnPlay.setId(ID_BTN_PLAY);btnPlay.setOnClickListener(this);container.addView(btnPlay);btnPause = new Button(this);btnPause.setText("暂停");btnPause.setId(ID_BTN_PAUSE);btnPause.setOnClickListener(this);container.addView(btnPause);btnStop = new Button(this);btnStop.setText("停止");btnStop.setId(ID_BTN_STOP);btnStop.setOnClickListener(this);container.addView(btnStop);text = new TextView(this);text.setText("我是文本");container.addView(text);animator = ObjectAnimator.ofFloat(text, "x", 0f,200f);animator.setRepeatCount(ValueAnimator.INFINITE);animator.setDuration(2000l);//为了增加animator.addUpdateListener(updateListener);}@Overridepublic void onClick(View v) {int id = v.getId();switch(id){case ID_BTN_PLAY://如果已经暂停,是继续播放if(updateListener.isPause)updateListener.play();//否则就是从头开始播放else animator.start();break;case ID_BTN_STOP://如果点击停止,那么我们还需要将暂停的动画重新设置一下updateListener.play();animator.end();break;case ID_BTN_PAUSE:updateListener.pause();break;}}class MyAnimatorUpdateListener implements AnimatorUpdateListener{/** * 暂停状态 */private boolean isPause = false;/** * 是否已经暂停,如果一已经暂停,那么就不需要再次设置停止的一些事件和监听器了 */private boolean isPaused = false;/** * 当前的动画的播放位置 */private float fraction = 0.0f;/** * 当前动画的播放运行时间 */private long mCurrentPlayTime = 0l;/** * 是否是暂停状态 * @return */public boolean isPause(){return isPause;}/** * 停止方法,只是设置标志位,剩余的工作会根据状态位置在onAnimationUpdate进行操作 */public void pause(){isPause = true;}public void play(){isPause = false;isPaused = false;}@Overridepublic void onAnimationUpdate(ValueAnimator animation) {/** * 如果是暂停则将状态保持下来,并每个刷新动画的时间了;来设置当前时间,让动画 * 在时间上处于暂停状态,同时要设置一个静止的时间加速器,来保证动画不会抖动 */if(isPause){if(!isPaused){mCurrentPlayTime = animation.getCurrentPlayTime();fraction = animation.getAnimatedFraction();animation.setInterpolator(new TimeInterpolator() {@Overridepublic float getInterpolation(float input) {return fraction;}});isPaused =  true;}//每隔动画播放的时间,我们都会将播放时间往回调整,以便重新播放的时候接着使用这个时间,同时也为了让整个动画不结束new CountDownTimer(ValueAnimator.getFrameDelay(), ValueAnimator.getFrameDelay()){@Overridepublic void onTick(long millisUntilFinished) {}@Overridepublic void onFinish() {animator.setCurrentPlayTime(mCurrentPlayTime);}}.start();}else{//将时间拦截器恢复成线性的,如果您有自己的,也可以在这里进行恢复animation.setInterpolator(null);}}}

工程代码下载地址


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办 a2驾照扣10分怎么办 驾驶证强制降级没给驾驶证怎么办 6P升11.2卡了怎么办 b2驾照记满12分怎么办 c1驾驶证没分了怎么办 驾照扣了15分怎么办 驾驶证暂扣六个月后怎么办 醉驾交警不通知怎么办 参军后地方驾驶证年审怎么办 军人驾驶证到期身份证注销了怎么办 资格证脱审30天怎么办 驾驶证c证扣6分怎么办 驾照被扣了9分怎么办 驾驶证被扣了9分怎么办 a2驾驶本扣3分怎么办 c1e没过扣了满分怎么办 c1一下扣12分怎么办 换证体检过不了怎么办 唐山驾驶本到期换本怎么办 北京居住证变更地址了怎么办 眼睛弱视驾驶证换证不了怎么办? 驾照的分扣完了怎么办 驾照被扣了3分怎么办 交警扣了行驶证怎么办 报考驾照时手机号录错怎么办 摩托车被交警队拖走怎么办 汽车牌照被偷了怎么办 代理品牌个体工商营业证怎么办 2地交社保怎么办退休 驾驶证脱审3月怎么办 a1一次性扣12分怎么办 驾照在外地掉了怎么办 在外市考的驾照怎么办 驾照过期3个月怎么办 驾照过期6个月怎么办 b本扣分了6分怎么办 b2驾照提前换证有扣分怎么办 酒驾驾驶证被扣怎么办