启动动画问题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 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

1.setAnimation和startAnimation区别

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

android view第一次执行动画无效

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

异步赠书:9月重磅新书升级,本本经典

敲重点:        活动规则:试读样章,评论区留言说一下你对本书的一些感想,同时关注异步社区博客,并留言你想要得到的图书。        活动时间:即日起-9月20日(活动奖项公告在10月9日) ...

每周荐书:Java Web、Python极客编程、移动Web前端(评论送书)

每周荐书:Java Web、Python极客编程、移动Web前端(评论送书) 各位抱歉,上周活动停更一周,本周继续感谢大家对每周荐书栏目的支持,先公布下上期活动中奖名单 微雨燕凝霜寒森林之舟架构探险:...

每周荐书:ES6、虚拟现实、物联网(评论送书)

每周荐书:ES6、虚拟现实、物联网(评论送书) 感谢大家对每周荐书栏目的支持,先公布下上期活动中奖名单 夕阳雨晴KK-NevenJava Web轻量级开发面试教程 monkey66da架构小白机器人P...

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

遇到个问题,当调用属性的动画的时候设置addListener后,想要在onAnimationStart执行时做些操作,但是发现却只执行了onAnimationEnd,这尼玛就操蛋了,具体原因还不清楚,...

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

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

解决android动画只执行一次的情况

引子:今天在使用动画实现一个控件淡入淡出效果时,果断选用AlphaAnimation,但写出来后经调试发现,其不能多次触发实现,只有在首次使用时才可以,后来百度了下,发现大家有类似的问题,解决办法也很...

关于View设置setAnimation之后动画只能执行一次

如果只设置setAnimation(TranslateAnimation)那么在使用的时候只会执行一次,只有当setAnimation和startAnimation 一起设置才会在触发条件达到的时候动...

css3 使用animation 只执行一次然后停留在执行后的状态

-webkit-animation:'index' 5s ease-in-out 0 1 alternate forwards; forwards:当动画完成后,保持最后一个属性值(在最后一个关键帧...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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