【问题标题】:Drawable setState returns true but does not change appearanceDrawable setState 返回 true 但不改变外观
【发布时间】:2015-01-18 02:01:52
【问题描述】:

我正在使用 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(),当我按下并释放 View 时 getDrawableState() 显示正确的值,并且 mForegroundDrawable.setState(getDrawableState()) 甚至返回 true。

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

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

有人知道什么是坏的吗?

我真的不想将我所有的 ForegroundLinearLayouts 都包装在 FrameLayouts 中。

【问题讨论】:

    标签: android android-view drawable android-framelayout


    【解决方案1】:

    这来得太晚了,但我偶然发现了您在原始 gist 中的评论

    没有必要为每个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;
    }
    

    【讨论】:

      【解决方案2】:

      我花了 3 天时间才弄清楚这一点。

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

      如果有人知道原因,请告诉我,因为我将在 ForegroundLinearLayout 上进行拉取请求。

      在对 mForeground 进行空检查之后,我只是将这一行放入 draw(Canvas canvas) 中: mForeground.setBounds(0, 0, getWidth(), getHeight());

      繁荣,修复一切。

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

      【讨论】:

      • 如果布局已更改或初始化,则边界似乎已根据定义的前景重力(默认为完整)在 draw() 方法中正确设置。另一方面,如果在布局和绘制视图之后设置前景可绘制对象,则边界似乎没有正确设置,因此这似乎是唯一可能未正确初始化边界的情况。跨度>
      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2023-03-15
      相关资源
      最近更新 更多