2011-08-06 12 views
2

Android Honeycombのギャラリービューウィジェットのスピードアップには最適な方法をお探しです。私は現在、およそ340×600ピクセルのかなり大きな画像を表示するためにこれを使用しています。画像をスクロールするときにバターとして滑らかになることが大好きです。Android Honeycombのギャラリーウィジェットを高速化するヒント

現時点ではかなりスピーディーですが、ImageViewsでScrollViewを読み込んでそれをスクロールすることと比べると、面倒です。

は、ここに私のカスタムBaseAdapterから私のgetView()方法の簡易版です。

 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; 
    } 

私は遅延ロード画像を実験してきたが、私は結果のように、本当にしませんでした。

+0

パフォーマンスの問題がどこにあるかを測定するためにTraceviewで実行したときの表示内容は何ですか? – CommonsWare

+0

私はあなたに言いたいのですが、私はTraceviewをEclipseで動かすことができません:( –

+0

TraceviewはgetView()が呼び出されるたびに52ミリ秒、46〜48ミリ秒画像をデコードするのに使用されています。これは、標準の1.0GHzではなく1.2GHzのオーバークロックタブレットで実行されているので、デフォルトのクロック速度で少し遅くなることが予想されます。 –

答えて

2

Galleryと使用の違い:ImageViewsとScrollViewをロードし、その

スクロール

ScrollViewシナリオで、あなたはすべてのイメージを事前にロードしているということです、 Galleryのシナリオのように、それらを即座にロードするのではなく、

画像の数が少なく、すべての画像をサポートするのに十分なRAMがある場合は、ScrollViewを使用してください。

それを超えて、AFAIKにはあなたができることはありません。 Galleryの現在のイメージの前にいくつかのイメージのデコードを続行し、キャッシュからAdapterを取得するビットマップキャッシュを維持することができます。しかし、これまでのところ、小さなスクロールはスムーズになりますが、キャッシュ容量を超えると、デコードが要求に応じて行われます。それはかなり避けられないほどです。

+0

その答えを期待していますが、私は何枚のImageViewが表示されているかわからないということです。数千から数千の間のどこかにある可能性があるので、すべてをプリロードすることはできません。彼らはより多くの画像が表示されているために何人かの人々にOOMエラーを引き起こしました(私は映画管理アプリケーションで作業しています。各画像はムービーのカバーアートです - 市場のMizuuムービーを見てください)それを考えていた私はスクロール中に小さな画像を読み込む可能性がありますが、実際にはわからない –

+0

画像のパラレル低解像度レンディションを作成して、それらのデコードを試みることができます。スタティックではなくレイジーロードのプレースホルダとして使用します。プレースホルダ。 Androidは低解像度の画像を引き伸ばすことができます。これは、Googleマップタイルを拡大したときに得られる効果です。拡大された低解像度画像がピクセル化されていないように、ぼかし効果を試すことさえできます。低解像度のファイルサイズを〜1Kに保つことができれば、それらのファイルを何千も読み込むことができます。私はここでブレーンストーミングしていますが、このテクニックを試したことはありません:-) – CommonsWare

+0

ありがとう、CW。私はたぶん怠惰なローディングを別のgo - cheersに与えるでしょう! :) –

2

現在、ギャラリーはconvertViewをサポートしていません。 convertViewには常にnullが返されます。これは既知の問題であり、修正のETAはありません。

+0

Galleryの代わりにHorizo​​ntalListViewを実際に追加する計画はありますか?とにかくほとんどの人が望んでいるようだ:) – alexanderblom

+0

今のところそのような計画はありません。そしてそれはギャラリーが既にあるものとほとんど同じです。 –

+0

私は参照してください。説明に感謝しています、Romain。私はそれがすぐに修正されることを願っています。 –

0

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

アンドロイドを追加:あなたのギャラリービューを減速している要素の http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

+0

ハードウェアアクセラレーションは有効になっていましたが、大規模なビットマップを扱う場合は、かなりスピードアップします。 –

0

ひとつAndroidマニフェストのアプリケーション要素でhardwareAccelerated =「true」がファイルIOです。 私は1280x720解像度の写真を持っているスライドショーアプリを開発しています。 実際のファイル入出力には、ファイルごとに300〜400ミリ秒かかります。

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

、あなたがする必要があります

  1. はすでに imageView.setImageResource(R.drawable.my_loading_drawable)にキャッシュされている一時的な負荷描画可能に設定してください。
    • はdoInBackground(すなわちにおける描画可能をロードAsyncTaskを作成します。ファイルI/O)
    • onPostExecute内のimageViewを更新します。 imageView.setImageDrawable(drawable);

PS複数の画像を介してユーザフリックする場合、上記のアプローチは、典型的には、すべてのファイルI/Oを使用する複数parallell asynctaskをトリガします。パフォーマンスが悪く、アプリがクラッシュする可能性があります。おそらく、一度に1つの非同期タスクしか許可しない、より構造化されたアプローチが必要です。