【问题标题】:Why validate on View does not work but postInvalidate works为什么在 View 上验证不起作用但 postInvalidate 有效
【发布时间】:2013-04-24 22:33:55
【问题描述】:

我有一张卡片,玩家在游戏中选择卡片并拖动(通过翻译动画完成),然后当松开它时,它会移动到屏幕中心,那里有一个 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();
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

    请看这里:What does postInvalidate() do?

    【讨论】:

    • 谢谢,OnAnumationEnd 在动画结束时被调用。我正在使用 Android 提供的默认动画类。所以我假设它在不同的线程上运行
    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2022-06-16
    • 2013-05-27
    • 2018-11-26
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多