1

我有一张卡片游戏,其中人选择卡片并拖动(通过翻译动画完成),然后当放手时它移动到屏幕中心,那里有一个 imageView 占位符。在动画结束时,我将图像视图设置为该卡,并且可以在屏幕上的每个视图上无效。我不明白的是,当我调用无效时,卡片看起来像是留下了一些痕迹(来自翻译动画的阴影)。当我调用 postInvalidate 时,它​​会正确绘制。这是为什么??

动画结束代码:

@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();
    }
}
4

1 回答 1

1

新手Android开发者的典型问题。请查看无效方法的描述。根据谷歌文档:

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

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

也看这里:postInvalidate() 做什么?

于 2013-07-11T09:29:42.613 回答