2

サイズを変更する必要がある4つの画像を持つviewPagerがあります。さまざまなオプションを実装しましたが、オプションは実行されません。私はさまざまなオプションを書きます:

  1. getView に次のように入力します。

    image.setImageBitmap(bitmap);
    

    ビットマップは以下を取得します。

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(bitmapOriginal, null, options);
    int sampleSize = 1;
    while ((options.outHeight > 600 * sampleSize) &&(options.outWidth > 400 * sampleSize)) {  
        sampleSize *= 2;
    }
    options.inJustDecodeBounds = false;
    options.inMutable = false;
    options.inSampleSize = sampleSize;
    Bitmap bm=BitmapFactory.decodeStream(bimapOriginal, null, options);
    

しかし、それは非常にゆっくりです。

  1. 最後のコードを AsyncTask() に入れましたが、すばやくスクロールできません。

  2. 私は

    onPageScrollStateChange(int state)
    

    状態のときだけ画像を表示していますSCROLL_STATE_IDLEが、効果は他の場合と同じです。

  3. 私は LruCache を使用し、画像を A​​synctask の LruCache に保存します。
    私が入れたinstantiateItemに

    for(int i=position *4;i<(position +1)*4 +4;i++) {
    //NameImage is an Array with the name of image. Every time that calling instantiateItem save 4 images in LruCache
    new BitmapWorkerTask(nameImage[i).executorOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    

しかし、問題は前のケースと同じで、すばやくスクロールできず、アプリが非常に遅いです。
大きな品質とサイズの画像があります。viewPagerですばやくスクロールするにはどうすればよいですか?

4

2 に答える 2

2

問題は、作業が AsyncTask で行われているにもかかわらず、ViewPager がイメージを返すのを待っていることです (getView()、instanciateItem()、newView() など、使用しているものは何でも)。あなたがする必要があるのは、ImageViews のいくつかのインスタンスを作成し、それらの 1 つをほとんどすぐに返すことです (これにより速度が上がります)。AsyncTask に読み込みを行わせ、(位置で識別された正しいインスタンスに) 戻ると、画像は既に ViewPager にあるインスタンスに設定されます。

バッファとして使用するイメージビューの配列を作成し、リスト項目の位置属性を使用してそれらを識別します。

ImageView[] bufferView=new ImageView[4]; //global

//use Async task something like this

@Override       
   protected void onPostExecute(Bitmap result) {
   virtualPosition = position % 4;    //Real position % (number of ImageViews)   
   bufferView[virtualPosition].setImageBitmap(result);          
   }

bufferView[virtualPosition]これをこのアイテムの ImageView として返す

編集:親 ViewGroup にも追加することを忘れないでください

container.addView(pageview[position]);
于 2012-11-28T07:46:24.973 に答える
1

キャッシングを透過的に処理する Android イメージ マネージャー (メモリとディスク) を作成しました。コードは Github にあります。

AsyncTasks の代わりに Handler を使用します。グリッドとリストがあちこちにある画像の多いアプリケーションに使用してきましたが、スクロールと読み込みのパフォーマンスが大幅に向上しました。確認してください: https://github.com/felipecsl/Android-ImageManager

于 2013-02-12T06:03:22.747 に答える