Android 属性动画

Android最简单的属性动画是TranslateAnimation。
这样使用:
我们假设已经有一个ImageView,控件当然可以自由选取。来看第一个:
1、
    TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 0);
animation.setDuration(1000);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.startAnimation(animation);
这是比较简单可能也会是你最早接触到的一种处理动画的方式。但是这个TranslateAnimation有一个弊端,在不同的Android版本之上表现的效果有所不同:1)当进行这个动画过程当中,ImageVIew虽然在经历了一秒钟之后到达了我们想要的X-200,但是如果这个ImageView是有点击事件的,那么你点击它的时候这个点击事件很奇怪的没有被触发。而当你点击这个ImageView本来所在的位置之时,这个事件被触发了。很明显,我们只是看到了ImageVIew移动,但是它实质上还在原来的地方。2)这个ImageVIew在1S之后到达x-200,到达之后立即回到原来的位置--这就不是我们想要的了。所以,如果只是简单的动画而不需要太多复杂的处理的时候,是可以选择使用这种方式的,但是如果你的动画要比较酷炫,用TranslateAnimation绝不是一个好的方式。
2、再看这一种:
ObjectAnimator.ofFloat(imageView,"translationX",0f,200f).setDuration(1000).start();
ObjectAnimator.ofFloat(imageView,"translationY",0f,360f).setDuration(1000).start();
ObjectAnimator.ofFloat(imageView,"rotation",0f,360f).setDuration(1000).start();
ObjectAnimator可以做到TranslateAnimation那样的动画效果,并且不存在上述所说的问题。只需稍作解释你就会明白它是怎么用的了:ImageVIew--代表你要把这个动画功能加给谁,“translationX”,还有“translationY”,"rotation"分别表示在X轴,Y轴,移动和旋转。然后去start它吧,当然还有持续时间Duration。值得一提的是,这三个动画在所有人看来将会是同时进行的,你绝不会看到他们在你的手机上顺序执行。当然你还可以这样用:
        ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "translationX", 0f, 200f);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "translationY", 0f, 360f);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);
AnimatorSet set = new AnimatorSet();
// set.playTogether(objectAnimator1, objectAnimator2, objectAnimator3);
set.play(objectAnimator1).with(objectAnimator2);
set.play(objectAnimator3).after(objectAnimator1);
set.setDuration(1000);
set.start();
具体做了什么其实无需赘言,那些简单的英文表达的很清楚了。
可是当我们的动画进行之时我们如果想借助动画做其他事情怎么办呢:
看一个例子就清楚了:
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
animator.setDuration(1000);
animator.start();
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}

@Override
public void onAnimationEnd(Animator animation) {
}

@Override
public void onAnimationCancel(Animator animation) {
}

@Override
public void onAnimationRepeat(Animator animation) {
}
});
看见这几个重写的方法感觉稍有麻烦,还可以只用你其中想用的:
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Toast.makeText(MainActivity.this, "animation end", Toast.LENGTH_SHORT).show();
}
});
3、再看一种:
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("translationX",0f,200f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationY",0f,200f);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("rotation",0f,360f);
ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2, p3).setDuration(1000).start();
这个效果完全和上面的一模一样,只是它其实被做了一些优化。
来做一个demo,可弹出和收回的酷炫的动画按钮:
布局及其简单:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button android:id="@+id/button1"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/o1"/>
<Button android:id="@+id/button2"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/o2"/>
<Button android:id="@+id/button3"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/o3"/>
<Button android:id="@+id/button4"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/o4"/>
<Button android:id="@+id/button5"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/o5"/>
</FrameLayout>
接下来来写JAVA:
public class MainActivity extends Activity implements View.OnClickListener{

private int[] res = {R.id.button5,R.id.button1,R.id.button2,R.id.button3,R.id.button4};
private List<Button> buttonList = new ArrayList<Button>();
private boolean flag;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < res.length; i++){
Button button = (Button) findViewById(res[i]);
button.setOnClickListener(this);
buttonList.add(button);
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button5:
if(!flag){
startAnimation();
}else {
endAnimation();
}
break;
case R.id.button1:
Toast.makeText(MainActivity.this, "button1", Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
Toast.makeText(MainActivity.this, "button2", Toast.LENGTH_SHORT).show();
break;
case R.id.button3:
Toast.makeText(MainActivity.this, "button3", Toast.LENGTH_SHORT).show();
break;
case R.id.button4:
Toast.makeText(MainActivity.this, "button4", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}

private void startAnimation() {
flag = true;
for (int i = 0 ; i < res.length; i++){
ObjectAnimator animator = ObjectAnimator.ofFloat(buttonList.get(i), "translationY",0f,i*150f);
animator.setDuration(i*500);
animator.setInterpolator(new BounceInterpolator());//这里是动画过程中的效果,你可以看看除了BounceInterpotor还有其他什么效果
animator.start();
}
}

private void endAnimation() {
flag = false;
for (int i = 0 ; i < res.length; i++){
ObjectAnimator animator = ObjectAnimator.ofFloat(buttonList.get(i), "translationY",i*150f,0f);
animator.setDuration(i * 500);
animator.start();
}
}
}
没了!这就结束了!
demo:http://download.csdn.net/detail/crownlee/9096355






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值