转载请注明出处:http://blog.csdn.net/fightlei/article/details/52554199
最近在学习用自定义View做一些效果,需要在onDraw()方法中使用属性动画,只是一个简单的需求却遇到了问题。
例如仅仅是使用ValueAnimator.ofFloat()方法,做一个值改变的功能,在onDraw()方法中添加如下代码:
@Override
protected void onDraw(Canvas canvas) {
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
}
很简单的一段代码,但是运行却出现问题,通过打印日志
current value is 1.0
current value is 1.0
发现仅打印了两次,且值一直是endValue 1.0
起初以为是由于在onDraw()方法中使用属性动画,有什么特殊的地方。于是我在构造方法中添加了如上所示相同的代码,果然运行正常,值在duration 300内从0.0变化到了1.0。如果大家看到这里也认为是因为在onDraw()方法中使用导致的,那就和我一样走向不归路了。后来查看别人的博客,发现同样有在onDraw()中使用属性动画的,却没有出现我这样的问题。问题奇怪就在这里,在有些方法中调用相同的代码完全正常,但是在一些方法如onDraw()方法,onClick()方法中调用就会出现值变化只有最终值的问题。
之后纠结了几天又试了许多办法都无果。网上搜了许久,也没有找到类似的问题。
今天偶然在StackOverflow上找到了这个问题的解决办法,所以记录下来。
原来是使用的调试设备的问题,我使用的是真机Samsung Galaxy S4,在该设备的设置->开发者选项,其中有一项是Animator duration scale(动画影像时间伸缩效果),这个值默认是关闭的,我们只需要将该值修改成动画比例1x或其他值即可。
如果有读者也遇到了类似的问题,但不是s4的设备,不妨也顺着这样的思路,尝试解决一下。
如有纰漏,敬请海涵。