【问题标题】:Android - Crossfade multiple images in an ImageViewAndroid - 在 ImageView 中交叉淡入淡出多个图像
【发布时间】:2013-08-15 08:58:49
【问题描述】:

我正在开发一个需要在多个图像之间进行图像交叉淡化的应用程序,

我所拥有的:一个ImageView 和 50 个可从云端下载的可绘制对象 (.png)

我想要什么:50个drawable应该在几秒钟的间隔之间顺序地淡入淡出(淡入淡出)

我尝试过什么:根据 stackoverflow 上的一些答案,我尝试了 TransitionDrawable 技术,但我只能在 2 个图像之间交叉淡入淡出,不能更多,而且只能通过触摸来实现。

我参考的视频:https://www.youtube.com/watch?v=atH3o2uh_94

【问题讨论】:

    标签: java android android-imageview android-animation


    【解决方案1】:

    执行此操作的自定义视图:

    public class FadeView extends FrameLayout {
        private long mFadeDelay = 1000;
        private ImageView mFirst;
        private ImageView mSecond;
        private boolean mFirstShowing;
    
        public FadeView(Context context) {
            super(context);
            init(context);
        }
    
        public FadeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public FadeView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(context);
        }
    
        private void init(Context c){
            mFirst = new ImageView(c);
            mSecond = new ImageView(c);
    
            mFirst.setAlpha(1.0f);
            mSecond.setAlpha(0.0f);
    
            mFirstShowing = true;
    
            addView(mFirst);
            addView(mSecond);
        }
    
        public void setFadeDelay(long fadeDelay) {
            mFadeDelay = fadeDelay;
        }
    
        public void ShowImage(Drawable d){
            if(mFirstShowing){
                mSecond.setImageDrawable(d);
                mSecond.animate().alpha(1.0f).setDuration(mFadeDelay);
                mFirst.animate().alpha(0.0f).setDuration(mFadeDelay);
            }else {
                mFirst.setImageDrawable(d);
                mSecond.animate().alpha(0.0f).setDuration(mFadeDelay);
                mFirst.animate().alpha(1.0f).setDuration(mFadeDelay);
            }
    
            mFirstShowing = !mFirstShowing;
        }
    }
    

    用法:

    public class test extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            final FadeView fw = new FadeView(this);
            setContentView(fw);
    
            fw.setOnClickListener(new View.OnClickListener() {
                Drawable d1 = getResources().getDrawable(android.R.drawable.ic_dialog_alert);
                Drawable d2 = getResources().getDrawable(android.R.drawable.ic_dialog_info);
                boolean flag;
    
                @Override
                public void onClick(View view) {
                    if(flag){
                        fw.ShowImage(d1);
                    }else {
                        fw.ShowImage(d2);
                    }
                    flag = !flag;
                }
            });
        }
    
    
    }
    

    【讨论】:

    • 我怎样才能用 android >=API9
    • 我选择您的答案作为正确答案。但是我觉得有必要说明ShowImage动作必须在UI Thread中执行。因此,如果您修复代码并将 Activity 作为参数或其他方式传递,那就太好了。使用类似的方式进行动画调用: public void showImage(final Drawable d){ mActivity.runOnUiThread(new Runnable() { @Override public void run() { if(mFirstShowing){ ... }else { ... } } }); }
    • @AnibalItriago 任何与视图类型交互的代码都必须在主线程上运行。视图类及其后代不会在内部进行此处理,而是强制用户调用适当的线程。
    【解决方案2】:

    然后创建你的自定义 Drawable 来绘制两个具有变化 alpha 值的 Drawables,当然当你需要支持多个 Drawables 时你需要添加对交换 Drawables 的支持

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多