5

これは、Android デベロッパー コンソールの Mysterious スタック トレースの複製ではありません (ビットマップ サイズが 32 ビットを超えています)。

その質問には 1 行のコードも含まれておらず、答えもありません。さらに、ビットマップ サイズを 32x32 に設定してもこのエラーが発生します。これは唯一のビットマップであるため、メモリに関連していません。

私がしたいこと

  1. ImageView のサイズを取得し、
  2. ビットマップを作成する
  3. キャンバスに何かを描きます。

Log.eImageView のサイズ、したがってビットマップの出力は次のとおりです。

Width: 272
Height: 136

何が起こるのですか

以下のコードは、Nexus4、Nexus7、および Desire HD (CM10) ではうまく機能しますが、エミュレーターでアプリを実行すると、以下に示すエラー (API 8) が表示されます。

所見

  1. 半分のサイズと 32x32 で試してみましたが、同じエラーが発生します。

  2. ImageView を DialogFragment (API 8 の ActionBarSherlock/HoloEveryWhere) に表示していますが、それが原因でしょうか?

イメージビュー:

<ImageView
      android:id="@+id/imageView1"
      android:layout_width="match_parent"
      android:layout_height="1dp"
      android:layout_marginBottom="12dp"
      android:layout_marginTop="12dp" />

私の活動では:

iv = (ImageView) view.findViewById(R.id.imageView1);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
         if (!waveFormMeasured) {
             if (iv.getMeasuredWidth() > 1) {
                 width = iv.getMeasuredWidth();
                 Log.e(TAG, "Width: " + width + " Height: " + width / 2);
                 waveBitmap = Bitmap.createBitmap((int) width, (int) ((int) width / 2), Config.RGB_565);
                 Log.e(TAG, "Bitmap created");
                 waveCanvas = new Canvas(waveBitmap);
                 Log.e(TAG, "Bitmap set to Canvas");
                 iv.getLayoutParams().height = width / 2;
                 Log.e(TAG, "ImageView Height changed");
                 iv.setImageBitmap(waveBitmap);
                 Log.e(TAG, "Bitmap set to ImageView");
                 drawWaveForm(true);
                 Log.e(TAG, "WaveForm drawn");
                 waveFormMeasured = true;
              }
          }
     return true;
     }
  });

ここで何が問題なのですか?

02-21 17:12:48.301: E/Drummers(375): Width: 272 Height: 136
02-21 17:12:48.301: E/Drummers(375): Bitmap created
02-21 17:12:48.301: E/Drummers(375): Bitmap set to Canvas
02-21 17:12:48.301: E/Drummers(375): ImageView Height changed
02-21 17:12:48.301: E/Drummers(375): Bitmap set to ImageView
02-21 17:12:48.623: E/Drummers(375): WaveForm drawn
02-21 17:12:48.842: E/AndroidRuntime(375): FATAL EXCEPTION: main
02-21 17:12:48.842: E/AndroidRuntime(375): java.lang.IllegalArgumentException: bitmap size exceeds 32bits
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.graphics.Bitmap.nativeCreate(Native Method)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.View.buildDrawingCache(View.java:6577)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.onAnimationStart(ViewGroup.java:1259)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1505)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.View.draw(View.java:6883)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.View.draw(View.java:6986)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.widget.ScrollView.draw(ScrollView.java:1409)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.View.buildDrawingCache(View.java:6640)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.onAnimationStart(ViewGroup.java:1259)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.drawChild(ViewGroup.java:1505)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.View.draw(View.java:6883)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-21 17:12:48.842: E/AndroidRuntime(375):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewRoot.draw(ViewRoot.java:1522)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.os.Looper.loop(Looper.java:123)
02-21 17:12:48.842: E/AndroidRuntime(375):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-21 17:12:48.842: E/AndroidRuntime(375):  at java.lang.reflect.Method.invokeNative(Native Method)
02-21 17:12:48.842: E/AndroidRuntime(375):  at java.lang.reflect.Method.invoke(Method.java:507)
02-21 17:12:48.842: E/AndroidRuntime(375):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-21 17:12:48.842: E/AndroidRuntime(375):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-21 17:12:48.842: E/AndroidRuntime(375):  at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

2

ビットマップには、デバイスに応じたサイズ制限があります。サイズは通常、画面自体のサイズです。この問題に対処するスタックオーバーフローに関するいくつかの質問があります。たとえば、OutOfMemoryError:ビットマップサイズがVMバジェットを超えています:-Androidまたは画像をビットマップオブジェクトにロードする際のメモリ不足の問題。非常に大きな画像が必要な場合は、画像をより扱いやすいサイズに分割して、複数に配置するだけImageViewsです。私は数か月前に、約15枚の画像をシームレスにつなぎ合わせた、大きくてスクロール可能な画像を使用してアプリを作成しました。これが良い方法であることを確認します。

最後に、ビットマップはAndroidで発生するメモリの問題のため、直接操作するのが困難です。BitmapFactory.Optionsを調べ、常にrecycle未使用のビットマップを無効にすることを忘れないでください。

編集

また、のビューのコンテンツの変更と関係がある場合もありますonPreDraw()。この投稿:ビューを最初に測定できるのはいつですか?このメソッドでビューのサイズを編集すると、どのようonPreDraw()に継続的に呼び出されるかについて説明しますが、これらの操作をで実行するonGlobalLayoutListenerと、期待される結果が得られます。

于 2013-02-21T17:30:09.967 に答える
0

API 8 で DialogFragment を match_parent (幅と高さの両方) に設定すると問題があるようです。何が起こっているのか正確にはわかりませんが、次のダミー レイアウトを追加すると修正されました (いくつかの LinearLayouts/TextViews/ がありました)。 layout_width="match_parent" を使用した SeekBars など、すべてが API 11 以降で機能しました):

<org.holoeverywhere.widget.ListView
     android:id="@+id/sampleList"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >
</org.holoeverywhere.widget.ListView>

以下は、フルスクリーンに設定するために機能しませんでした:

setStyle(...)

また

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
于 2013-02-23T16:25:25.740 に答える