当前位置: 代码迷 >> Android >> anroid Animation 一个很值得讨论的有关问题
  详细解决方案

anroid Animation 一个很值得讨论的有关问题

热度:142   发布时间:2016-04-28 02:09:28.0
anroid Animation 一个很值得讨论的问题
我想做一件事情 , 就是两个 动画a1,a2.   让a1执行完了去执行a2

我用了两种方法都 不对 一是:
ImageView iv2=new ImageView(getApplicationContext());
Animation anim2= AnimationUtils.loadAnimation(getApplicationContext(),R.anim.breath_down);
 iv2.setImageResource(R.drawable.bubble_red);
 iv2.setAnimation(anim2);

R.anim.breath_down中的内容为:
<set xmlns:android = "http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">

    <scale android:fromXScale = "1.0"
        android:toXScale    = "1.1"
        android:fromYScale  = "1.0"
        android:toYScale    = "1.1"
        android:pivotX      = "0"
        android:pivotY      = "100%"
        android:duration    = "4000"
        android:fillAfter   =  "false"
        android:fillBefore  =  "false"
        android:repeatCount="infinite"/>

    <scale android:fromXScale = "1.1"
        android:toXScale    = "1.0"
        android:fromYScale  = "1.1"
        android:toYScale    = "1.0"
        android:pivotX      = "0"
        android:pivotY      = "100%"
        android:duration    = "4000"
        android:fillAfter   =  "false"
        android:fillBefore  =  "false"
        android:startOffset = "4000"
        android:repeatCount="infinite"/>
</set>


2是使用:
AnimationSet animationSet=new AnimationSet(true);

        ScaleAnimation scaleUp = new ScaleAnimation(1.0f, 1.1f, 1.0f, 1.1f,
                Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f);
        scaleUp.setDuration(4000);
        scaleUp.setRepeatCount(Animation.INFINITE);
        animationSet.addAnimation(scaleUp);

        ScaleAnimation scaleDown = new ScaleAnimation(1.1f, 1.0f, 1.1f, 1.0f,
        Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f);
        scaleDown.setDuration(4000);
        scaleDown.setRepeatCount(Animation.INFINITE);
        scaleDown.setStartOffset(4000);
        animationSet.addAnimation(scaleDown);

        animationSet.setRepeatCount(Animation.INFINITE);
        iv.setAnimation(animationSet);


很多人告诉我AnimationSet 可以 实现两个动画顺序执行 ?为什么不可以!
------解决思路----------------------
关于顺序执行的话,你可以尝试一下AnimationListener


animation.setAnimationListener(new AnimationListener() {

@Override
public void onAnimationStart(Animation animation) {
}

@Override
public void onAnimationRepeat(Animation animation) {
}

@Override
public void onAnimationEnd(Animation animation) {
//在这里开始执行下一个动画即可
}
});

------解决思路----------------------
3.0之后使用AnimatorSet ,Builder, 3.0之前使用nineoldandroids这个第三方库,不然的话3.0后面只能用动画监听器的方法,属性动画是3.0之后一个非常好的动画包,学习的时候多看最新的apidemo和support demo,具体的用法自己看api吧
------解决思路----------------------
看了你的需求,由于时间比较匆忙,我用了一种比较取巧的方式做出了你要的效果。代码如下:
public class MainActivity extends Activity {
private ImageView image1, image2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

image1 = (ImageView) findViewById(R.id.image1);
image2 = (ImageView) findViewById(R.id.image2);

startScale1(image1);
startScale2(image2);
}

public void startScale1(View v) {
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(v, "ScaleX",
1.0f, 1.5f);
objectAnimator1.setRepeatCount(Animation.INFINITE);
objectAnimator1.setInterpolator(new LinearInterpolator());
objectAnimator1.setDuration(4000).start();

ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(v, "ScaleY",
1.0f, 1.5f);
objectAnimator2.setRepeatCount(Animation.INFINITE);
objectAnimator2.setInterpolator(new LinearInterpolator());
objectAnimator2.setDuration(4000).start();
}

public void startScale2(View v) {
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(v, "ScaleX",
1.0f, 1.8f);
objectAnimator1.setRepeatCount(Animation.INFINITE);
objectAnimator1.setInterpolator(new LinearInterpolator());
objectAnimator1.setStartDelay(2000);  //用到了开始延迟这个属性,呵呵,比较取巧。
objectAnimator1.setDuration(4000);
objectAnimator1.start();

ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(v, "ScaleY",
1.0f, 1.8f);
objectAnimator2.setRepeatCount(Animation.INFINITE);
objectAnimator2.setInterpolator(new LinearInterpolator());
objectAnimator2.setStartDelay(2000);
objectAnimator2.setDuration(4000);
objectAnimator2.start();
}

}


代码比较乱,自己整理下吧。
方法不止一种,关于动画的网上很多资料,不要拘泥于形势,这个是比较简单的了。呵呵。
  相关解决方案