Drawable setState返回true但不更改外观

时间:2015-01-18 02:01:52

标签: android android-view drawable android-framelayout

我正在使用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。

2 个答案:

答案 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());

愤怒,修复了一切。

但是,前景总是应该有那些界限吗?我不这么认为;我想我需要考虑填充等。我会更多地了解它,但这里的任何评论都是非常宝贵的。