invalidate() 不刷新视图

Posted

技术标签:

【中文标题】invalidate() 不刷新视图【英文标题】:invalidate() doesn't refresh View 【发布时间】:2018-07-23 03:44:48 【问题描述】:

我为此苦苦挣扎了一段时间,不确定是因为在 android DEV 中缺席了将近 2 年还是我的愚蠢,我已经尝试了所有方法,即使 invalidate() 正在发生也无法重绘我的屏幕。这是一些代码:

GameActivity.java

onCreate

...

final CanvasActivity mCanvasActivity = new CanvasActivity(this);
setContentView(mCanvasActivity);

mCanvasActivity.setOnTouchListener(new OnSwipeTouchListener(this) 
        @Override
        public void onSwipeTop() 

            tilesArray[playerPositionY][playerPositionX] = 0;
            playerPositionY--;
            tilesArray[playerPositionY][playerPositionX] = 2;

            mCanvasActivity.invalidate();

        

CanvasActivity.java

protected void onDraw(Canvas canvas) 
    super.onDraw(canvas);
    movePlayer(canvas);
    Log.e("player", "x " + playerPositionX + " y " + playerPositionY);

移动播放器

if (currentBlock == 0) 
                canvas.drawRect(posLeft, posTop, posRight, posBottom, paintWall);
             else if (currentBlock == 1) 
                canvas.drawRect(posLeft, posTop, posRight, posBottom, paintLabirynth);
             else if (currentBlock == 3) 
                canvas.drawRect(posLeft, posTop, posRight, posBottom, paintExit);
             else 
                canvas.drawRect(posLeft, posTop, posRight, posBottom, paintCharacter);
            

所以基本上,当我们滑动到顶部时,位置正在被 movePlayer 改变(减少二维数组中的 y)。然后,屏幕上的每个矩形都被重新绘制(整个屏幕只有矩形,它们根据数组逐行绘制不同颜色的矩形,我想没关系)。我的变量正在正确更改,因此 invalidate() 正在触发 onDraw(),但是屏幕上没有任何变化。非常感谢任何帮助。

【问题讨论】:

我想 CanvasActivity 扩展了 View,对吧? 正确。公共类 CanvasActivity 扩展视图 好吧,我看不出 onDraw() 有什么问题。当您调用 invalidate() 时,onDraw() 会被触发,因此它会调用 movePlayer()。如果其他数学是正确的(你得到 posLeft、posTop 等的方式),它应该可以工作。抱歉,帮不上什么忙。 我也没有看到任何错误。数学很好,更改在日志中可见。我设法通过重新创建()保持位置值来重绘屏幕,但这样做没有意义。 【参考方案1】:

看起来我没有在每次 onDraw 调用时将 paintY 重置为 0,并且它正在正确绘制,但在屏幕下方。就像我说的,可能是,而且曾经是我的愚蠢:)。

【讨论】:

以上是关于invalidate() 不刷新视图的主要内容,如果未能解决你的问题,请参考以下文章

如何让 View.invalidate 在 Click Listener 中工作

Android中刷新Invalidate和postInvalidate的区别

仅更新视图的一部分而不使用 invalidate(Rect)

在vc++中 OnDraw()函数和 Invalidate()函数起啥作用

何时需要在视图上执行 invalidate()?

为何invalidate()不可以直接在UI线程中调用