首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在API < 19上的valueanimator.cancel之后,valueanimator.start正在重新启动动画

在API < 19上,调用ValueAnimator.cancel()方法会取消正在运行的动画,并将动画的属性值重置为初始值。然而,在取消动画后,调用ValueAnimator.start()方法重新启动动画可能会导致动画无法正常运行。

这是因为在API < 19上,ValueAnimator类的实现方式不同于后续版本。在这些旧版本中,ValueAnimator使用Handler来处理动画更新和回调,而cancel()方法会将Handler的消息队列中的动画消息移除,以取消动画。然而,由于Handler的消息队列是先进先出的,因此在取消动画后立即重新启动动画,可能会导致取消的消息仍然存在于消息队列中,从而导致动画无法正常启动。

为了解决这个问题,可以在重新启动动画之前添加一个延迟,以确保取消的消息已经被处理完毕。可以使用HandlerpostDelayed()方法来实现延迟启动动画。示例代码如下:

代码语言:java
复制
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
animator.setDuration(1000);

// 取消动画
animator.cancel();

// 延迟启动动画
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        animator.start();
    }
}, 100);

在上述代码中,我们使用HandlerpostDelayed()方法将启动动画的代码延迟100毫秒执行,以确保取消的消息已经被处理完毕。这样就可以避免动画无法正常启动的问题。

需要注意的是,上述解决方案仅适用于API < 19的情况。在API >= 19的版本中,ValueAnimator.cancel()ValueAnimator.start()方法的行为已经修复,可以正常使用,无需添加延迟。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android自定义进度条效果

上面图片从左到右分别是效果一,效果二,效果三 需求: 以下四点需要实现 1: 当没有没完成进度时候,显示效果一 2:当进度完成了一部分,显示图二 3:当进度全部完成之后,显示效果三...4:当进度1到进度2需要动画,进度2到进度3需要动画; 同样进度3到进度2或者进度1也需要动画。...是的,但是字体颜色不一样,图三颜色白色,然后把图三放进图二中,得到图四, 因为图二是父布局,图三是子布局,图三放在图二中,只会显示部分视图。 此时把图四和图一叠加!...注意:图一图四下面。 如下图所示,得到图五: ?...XML中,静态自定义GroupView中添加跟图一一样布局,但是需要注意是,颜色不能一致! 自定义布局中,我们需要动态更改自定义ViewGroup宽度,也就是动态更改图二宽度。

1.1K30

内存泄露一些坑

Activity引用,导致Activity对象无法被回收,但是当这个线程执行完了之后,Activity对象就能被成功回收了,这会造成一个崩溃风险,可能在线程里面有调用到一些Activity内部对象...属性动画对象尽量不要用static修饰,static修饰和,这个对象一旦被创建那么就一直存在了,属性动画一旦start之后,那么就一直运行,这时候就算退出activity时候cancel掉动画也仍然会持有...因为valueAnimator是静态,而且添加了动画属性改变监听addUpdateListener,监听回调里面有tvStartPageTime(TextView)控件,默认持有Activity对象...,退出activity之后即便你调用了webView.destroy()方法,也无法释放webview对于activity持有的引用,原因和解决方案可参考Android5.1WebView内存泄漏,...导致内存泄漏 这个问题只有4.0android系统才会存在,5.0以上系统已经不存在了,应该是属于Android一个缺陷 这里写图片描述 问题根源应该就是这: loginPasswdEt.setTransformationMethod

1.7K31

自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*

3、野怪被攻击条件,血量>0 && 防御塔范围内     子弹要打在野怪身上,     下:y+移动距离/子弹攻速     :y-移动距离/子弹攻速     左:x—移动距离/子弹攻速    ...我们分别创建防御塔、妖怪大道、野怪,开启动画不断刷新View,不断计算野怪和防御塔距离,只要小于防御塔半径就对野怪攻击,攻击样式,我们可以动态创建imageview,使用移动动画即可(塔xy -> 野怪...初始化一些野怪,初始化防御塔,我们就在onSizeChanged方法中吧,生命周期中他构造方法后执行,也只会被调动一次。我们先来定义野怪属性,野怪坐标、行走速度、血量。...valueAnimator.start(); } 到这里,动态创建野怪,就完成了,动画会不断重绘View,达到野怪行走效果,updateParticle()方法是控制野怪行走、是否进入防御塔范围方法...if(kingHP<=0){ kingHP = 0; canvas.drawText("失败", towerX, towerY, kingPaint); valueAnimator.cancel

29330

自定义View6 -塔防小游戏:第三篇防御塔随意放置+多组野怪

他们攻击互不影响(防御塔随意拖动第二篇),这里用到知识是,自定义view拖动,防御塔是否可以攻击计算,防御塔攻击路径。...,带着疑问,如何刷新数据,如何更新野怪行走数据,如何判断是否开炮射程内。...判断如果可以攻击了,就开启一个从xy(防御塔),移动到x2y2 (野怪)动画动画结束后掉血。...动画开始时不可能再次开启,要符合防御塔一次只能攻击一个野怪效果,这里开炮动画有点问题,就是视觉老是打偏,有的时候炮弹慢的话,就会打在野怪身后,也没有好解决方式。博友有想法请留言。...= null) { //开启动画 addBlame(); // addTower(450,450); valueAnimator.start

30620

教你写一个弹幕库,确定不了解一下?

,数据添加好之后,线程池会执行我们任务DelayRunnable,DelayRunnable是什么呢?...5.BarrageView对子View处理 子View添加来之后,BarrageView会对子View进行高度和宽度测量,测量完之后进行最佳弹幕航道选择和速度设置,最后进行属性动画创建,我们逐个分析...如果前子View不为空,我们需要获取前子View已经滑动距离,并且根据它速度计算剩下滑动时间,用剩下滑动时间下我们计算当前子View不碰撞前提下能够设置最快速度,计算好之后再在用户设置速度区间和不超过最快速度前提下随机生成一个速度...这里需要注意是: 动画执行结束或者BarrageView销毁时候,需要将当前子View从BarrageView中移除。...动画执行结束时候,当前View被移除后会被添加到缓存,之后执行mHandler.sendEmptyMessage(0),mHandler中,如果缓存View过多时候就会清理缓存,这里细节不会过多描述

92330

Android开发之属性动画

通过改变对象属性以达到动画效果,API 11以上可以用,如果想兼容旧版本请使用 https://github.com/JakeWharton/NineOldAndroids 。...属性动画默认时间为300ms,它可以时间间隔内完成对象从一个属性值到另外一个属性值改变。...首先布局和Activity准备代码和之前一样,即在布局中放置一个ImageView,然后程序中获取,接下来介绍几种常见动画使用 1、平移动画 /** * 1.5秒 将图像向Y轴正方向移动...set.gif 6、颜色渐变动画 这种方式比较坑,试了很多种,按上面那些方式行不通,最后想到这个应该是属于任意属性范畴,所以采用了ValueAnimator,监听动画过程,自己来实现属性改变,果然成功了...: // 颜色渐变动画 这个要注意 无法直接采用上面的方法直接来设置 设置了也是无效 这里涉及到给任意属性设置动画问题 private void colorAni(int startColor,

81650

【工具】1923- 12个强大 JavaScript 动画库,可帮助你提升用户体验

它是一个轻量级 JavaScript 动画库,具有简单 API,可用于对 CSS 属性、SVG、DOM 属性和 JavaScript 对象进行动画处理。...使用 Anime.js,我们可以播放、暂停、重新启动或反转动画。该库还提供了令人惊叹功能,可以通过以下和重叠操作对多个元素进行动画处理。...这样用户就无需手动重新创建由专业设计师 After Effects 中创建高级动画。仅 Web 版本 GitHub 就有超过 27,000 颗星。 3....该库经过了良好测试和积极维护, GitHub 拥有超过 19,000 颗星。 6....11.Mo.js 地址:https://mojs.github.io/ 它提供了一个简单声明式 API,可以轻松创建在所有屏幕尺寸设备看起来都很棒流畅动画和特效。

23211

View.animate()动画ViewPropertyAnimator原理解析

单从命名看好像是通过 Animator 实现,那么真的是这样么? Q2:开头说了,使用这种方式实现动画在某些场景下会有一个坑,这个坑又是什么,是什么场景下呢?...,如 0-100 区间内映射之后数值应该是多少。...ValueAnimator 计算出数值,来自行应用到需要进行动画效果那个 View 。...startAnimation() 启动动画,实际是借助 ValueAnimator 机制, onAnimationUpdate() 里取得每一帧内动画进度时,再自行进行对应 ui 操作来达到动画效果...所以,ViewPropertyAnimator 里所有的动画同一时刻,同一类型动画只支持只有一个处于正在运行中状态,这也就是第 1-3 步意义,它需要去遍历当前每一组里每一个动画,如果类型跟当前设定动画类型一致

1.3K50

Android自定义带动画效果圆形ProgressBar

本文实例为大家分享了Android自定义带动画效果圆形ProgressBar,供大家参考,具体内容如下 最近有个需求显示进度,尾部还要有一标示,像下边这样 ?...使用自定义View方式实现,代码如下,很简单注释很清楚 文章最后我们拓展一下功能,实现一个带动画效果进度条 package com.example.fwc.allexample.progressbar...(0, 0, roundWidth, mPaint); //画完之后恢复画布坐标 canvas.restore(); //画文字将坐标平移至圆心 canvas.translate(center, center...拓展 拓展也很简单,加一个setAnimProgress(int p)设置动画效果: /** * 设置带动画进度 * @param p */ public void setAnimProgress(int...(); } activity中调用这个方法 circleProgressBar.setAnimProgress(65); 效果如下 ?

1.1K20

Android动画绘制原理(源码解析)

最后一种就是3.0之后才出现属性动画PropertyAnimator(在下文我们讲帧动画和补间动画统一称为View动画)。...相比于视图动画,View属性是真正改变了。注意:Android 3.0(API 11)以上才支持。 接下来我们按照倒叙来揭开一个一个动画神秘面纱_。...属性动画可以操作属性相比于补间动画大大增加,除了常用平移、旋转、缩放、透明度还有颜色等,基本能通过View.setXX来设置属性,属性动画都可以操作,这大大增加了我们使用动画灵活性。...动画元素交互 将View移动(平移)后,Android3.0之前系统,不管是View动画还是属性动画,新位置均无法触发单击事件,同时老位置任然可以触发单击事件。...尽管View已经视觉不存在了,将View移回原位置以后,原位置单击事件继续生效。从3.0开始,属性动画单击事件触发位置为移动以后位置,但View动画仍然原位置。

3.3K30

Android自定义View实现圆弧进度效果

:一是直接继承自View,完全自定义;二是原有控件基础上进行改造,达到自己想要效果;还有一种就是自定义组合控件,将已有的控件根据自己需要进行组合实现效果。...1.继承自View (1)重写3个构造方法(新API构造方法是4个) public ArcView(Context context) { this(context,null); } public...(1)动画效果 /** * 为绘制弧度及数据设置动画 * * @param startAngle 开始弧度 * @param currentAngle 需要绘制弧度 * @param currentValue...valueAnimator) { mAnimatorValue = (int) valueAnimator.getAnimatedValue(); postInvalidate(); } }); valueAnimator.start...(Cap和Join设置为弧形);使用CanvasdrawArc方法绘制圆弧及drawText绘制文本信息等;ValueAnimator设置数据及当前圆弧进度动画效果。

1K30

Android十八章:属性动画Android属性动画(第一话)

Android属性动画(第一话) 帧动画,补间动画 Android动画能给界面带来很炫效果,如果我们要实现这些效果,android3.0版本前实现动画主要有2种方式,帧动画和补间动画。...介绍属性动画 为了解决上述问题,新推出了View属性动画,原理是改变view属性,所以我们可以操作缩放移动透明度旋转后view,原理是一段时间内不断设置View.setRotation(),下面我们来介绍一下...translationXAnimator).with(alphaAnimator); animatorSet.setDuration(500); animatorSet.start(); 这里Animator.after将其他动画加到这个动画之后...res/animator文件夹下新建animator.xml (注意,res/anim这个文件夹是放补间动画) 根标签是一个 代表一个ObjectAnimator...标签代表一个AnimatorSet,set标签内默认按照从上到下顺序加载不同动画(就是set设置android:ordering="sequentially"),如果你想同步进行就设置android

1.1K10

Android动画基础详析 | 属性动画基础及ValueAnimator

为什么要引入属性动画 逐帧动画主要是用来实现动画, 而补间动画才能实现控件渐入渐出、移动、旋转和缩放效果; 属性动画Android 3.0时才引入,之前是没有的。...(1)引入时间不同:View Animation是API Level 1时引入;而Property Animation是API Level 11时引入,即从Android 3.0才开始有与Property...Animation相关API。...(2)所在包名不同:View Animation APIandroid.view.animation 包中,而Property Animation APIandroid.animation包中。...; ValueAnimator 在上篇博客Android动画基础详析 | 概述、逐帧动画、视图动画(附诸多实际运行效果动图)基础我们新建一个property包和一个PropertyActivity:

1.3K20

Android样式开发:Property Animation篇

比如,一个按钮做平移动画,虽然按钮的确做了平移,但按钮可点击区域并没随着平移而改变,还是原来位置。而属性动画则可以改变真正属性,从而实现按钮平移时点击区域也跟着平移。...通俗点说,属性动画其实就是一定时间内,按照一定规律来改变对象属性,从而使对象展现出动画效果。 属性动画android 3.0引入动画体系,如果还想适配基本已经灭绝2.x版本,只好绕道了。...执行属性动画分两个步骤: 计算动画值 将动画值应用到对象和属性 ValuAnimiator只完成第一步,即只计算值,要实现第二步则需要在值变化监听器里自行更新对象属性。...最后,通过调用valueAnimator.start()方法启动动画。...写在最后 至此,视图动画和属性动画基本用法都总结完了。示例代码可从github查看,github地址: https://github.com/keeganlee/kstyle.git

97340

自定义View学习——仿QQ消息气泡拖拽黏连删除

参考博客:仿 QQ 未读消息气泡,可拖拽删除,粘连效果 参考博客中实现思路: 首先我们需要两个圆,一个是原点不需要跟随手指圆,一个是跟随手指圆,当用户开始点击时,绘制跟随手指圆和圆未读消息数量...用户松开手指时,同样对两圆之间距离进行判断,如在最远距离内,被拖动圆自行回到原点,如超过最远距离,则在手指释放位置播放删除动画。 废话不多说,先看一下效果图: ?...index */ int bitmapIndex; /** * 判断是否正在播放消失动画,防止死循环重复绘制 */ boolean startDisappear...,动画采用类似帧动画原理 */ private void disappearAnim() { bitmapRect = new Rect(dragCircleX -...roundRectRadius;//圆角矩形半径 private int textContentLength;//总字体宽度 最后说明,因为圆角矩形canvas.drawRoundRect()api21

1.4K30

自定义View(六)-动画- AnimatorSet与XML设置属性动画

playSequentially : 意义是把激活一个动画之后动画之后操作就是动画自己来负责了,这个动画结束之后,再激活下一个动画。...第二:playSequentially只有上一个控件做完动画以后,才会激活下一个控件动画,如果一控件动画是无限循环,那下一个控件就别再指望能做动画了。...)共用时,则表示播放afterAnim动画之后,再播放playAnim动画。...AnimatorSet真正激活延时 = AnimatorSet.startDelay+第一个动画.startDelay AnimatorSet激活之后,第一个动画绝对是会开始运行,后面的动画则根据自己是否延时自行处理...属性 : API 11之后,Android为了支持ViewGroup类控件,添加和移除其中控件时自动添加动画,为我们提供了一个非常简单属性:android:animateLayoutChanges

1.4K20

自定义View(四)-动画- Interpolator与Evaluator

我们以LinearInterpolator来分析插值器(api22以后继承BaseInterpolator,但是逻辑是一样) public class LinearInterpolator extends...什么叫动画进度,动画进度就是动画在时间进度,与我们任何设置无关,随着时间增长,动画进度自然增加,从0到1;input参数相当于时间概念,我们通过setDuration()指定了动画时长...那么计算公式就为: 当前值 = 100 + (400 - 100)* 0.5 公式相当于我们做一个应用题: 小明从100位置开始出发向400位置开始跑去,走到全程距离20%位置时,请问小明在哪个数字点...return (int)(200+startInt + fraction * (endValue - startInt)); } } 这个插值器原来运动值基础加...感谢 站在巨人肩膀可以让我们看更远。 Android自定义控件三部曲文章

79720

Android 贝塞尔曲线实现水纹波动效果

前言 最近工作比较忙碌,很久没有更新文章了,难得国庆小长假,现在是2019年10月2日凌晨00:49,写一篇简单且实用贝塞尔曲线应用,许多技术点文章很多前辈都已经写很好了,所以 如有纰漏之处,...所以我们在这里只需要知道Android API为我们提供了绘制二阶贝塞尔曲线和三阶贝塞尔曲线方法即可。 效果图 本文,最终实现效果如图所示: ?...实现过程 所需要知道 Android API为我们提供了绘制二阶贝塞尔曲线和三阶贝塞尔曲线方法 绘制二阶贝塞尔曲线方法是: /** * Same as quadTo, but the coordinates...此时看起来就比较像水纹了 让水纹波动 水纹波其实就是一个简单属性动画,关于动画我们这里不详细介绍了,可移步至我之前文章 /** * 水波纹属性动画 */ public void startAnim...动画每执行一次就重新绘制一次,需要注意是绘制起点变为 path.moveTo(-WAVE_LENGTH+dx, wavestartY); 执行动画,运行效果如图所示: ?

1.2K10
领券