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

Android进阶学习-属性动画(使用Animator封装特效工具类1)

2016-04-13 00:00 816 查看
其实关于Animation动画还是有点不足的,动画过后容易造成事件丢失,测试下面的例子

[code=plain]TranslateAnimation =new TranslateAnimation(0, 0, 100, 100);
rotateAnimation.setDuration(1000);
translateAnimation.setFillAfter(true);
translateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
translateBtn.startAnimation(translateAnimation);
}
});

多次点击Button后,它越走越远,但是一定距离后就造成了事件丢失.怎么回事呢?是因为Animation的动画只是改变了绘制出来的图片的位置,而View得位置是没有变的.因此我们绑定在View的事件就好像丢失了,实际上你点击原来View的位置.点击事件还是存在的,但是你只是View已经看不到了而已.那么我们有没有解决方法呢?有

1.存储位移的位置,然后在动画结束的时候使用View.invalidate(int l,int t,int r,int b)去从新绘制View的位置,使其与动画位置一直.

2.使用属性动画Animator代替Animation(推荐)

我们来聊聊Animator的用法吧,首先它能实现Animation的效果,也有类似AnimationSet的类去把动画装起来一起播放或者按顺序播放

简单用法,

[code=plain]    ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(v, "alpha", 0, 1);
alphaAnimator.start();

其中v就是需要作用的View,就是"alpha"是需要设置的属性,0是初始化的透明度,1是结束的透明度.一些Animation的方法,在这里也几乎是一样的,所以更多方法请移步前面一般动画的文章.

有朋友可能会问,我怎么知道第二个属性填什么内容?很简单,你可以使用v.set????这样写,看IDE工具提示什么东西,如果是与动画相关的几乎都能写例如v.setTranslationX(),那么你第二个参数就可以写translationX.其实一共就那么四个.不过还可以自己去定义,后面会给一面文章讲一下自定义属性配合属性动画来做动画.

还有一个AnimatorSet,这个类相对于前面的来说比较有趣,说一些除了设置持续时间等于AnimationSet雷同的常见的方法

[code=plain]    playTogether(Animator a1,Animator a2,...)    //后面可以跟无数多个动画,一起播放的
playSequentially(Animator a1,Animator a2,...)    //类似上面那个,不过是按顺序播放
play(Animation a)
with(Animation a)
before(Animation a)
after(Animation a)

上面四个方法连着说才好理解

[code=plain] set.play(Animator a1).with(Animator a2).before(Animator a3).after(Animator a4);

a3->a1,a2->a4 //箭头是顺序播放,逗号是一起播放

就大概这么点东西,当然只是皮毛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息