3

我创建了一个自定义View对象,它覆盖了onDraw绘制相当复杂的 UI 的方法。我将这些自定义视图中的 5 个添加到 LinearLayout 中,但任何时候只有一个视图可见

根据用户在我的应用程序中的操作,我将切换View.Visibility每个属性,以便只有一个可见。

只是为了澄清起见,我使用的方法对我有用,而且它似乎反应灵敏。我只是有点担心这种方法会如何影响低端或低规格设备。

这是我当前代码的示例:

自定义视图

public class MyDrawingView extends View {
  private Bitmap mViewBitmap;

  private int mWidth = 1024; // The width of the device screen
  private int mHeight = 600; // Example value, this is dynamic

  @Override
  protected void onDraw(Canvas canvas) {
    // Copy the in-memory bitmap to the canvas.
    if(mViewBitmap != null) canvas.drawBitmap(mViewBitmap, 0, 0, mCanvasPaint);
  }

  private void drawMe() {
    if(mViewBitmap == null) mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(mViewBitmap);
    c.drawBitmap(...);
    c.drawText(...);
    // Multiple different methods here drawing onto the canvas
    c.save();
  }
}

布局 XML

<LinearLayout>
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>

问题

  1. 我是否应该一直在内存中保留这 5 个单独的视图实例,位图大小为 1024x600?
  2. 我是否应该合并功能,以便我只需将一个视图添加到我的布局 XML 中,然后在每次需要更新视图时重新生成位图?
  3. 请记住,由于其复杂性,重绘我的位图可能需要一些时间,哪个选项对性能更好?

文档

我已经阅读了有关管理位图内存的 Android 文档,但是我觉得我已经实现了自定义视图中已经列出的要点,并且我认为它并没有完全涵盖我的场景。

4

2 回答 2

0

我不确定你为什么要在LinearLayout里面放置一个具有设备大小的视图,然后相应地隐藏。使用 aViewFlipper甚至更好 a 会更好ViewPager

最好的一个是 ViewPager,因为那时您可以在不可见时从内存中释放位图。

此外,如果您从 Internet 或 SD 卡加载图像,您可以使用Universal Image Loader,它可以为您简化缓存和内存管理。无需重新发明轮子:)

于 2013-07-26T14:05:57.153 回答
0

好的,所以我接受了 Geobits 关于堆大小的评论,并提出了解决该问题的方法:

  1. 使用一个视图,它将根据需要将数据动态绘制到单个内部 Bitmap
  2. 将位图类型更改为RGB_565以使位图略小
  3. 尽可能删除/回收位图

完成上述操作后,我设法将整个应用程序所需的 RAM 减少到 25Mb,这让我非常满意。

于 2013-07-31T08:36:57.300 回答