为什么在View上验证不起作用但postInvalidate有效

时间:2013-04-24 22:33:55

标签: android

我有一张卡片,其中一个人选择卡片和拖动(通过翻译动画完成)然后当松开它移动到屏幕的中心有一个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();
    }
}

1 个答案:

答案 0 :(得分:1)

新手Android开发者的典型问题。 请查看invalidate方法的说明。 根据Google文档:

  

使整个视图无效。如果视图可见,将在某个时间点调用onDraw(android.graphics.Canvas)。必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。

所以,我认为 onAnimationEnd 是从非UI线程(可能是动画线程)调用的。 我认为如果你避免使用API​​策略,它可能会导致意外行为,并且可能因不同的Android版本而有所不同。 从非UI线程调用invalidate可能会中断Android系统中的某些UI操作(或制动某些逻辑),从而导致一些不当行为。

另见:What does postInvalidate() do?