我正在使用ForegroundLinearLayout(https://github.com/gabrielemariotti/cardslib/blob/master/library-core/src/main/java/it/gmariotti/cardslib/library/view/ForegroundLinearLayout.java)。 这是一个非常简单的实现。
但是,我已经在RecyclerViews中放置了一些ForegroundLinearLayouts,有时(大约50%的时间)我的前景的按下状态将不会出现,直到View被回收(我向下滚过第一个视图屏幕)
我认为问题在于mForegroundDrawable.setState(getDrawableState())。
我发现在我的ForegroundLinearLayouts中调用了drawableStateChanged(),当我按下并释放View时,getDrawableState()显示正确的值,而mForegroundDrawable.setState(getDrawableState())甚至返回true。
但是,即使在ForegroundLinearLayout中显式调用mForegroundDrawable.invalidateSelf()和this.invalidate()也无济于事。
在第一个视图屏幕上,大约50%的时间不会出现按下状态。使用视图的背景可以工作,但前景不会。
有人有什么想法被破坏了吗?
我真的不想在FrameLayouts中包装所有的ForegroundLinearLayouts。
答案 0 :(得分:1)
这太迟了,但我偶然发现了您在原gist
中的评论不必在每个draw()
上设置界限。
正如corsair992已经指出的那样draw()
已经在大多数情况下正确设置了界限。但是,如果在onLayout()
之前多次调用draw()
,则用于设置边界的标志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;
}
答案 1 :(得分:0)
花了3天的时间才弄清楚这个。
我的前景界限(mForeground.getBounds())有时返回0,0 - 0,0 Rect。当它工作时,它将返回正确的边界0,0 - 宽度,高度。
如果有人知道原因,请告诉我因为我要在ForegroundLinearLayout上做拉取请求。
在mForeground上进行null检查后,我只是将这一行放入draw(Canvas画布)中: mForeground.setBounds(0,0,getWidth(),getHeight());
愤怒,修复了一切。但是,前景总是应该有那些界限吗?我不这么认为;我想我需要考虑填充等。我会更多地了解它,但这里的任何评论都是非常宝贵的。