0

カスタム リスト ビュー アイテムを作成しています。View の拡張と onDraw メソッドのオーバーライド。

private Bitmap bmpScaledBackground; //with size:(screenWidth , screenHeight/4)
@Override
public void onDraw(Canvas canvas){
    canvas.drawBitmap(bmpScaledBackground , 0 , 0 , null);
    //...more of that
}

これまでのところ、Galaxy SII などの通常の電話で問題なく動作します。

ただし、Galaxy Nexus に関しては、パフォーマンスが低下しています。GN の解像度が大きい (1280x720) ためだと思います。

上記の場合、背景のビットマップ (bmpScaledBackground) だけでも 720x320 と大きく、描画に時間がかかります。OOMのリスクは言うまでもありません。

カスタム ビューを作成するためのよりスケーラブルな方法 (SurfaceView と OpenGL を除く) があるかどうかを尋ねるために書いています。

私の下手な英語でごめんなさい。

4

1 に答える 1

0

私のオプション:1、「xxx.9.png」形式の写真リソースを使用します。2、圧縮ビットマップを使用します。

    //get opts
    BitmapFactory.Options opts =  new BitmapFactory.Options();
    opts.inJustDecodeBounds =  true ;
    Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

    //get a appropriate inSampleSize
    public static int computeSampleSize(BitmapFactory.Options options,
         int minSideLength,  int maxNumOfPixels) {
     int initialSize = computeInitialSampleSize(options, minSideLength,
             maxNumOfPixels);
     int roundedSize;
     if (initialSize <=  8 ) {
         roundedSize =  1 ;
         while (roundedSize < initialSize) {
             roundedSize <<=  1 ;
         }
     }  else {
         roundedSize = (initialSize +  7 ) /  8 *  8 ;
     }
     return roundedSize;
}

private static int computeInitialSampleSize(BitmapFactory.Options options,
         int minSideLength,  int maxNumOfPixels) {
     double w = options.outWidth;
     double h = options.outHeight;
     int lowerBound = (maxNumOfPixels == - 1 ) ?  1 :
             ( int ) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
     int upperBound = (minSideLength == - 1 ) ?  128 :
             ( int ) Math.min(Math.floor(w / minSideLength),
             Math.floor(h / minSideLength));
     if (upperBound < lowerBound) {
         // return the larger one when there is no overlapping zone.
         return lowerBound;
     }
     if ((maxNumOfPixels == - 1 ) &&
             (minSideLength == - 1 )) {
         return 1 ;
     }  else if (minSideLength == - 1 ) {
         return lowerBound;
     }  else {
         return upperBound;
     }
}  
//last get a well bitmap.
BitmapFactory.Options opts =new BitmapFactory.Options(); 
opts.inSampleSize = inSampleSize;// inSampleSize should be index value of 2.
Bitmap wellbmp =null; 
wellbmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);

幸運を!^-^

于 2012-08-01T08:07:34.953 に答える