1

在我的应用程序中使用 ImageSwitcher,但我不希望图像交叉淡入淡出。我想显示一个图像,然后“淡出”为黑色并与另一张图像“淡入”。但由于某种原因,它不断交叉淡化这两个图像。如果有人可以提供帮助,我将不胜感激。

Activity_intro.java

public class IntroActivity extends Activity implements ViewFactory {

    private static final String TAG = "IntroActivity";

    private final int[] images = { R.drawable.wheelpaper1, R.drawable.wheelpaper2};
    private int index = 0;
    private final int interval = 4000;
    private boolean isRunning = true;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_intro);

        startAnimatedBackground();  

    }

    private void startAnimatedBackground() {
        Animation aniIn = AnimationUtils.loadAnimation(this,
                android.R.anim.fade_in);
        aniIn.setDuration(1500);
        Animation aniOut = AnimationUtils.loadAnimation(this,
                android.R.anim.fade_out);
        aniOut.setDuration(1500);

        final ImageSwitcher imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher1);
        imageSwitcher.setInAnimation(aniIn);
        imageSwitcher.setOutAnimation(aniOut);
        imageSwitcher.setFactory(this);
        imageSwitcher.setImageResource(images[index]);

        final Handler handler = new Handler();
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                if (isRunning) {
                    index++;
                    index = index % images.length;
                    Log.d("Intro Screen", "Change Image " + index);
                    imageSwitcher.setImageResource(images[index]);
                    handler.postDelayed(this, interval);
                }
            }
        };
        handler.postDelayed(runnable, interval);

    }

    @Override
    public View makeView() {
        ImageView imageView = new ImageView(this);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        return imageView;
    }

    @Override
    public void finish() {
        isRunning = false;
        super.finish();
    }
}
4

1 回答 1

0

那么这里有一个建议。

我总是发现查找源代码会有所帮助,例如,请参见此处。

您会看到图像切换器实际上只是一个特定于 imageView 的视图翻转器。现在,不会为您想要的方法公开任何方法 - 它不是一个非常复杂的类。

所以你可以从它继承来衍生出你自己的——创建一个自定义视图并在你的 xml 中使用它。我会建议类似:

public class CustomImageSwitcher extends ImageSwitcher {

private Queue<Runnable> mAfterAnimationQueue = new LinkedList<Runnable>();

private final GradientDrawable blackDrawable; // just incase you want a gradient too...

public CustomImageSwitcher(Context context) {
    super(context);
    blackDrawable = new GradientDrawable(Orientation.BOTTOM_TOP, new int[] {
            getResources().getColor(android.R.color.black),
            getResources().getColor(android.R.color.black) }); 
}

public CustomImageSwitcher(Context context, AttributeSet attrs) {
    super(context, attrs);
    blackDrawable = new GradientDrawable(Orientation.BOTTOM_TOP,
            new int[] { getResources().getColor(android.R.color.black) });
}

public void postAfterAnim(Runnable runnable) {
    mAfterAnimationQueue.add(runnable);
}

protected void onFadeToBlackEnded() {
    while (!mAfterAnimationQueue.isEmpty()) {
        mAfterAnimationQueue.remove().run();
    }
}

private Animation.AnimationListener biDirectionalCustomListener = new AnimationListener() {

    @Override
    public void onAnimationEnd(Animation animation) {
        onFadeToBlackEnded();
        animation.reset();
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        ; // we only really want the end event!
    }

    @Override
    public void onAnimationStart(Animation animation) {
        ;
    }
};

// THIS ISN'T A COMPLETED EXAMPLE AS THIS WOULD UNSET ANY PREVIOUS ANIMATION
// LISTENERS
@Override
public void setInAnimation(Animation inAnimation) {
    inAnimation.setAnimationListener(biDirectionalCustomListener);
    super.setInAnimation(inAnimation);
}

// THIS ISN'T A COMPLETED EXAMPLE AS THIS WOULD UNSET ANY PREVIOUS ANIMATION
// LISTENERS
@Override
public void setOutAnimation(Animation outAnimation) {
    outAnimation.setAnimationListener(biDirectionalCustomListener);
    super.setOutAnimation(outAnimation);
}

// override the image switcher's methods

@Override
public void setImageResource(final int resid) {
    super.setImageDrawable(blackDrawable);
    postAfterAnim(new Runnable() {
        @Override
        public void run() {
            CustomImageSwitcher.super.setImageResource(resid);
        }
    });
}

// obviously override more if you want.... just change the method name

}

这有点像深夜的草图——一些问题是我们没有正确代理进来的动画(你应该或者至少让它很清楚它将被取消设置)。

但粗略的想法是,您真正想要的是在视图翻转器中有一个中间视图,它包含一个简单的黑色可绘制对象并且是一个中间阶段。希望它是不言自明的。

另一方面,在您的示例中,您可能希望提取您为每个方法创建的一些对象并将它们作为字段,因为您将每次都使用它们 - 例如Handler

最后一点,我真的喜欢这样使用视图翻转器。如果你覆盖 onDraw 等,你可能会发现你可以用一个图像视图做所有事情,但这是另一个问题的开始,而不是这个问题的结束。

最良好的祝愿,希望这会有所帮助。

于 2013-04-19T18:58:04.317 回答