我有一张卡片,其中一个人选择卡片和拖动(通过翻译动画完成)然后当松开它移动到屏幕的中心有一个imageView占位符。在animationEnd我将图像视图设置为该卡,并且可以在屏幕上的每个视图上无效。我不明白的是,当我调用invalidate时,卡片看起来像是留下了一些痕迹(来自翻译动画的阴影)。当我调用postInvalidate时,它会被正确绘制。为什么???
AnimationEnd代码:
@Override
public void onAnimationEnd(Animation arg0) {
if(card == null){
MyApplication.SWERR(null);
busy = false;
}
card.getCardImage().setVisibility(View.INVISIBLE);
Drawable drawable = card.getCardSuitNumber().getDrawable(mContext);
finalDestIV.setBackgroundDrawable(drawable);
finalDestIV.setVisibility(View.VISIBLE);
invalidateAll();
PlayerStatus p = mGameMonitor.getPlayerStatusFromPlayerEnum(GameConstants.PLAYERS.P1);
p.handleCardChosen(card);
cardReleased = false;
p.setPlayerLock(false);
card = null;
}
InvalidateAll方法
private void invalidateAll(){
rootLayout.postInvalidate();
for (int i=0; i<rootLayout.getChildCount();i++){
View v = rootLayout.getChildAt(i);
v.postInvalidate();
}
}
答案 0 :(得分:1)
新手Android开发者的典型问题。 请查看invalidate方法的说明。 根据Google文档:
使整个视图无效。如果视图可见,将在某个时间点调用onDraw(android.graphics.Canvas)。必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。
所以,我认为 onAnimationEnd 是从非UI线程(可能是动画线程)调用的。 我认为如果你避免使用API策略,它可能会导致意外行为,并且可能因不同的Android版本而有所不同。 从非UI线程调用invalidate可能会中断Android系统中的某些UI操作(或制动某些逻辑),从而导致一些不当行为。