启动动画问题startAnimation

原创 2015年04月10日 23:34:44
private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            // 默认背景
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                mIvCurrentBgAnimation.setVisibility(View.VISIBLE);
            }


            @Override
            public void onAnimationEnd(Animation animation) {
                Drawable d = mIvCurrentBgAnimation.getDrawable();
                mIvCurrentBgAnimation.setImageBitmap(null);
                mAnimationView.setImageDrawable(d);
                mIvCurrentBgAnimation.setVisibility(View.GONE);
            }


            @Override
            public void onAnimationRepeat(Animation animation) {


            }
        });
        mIvCurrentBgAnimation.startAnimation(animation);

}
如果以上动画连续执行多次的话 动画效果只会出现一次接着设置的图片马上会消失  原因onAnimationEnd会连续执行多次   当执行完一次后mIvAnimation里的图片为null 
在次执行时  因为mIvAnimation里的图片为空所有mIv也会为空 儿出现以上问题
解决以上为题的方法:

方法1.onAnimationEnd方法不获取mIvAnimation的图片  而是调用getThumbPath方法重新获取图片

 private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            // 默认背景 
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                mIvCurrentBgAnimation.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                String path = getThumbPath(bean);
                if (TextUtils.isEmpty(path)) {
                    // 默认背景 
                    int color = getResources().getColor(R.color.conversation_bg);
                    mIv.setImageDrawable(new ColorDrawable(color));
                } else {
                    mIv.setImageBitmap(BitmapFactory.decodeFile(path));
                }
                mIvCurrentBgAnimation.setImageBitmap(null);
                mIvCurrentBgAnimation.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        mIvCurrentBgAnimation.startAnimation(animation);
    }

方法2.记住最后一次启动动画时的animationListener 每次执行动画里的回调时判断当前对象是否为最后一个animationListener 时的话继续往下执行否则return

 private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            // 默认背景 
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        mAnimationListener = new Animation.AnimationListener() {
            private boolean checkInstance() {
                return this == mAnimationListener;
            }

            @Override
            public void onAnimationStart(Animation animation) {
                if (checkInstance()) {
                    mIvAnimation.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (!checkInstance()) {
                    return;
                }
                Drawable d = mIvAnimation.getDrawable();
                mIvAnimation.setImageBitmap(null);
                mIv.setImageDrawable(d);
                mIvAnimation.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        };
        animation.setAnimationListener(mAnimationListener);
        mIvCurrentBgAnimation.clearAnimation();
        mIvCurrentBgAnimation.startAnimation(animation);
    }

当连续执行2次时 方法1第2次看起来没有动画效果直接更换   方法2第2次看起来有动画效果
如使用动画2  当第一次更换到一般时  第2次动画启动时地图还是第一次时候的地图  如果想底图为第2次时的地图 那么要加入preBm变量 在代码开始处如果preBm不为空把mIv的图片设置成preBm 


属性动画设置延迟后,如果在未开始前取消,会执行onAnimationStart方法,特此记录

package com.example.lizheng_ds3.myapplication; import android.animation.Animator; import android.an...

Android的Animation的onAnimationXXX/onAnimationXXX和Listener.onXXX回调函数调用顺序

    在做View的Animation的时候,我们通常需要在动画的启动和结束时,加一些控制。Android提供了两种方式供我们使用    ◆重载View的onAnimationStart和onAn...

Android 属性动画(Property Animation) 完全解析 (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/380674751、概述Android提供了几种动画类型:View Animatio...

setAnimation vs startAnimation的区别

SetAnimation        这个可以控制动画启动时间,并且需要其父view在动画快开始时调用invalidate.  所以其需要一定的条件限制。 StartAnimat...

1.setAnimation和startAnimation区别

设置一个动画播放这一观点。如果你想立即播放的动画,使用startAnimation这种方法提供了允许细粒度控制的起始时间和失效, 但你必须确保:1)动画开始时间 2)动画应该开始时的观点,将被视为无...

android startAnimation 启动动画慢

今天在工作中需要使用淡入淡出的动画,一个Activty切换不同的layout,要显示淡入淡出的效果。 使用startAnimation这种方法,发现动画要等1到2钞钟才可以执行:  Ani...

android view startAnimation后setVisibility没有效果

对图标长按抖动,可以删除,使用startAnimation实现抖动效果后,删除时,remove(view)和setVisibility(View.INVISIBLE)都没有效果。 需要给Rotate...

关于ObjectAnimator不响应onAnimationStart()方法

在项目中,使用到了ObjectAnimator去实现动画效果,因为需要动画执行完毕之后才能重新响应新的动画。所以我在自定义view里面,声明一个变量,标记动画是否正在播放。给控件设置动画监听,开始的时...
  • iiccer
  • iiccer
  • 2017年07月26日 14:43
  • 122

android view第一次执行动画无效

今天遇到一个特别奇怪的问题,就是view执行动画的时候,我使用下面的这个,第一次动画竟然没有了,第二次,第三。。。就有动画。 先这个代码是我现实执行view动画时候的代码,也没有什么特别,但是那个v...

属性动画设置addListener后onAnimationStart不执行

遇到个问题,当调用属性的动画的时候设置addListener后,想要在onAnimationStart执行时做些操作,但是发现却只执行了onAnimationEnd,这尼玛就操蛋了,具体原因还不清楚,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:启动动画问题startAnimation
举报原因:
原因补充:

(最多只允许输入30个字)