【问题标题】:Android setBackground(Drawable) consumes too much timeAndroid setBackground(Drawable) 消耗太多时间
【发布时间】:2014-04-12 07:01:40
【问题描述】:

我有一个包含 300 个单元格的日历的表格布局。当用户在流/移动中触摸日期时,触摸例如6天,它设置了一个背景drawable。

drawable 使用 XML 设置(形状、矩形、...)。它只在这 6 天内迭代,而不是在所有单元格上。

问题是,在 Nexus 7 和旧设备上设置 backgroundDrawable 会消耗太多时间。当手指在第6天时,它设置第4天直到它也到达最后一天!!!

我该如何改进它?

流程:onDown(...)、onMove(...) 超过 6 天、onUp(...)。

编辑:

    public boolean onMove(MotionEvent e) {

    Day selectedDay = searchForSelectedDay((int) e.getX(), (int) (e.getY() + getScrollY()));

    if (selectedDay != null && selectedDay != mPreviousDay){
     defineDayContent(mPreviousDay, selectedDay);
    } 

    ...

    defineDayContent(Day arg0, Day arg1){
     //iterates from arg0 till arg1 and sets the background
    for(Day d : (iterate from arg0 till arg1)){             
d.setBackground(Calendar.BACKGROUND_DRAWABLE);
    }
    }

【问题讨论】:

  • 你认为迭代有什么好处?
  • 如果您在第一天按下手指并将其移动到第 6 个单元格(作为示例),每次您的手指更改日期时,其单元格背景由 setBackground(Drawable) 设置。这就是我所说的迭代,基本上没有真正的迭代。
  • 我认为问题在于,要在视图上绘制背景,系统会非常深入,并且每次都会进行新布局。

标签: android caching view bitmap drawable


【解决方案1】:

您没有提供代码,这就是为什么很难说瓶颈到底在哪里。我会尝试以下措施。

作为第一个措施,我会预加载可绘制对象,确保不会在 onTouch() 方法中调用 getDrawable()setBackgroundResource()

其次,如果背景已经设置,我将确保我不会在 onTouch() 中调用 setBackground() 两次或多次查看。

如果前两个没有帮助,我会延迟调用setBackground(),只有在用户在某个视图上放慢手指之后。这样可以避免您描述的视觉效果并加快更新速度。

【讨论】:

  • 我已经完成了前两个步骤。只有在“日变”时我才设置背景。可绘制对象是之前设置的,因此没有可绘制对象的创建,嗯,真的很难。
  • 不看源码就很难帮忙。
【解决方案2】:

这个问题没有解决,但是……

我们尝试增加视图并设置图像视图的可见性。非常快,但是 300 个单元格的 xmls 膨胀太重了...... 2-3 秒来初始化。

我们刚刚决定绘制单元格的内容。这在布局 + 性能方面非常快。

最后的解决方案:CustomView + onDraw

耶耶

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多