2

Android Honeycomb のギャラリー ビュー ウィジェットを高速化する優れた方法を探しています。私は現在、約 340 x 600 ピクセルのかなり大きな画像を表示するために使用しています。

現時点ではかなり高速ですが、ScrollView に ImageView をロードしてスクロールするのとは比べ物になりません。

getView()これは、カスタム BaseAdapter からのメソッドの簡略化されたバージョンです。

        public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = (ImageView) new ImageView(Main.this);
        }

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPurgeable = true;

        ((ImageView) convertView).setImageBitmap(createReflection(BitmapFactory.decodeFile(ImageFile, options)));

        convertView.setPadding(20, 0, 20, 0);

        return convertView;
    }

画像の遅延読み込みを試してみましたが、結果はあまり好きではありませんでした。

4

4 に答える 4

2

現在、Gallery は convertView をサポートしていません。convertView では常に null を受け取ります。これは既知の問題であり、修正の予定はありません。

于 2011-08-07T06:13:31.270 に答える
2

との使用の違いGallery:

ImageViews を含む ScrollView をロードし、それをスクロールする

シナリオでは、ScrollViewシナリオのようにその場で画像をロードするのではなく、すべての画像を事前にロードしていることですGallery

画像の数が少なく、それらすべてをサポートするのに十分な RAM がある場合は、ScrollView.

それを超えて、あなたができることはたくさんありません。ビットマップ キャッシュを維持して、現在のイメージよりも先にいくつかのイメージをデコードし続け、キャッシュからプルすることGalleryができます。Adapterただし、それだけでは不十分です。小さなスクロールはスムーズですが、キャッシュ容量を超えると、オンデマンドでデコードが行われます. それはかなり避けられないことです。

于 2011-08-06T23:24:38.010 に答える
0

アプリケーションのハードウェア アクセラレーションをオンにすると、大きな影響があります (少なくとも、私のサンプル アプリではそうでした)。

Android マニフェストhttp://developer.android.com/guide/topics/manifest/application-element.html#hwaccelの application 要素に android:hardwareAccelerated="true" を追加します。

于 2011-10-31T10:14:18.150 に答える
0

ギャラリー ビューを遅くしている要素の 1 つは、ファイル IO です。解像度 1280x720 の写真があるスライドショー アプリに取り組んでいます。実際のファイル I/O には、ファイルごとに 300 ~ 400 ミリ秒かかります。

通常、ファイル I/O は UI スレッドで実行されるため、進行中の写真遷移で非常に目に見える「ヒック」が発生します。

これを回避するには、次のことを行う必要があります。

  1. imageView.setImageResource(R.drawable.my_loading_drawable); 既にキャッシュされている一時的なローディング ドローアブルを設定します。
  2. AsyncTask を作成します。
    • doInBackground (つまり、ファイル I/O) でドローアブルをロードします。
    • onPostExecute の imageView を更新します imageView.setImageDrawable(drawable);

PS ユーザーが複数の画像をフリックすると、上記のアプローチは通常、すべてファイル I/O を使用する複数の並列 asynctask をトリガーします。パフォーマンスが低下し、アプリがクラッシュする可能性があります。一度に 1 つの非同期タスクのみを許可する、より構造化されたアプローチを使用する必要があります。

于 2011-11-09T19:51:18.763 に答える