在我的应用程序中使用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();
}
}
答案 0 :(得分:0)
这是一个建议。
我总是觉得查看来源很有帮助,例如,请参阅here。
你会发现图像切换器实际上只是一个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
}
这是一个深夜草图 - 一些问题是我们没有正确代理动画进入(你应该或至少非常清楚它将被取消)。
但粗略的想法是,你真正想要的是在视图鳍状肢中有一个中间视图,它包含一个简单的黑色drawable并且是一个中间阶段。希望它是自我解释的。
另一方面,在您的示例中,您可能想要提取每个方法创建的一些对象,并将它们作为字段,因为每次都要使用它们,例如Handler
。
作为最后一点,我真的不就像使用这样的视图鳍状肢。如果你覆盖onDraw等,你可能会发现你可以用一个图像视图做任何事情,但这是另一个问题的开始,而不是这个问题的结束。
祝福,希望这会有所帮助。