2017-08-11 57 views
0

我正在实施必须从磁盘加载Bitmap的自定义ImageViewBitmap应该完全按比例缩放,其宽度必须等于父级布局已分配给我的ImageView的最终宽度,并且计算高度以保持宽高比。处理依赖于“视图”的维度的大量操作

所以,问题是什么是View生命周期中适当的地方放置取决于View的尺寸在完成布局后的大规模操作?

(我想保持它的简单,并没有使用线程,但是。)

  1. 最有可能这是一个坏主意,把这些代码在onDraw()方法, 因为它应尽可能高效可能。另一方面,我的 ImageView不太可能调整大小,所以它只会杀死 的第一个onDraw()的性能,并且不会影响任何后续的 调用onDraw()。所以我不确定这个选项。
  2. 我可以把它放在onLayout(boolean changed, int l, int t, int r, int b)的末尾执行我的 重码if (changed == true)。这是一个好主意吗?
  3. 我看到的第三个选项是在onSizeChanged()回调中执行。 我唯一关心的是这个回调是否为保证为 每个实际视图的尺寸变化只调用一次。我倾向于使用 这个选项,因为在我的测试中它工作正常。

有人可以对此有所了解吗?

回答

0

选项2和3都适用于您获取视图的正确尺寸。

onDraw()仅在onLayout()之后被调用。您可以在onLayout()本身中获得尺寸,最好避免在onDraw()内进行不必要的工作。所以我会选择选项2或选项3.

并且请注意onSizeChanged()有时被称为零。伊恩in this thread

要明确的是onSizeChanged()有时被称为带参数的零 - 检查这种情况,并立即返回(这样你就不会 零计算你的布局时得到一个鸿沟等)。一段时间后 它将被称为真实值。

另一种选择是一个可运行添加到视图的队列,使用View.post()

报价和例子from this thread

的UI事件队列会按顺序处理事件。 的setContentView()被调用后,事件队列将包含要求重新布局的消息 ,所以任何你邮寄到队列将布局后发生 通过

final View view=//smth; 
... 
view.post(new Runnable() { 
      @Override 
      public void run() { 
       view.getHeight(); //height is ready 
      } 
     }); 

使用这种方法,我们可以确保我们的代码只执行一次。

+0

请记住,我需要让它在每次执行''View'时不会执行一次,但是一旦执行实际大小change_,所以制作一个'view.post()'似乎就不在这里。 –

+0

哦。然后使用'onSizeChanged()'方法将是一个更好的选择。 – Bob

+0

好的,从你提供的链接可以推断出'onSizeChanged()'不能保证只在每个实际'View'的大小改变时被调用一次。那么如何处理呢?在这种情况下,比较旧的和新的w \ h滤除多个相同大小的呼叫是否正确? –