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

在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()方法的行为已经修复,可以正常使用,无需添加延迟。

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

相关·内容

内存泄露的一些坑

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

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

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

    33920

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

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

    95630

    Android开发之属性动画

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

    83350

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

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

    1.4K50

    【工具】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,可以轻松创建在所有屏幕尺寸的设备上看起来都很棒的流畅动画和特效。

    35611

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

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

    3.5K30

    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样式的开发:Property Animation篇

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

    1K40

    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 API在android.view.animation 包中,而Property Animation API在android.animation包中。...; ValueAnimator 在上篇博客Android动画基础详析 | 概述、逐帧动画、视图动画(附诸多实际运行效果动图)的基础上我们新建一个property包和一个PropertyActivity:

    1.5K20

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

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

    1.5K30

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

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

    1.5K20

    自定义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自定义控件三部曲文章

    83420

    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

    实战总结 Android 悬浮窗适配方案

    但是这种方案有如下缺点: 适配问题,悬浮窗权限在不同设备上由于不同产商实现不同,适配难 向用户申请权限,打开率较低,体验较差 方案二:addContentView实现 ---- 原理:Activity...利用该接口可以在 Activity 上添加 View。 这里你可能会问: 1、那只能在一个 Activity 上添加吧?...没错,是只能在当前 Activity 上添加,但是由于游戏通常也就在一个 Activity 跑,因此基本上是可以接受的。 2、只 add 一个 view,那拖动怎么实现?...2、方案二简单方便,但是用到了 Activity 的 addContentView 方法,在某些游戏引擎上使用会有问题。...因为有些游戏引擎不是在 Activity 上跑的,而是在NativeActivity 上跑 3、方案三是我们当前采用的方案,目前还暂未发现有显示不出来之类的问题~ 4、本文讲述的方案只是 Demo 哈,

    1.3K10

    应用内悬浮窗适配方案实战

    但是这种方案有如下缺点: 1、适配问题,悬浮窗权限在不同设备上由于不同产商实现不同,适配难。...利用该接口可以在Activity上添加View。 这里你可能会问: 1、那只能在一个Activity上添加吧?...没错,是只能在当前Activity上添加,但是由于游戏通常也就在一个Activity跑,因此基本上是可以接受的。 2、只add一个view,那拖动怎么实现?...2、方案二简单方便,但是用到了Activity的addContentView方法,在某些游戏引擎上使用会有问题。...因为有些游戏引擎不是在Activity上跑的,而是在NativeActivity上跑 3、方案三是我们当前采用的方案,目前还暂未发现有显示不出来之类的问题~ 4、本文讲述的方案只是Demo哈,实际使用还需要考虑刘海屏的问题

    1.6K40

    Kubernetes 1.28:介绍原生 Sidecar 容器

    设置此字段会更改 Init 容器的行为,如下所示: 如果容器退出则重新启动 所有后续的 Init 容器在 startupProbe[4]成功完成后立即启动,而不是等待可重新启动的 Init 容器退出 Pod...因此,你可以确保清单中的边车容器会在边车声明之后的所有容器之前启动。 边车容器不会延长 Pod 的生命周期,因此你可以在生命期较短的 Pod 中使用 它们,而无需更改 Pod 生命周期。...边车容器在退出时会重新启动,这提高了可靠性,从而允许你使用边车来为主容器提供更为可靠的服务。...这提高了 Pod 中日志收集的可靠性。 作业,可以将边车用于任何目的,而 Job 的完成不会被正在运行的边车所阻止。无需额外配置即可确保此行为。 1.28 之前用户是如何实现边车行为的?...[13] 多年来的反馈以及在实现过程中的早期尝试 derekwaynecarr[14] 和 dchen1107[15] 的领导 jpbetz[16] 对 API 和终止排序的设计以及代码评审 Joseph-Irving

    1.3K40
    领券