3

ViewメソッドをオーバーライドしonDrawてかなり複雑な UI を描画するカスタム オブジェクトを作成しました。これらのカスタム ビューを 5 つ LinearLayout に追加していますが、一度に表示できるビューは 1 つだけです。

アプリケーション内のユーザーのアクションに応じて、View.Visibilityそれぞれのプロパティを切り替えて、1 つだけが表示されるようにします。

明確にするために、私が使用している方法は私にとってはうまくいき、かなり反応が良いようです。この方法がローエンドまたはロースペックのデバイスにどのように影響するか、少し心配です。

これが私の現在のコードのサンプルです:

カスタム ビュー

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. サイズ 1024x600 のビットマップを使用して、View のこれら 5 つの個別のインスタンスを常にメモリに保持する必要がありますか?
  2. ビューを更新する必要があるたびにビットマップを再生成し、レイアウト XML に 1 つのビューを追加するだけでよいように、機能をマージする必要がありますか?
  3. ビットマップの再描画には複雑なため時間がかかる場合があることを念頭に置いて、どのオプションがパフォーマンスに優れていますか?

ドキュメンテーション

Managing Bitmap Memoryに関する Android のドキュメントを既に読みましたが、カスタム ビューで既に概説したポイントを実装したと感じており、それが私のシナリオを完全にカバーしているとは思いません。

4

2 に答える 2

0

では、ヒープ サイズに関する Geobits のコメントを参考にして、この問題の解決策を考え出しました。

  1. 必要に応じて単一の内部にデータを動的に描画する 1 つのビューを使用します。 Bitmap
  2. RGB_565ビットマップを少し小さくするために、ビットマップ タイプを に変更します。
  3. 可能な場合はビットマップを削除/リサイクルする

上記の後、アプリケーション全体で必要な RAM を 25Mb に減らすことができました。これには満足しています。

于 2013-07-31T08:36:57.300 に答える