3

私はこのリンクの例に従います: AndroidのViewpagerの例

それはうまく機能しますが、私が自分の高解像度画像(サイズが大きい)を配置したとき、それは私に例外を与えました:

java.lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えています。

私はそれについての古い質問を投稿しますが、それはその理由で複製されたものを閉じました、私はたくさん試し、検索しました、最後に私は次のような解決策を見つけました:次のようにしてメモリ例外を回避するために画像をスケーリングします:

ここstackfllowとandroid開発サイトでの作者のアドバイスと回答、私は次のコードで終わりました、これも同じ例外で終わります、私はまだjavaとandroid開発を学んでいる私のコードにいくつかの間違いがあると思います、しかしそれは私が終わらせることができますで、助けやアドバイスをいただければ幸いです、

ありがとう 。

私のコード:

ViewPagerAdapter

  public class ViewPagerAdapter extends PagerAdapter {

Activity activity;
int imageArray[];

public ViewPagerAdapter(Activity act, int[] imgArra) {
    imageArray = imgArra;
    activity = act;
                           }

public int getCount() {
    return imageArray.length;
                        }

public Object instantiateItem(View collection, int position) {
    ImageView view = new ImageView(activity);
    view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT));
    view.setScaleType(ScaleType.FIT_XY);
    view.setBackgroundResource(imageArray[position]);
    ((ViewPager) collection).addView(view, 0);
    return view;
                              }

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);
                              }

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);
                                     }

@Override
public Parcelable saveState() {
    return null;
                                       }
public static Bitmap decodeSampledBitmapFromResource(String imageArra,
        int reqWidth, int reqHeight) {      

        // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(imageArra, options);

 // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(imageArra, options);
                                       }


    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
                      }
                          }
    return inSampleSize;}}

PageIndicatorActivity

    public class PageIndicatorActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPagerAdapter adapter = new ViewPagerAdapter(this, imageArra);
    ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);
                                 }

private int imageArra[] = { R.drawable.one, R.drawable.two,
        R.drawable.three, R.drawable.four,
        R.drawable.five, R.drawable.six,
        R.drawable.seven, R.drawable.eight,R.drawable.nine,
                          R.drawable.ten };  }

logcatスタック

   FATAL EXCEPTION: main
     java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:563)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1709)
at android.content.res.Resources.getDrawable(Resources.java:581)
at android.view.View.setBackgroundResource(View.java:7586)
at com.horizontalscrollviewwithpageindicator.ViewPagerAdapter.instantiateItem
        (ViewPagerAdapter.java:33)
at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
at android.support.v4.view.ViewPager.populate(ViewPager.java:875)
at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1234)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
at android.view.View.measure(View.java:8366)
at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

1

次のヒントを試してください。

-Androidは画像でうまく機能し.png同じサイズの画像.jpgフォーマットで作成しOutOfMemoryErrorます。

公式のAndroid開発者サイトからの解決策については、次のリンクを参照してください。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

于 2012-11-25T19:05:49.750 に答える
0

このメソッドを使用して画像を拡大縮小することは決してありません。また、inSampleSizeは2の累乗である必要があります(私は信じています)。これらの画像は大きすぎます(以前の投稿で述べた4.5 mb)。保存されている巨大なビットマップに加えて、ビューページャーは常に3つのビューをメモリに保持します。ビューページャーに割り当てられたメモリは、>13.5mbのようなものです。インスタンス化ビューを次のように置き換えます。

ImageView myView = new ImageView(context);
BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;

Bitmap bitmap = BitmapFactory.decodeResource(activity.getResouces(), imageArray[position], options );
myView.setImageBitmap(bitmap);

((ViewPager) view).addView(myView);   

return myView;

それでもエラーが発生する場合は、options.inSampleSize=8を使用してください。

于 2012-11-25T23:47:47.123 に答える