可绘制的 setState 返回 true,但不会改变外观



我正在使用ForegroundLinearLayout (https://github.com/gabrielemariotti/cardslib/blob/master/library-core/src/main/java/it/gmariotti/cardslib/library/view/ForegroundLinearLayout.java)。这是一个非常简单的实现。

但是,我已经在RecyclerViews中放置了一些ForegroundLinearLayouts,有时(大约50%的时间)在视图被回收之前,我的前景的按下状态不会出现(我向下滚动到视图的第一个屏幕)。

我认为问题出在mForegroundDrawable.setState(getDrawableState())。

我发现在我的 ForegroundLinearLayouts 中调用了 drawableStateChanged(),当我按下并释放视图时,getDrawableState() 显示正确的值,mForegroundDrawable.setState(getDrawableState()) 甚至返回 true。

但是,即使在 ForegroundLinearLayout 中显式调用 mForegroundDrawable.invalidateSelf() 和 this.invalidate() 也无济于事。

按下状态不会在第一个视图屏幕上显示大约 50% 的时间。 使用视图的背景有效,但前景无效。

有人知道什么是坏的吗?

我真的不想把我所有的前景线性布局都包装在框架布局中。

这为时已晚,但我偶然发现了您在原始要点中的评论

没有必要为每个

draw()设置边界。

正如Corsair992已经指出的那样draw()在大多数情况下已经正确设置了界限。但是,如果在draw()之前多次调用onLayout(),则用于设置边界的标志mForegroundBoundsChanged将设置为 false,并且永远不会设置边界。我在使用DrawerLayout时遇到了这个问题,并在原始要点中留下了评论,但这里有一个简单的解决方法:

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if (changed) mForegroundBoundsChanged = true;
}

我花了 3 天时间弄清楚这个问题。

我的前景边界(mForeground.getBounds())有时返回0,0 - 0,0矩形。 当它工作时,它将返回正确的边界 0, 0 - 宽度,高度。

如果有人知道为什么,请告诉我,因为我将在ForegroundLinearLayout上做一个拉取请求。

我只是在 mForeground 上的空检查后将这条线放入 draw(Canvas 画布)中:mForeground.setBounds(0, 0, getWidth(), getHeight());

轰,修好了一切。

但是,前景应该始终有这些界限吗? 我不这么认为;我想我需要考虑填充等。 我会更深入地研究它,但这里的任何评论都是无价的。

最新更新