2017-11-15 16 views
0

私のアプリのスプラッシュ画面に2つの画像を使用しています。私のImageView(src)のロゴとレイアウトの背景(:background)、私のアプリはエミュレータ上でうまく動作しますが、私の電話(S8)でクラッシュします。私のsplashScreenと例外の原因となるxmlファイルが表示されます。私が理解していることから、その画像の1つ(またはその両方)は、私の電話の記憶には大きすぎると考えられていますか?しかし、彼らの次元は: ロゴ(1305x641) 背景(1688x1125)です。アプリはエミュレータで動作しますが、S8でクラッシュします

これを修正する方法についてのご意見はありますか?私はイメージの異なる解像度のバージョンを提供することを考えましたが、私はプロセスで迷うことがあります。

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/background" 
    android:gravity="center_horizontal|center_vertical" 
    tools:context="com.spdesigns.funfacts.SplashScreen"> 


<ImageView 
    android:id="@+id/logoImageView" 
    android:layout_width="377dp" 
    android:layout_height="293dp" 
    android:layout_marginBottom="8dp" 
    android:layout_marginEnd="8dp" 
    android:layout_marginStart="8dp" 
    android:layout_marginTop="8dp" 
    android:src="@drawable/logo" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent" /> 
</android.support.constraint.ConstraintLayout> 

例外:

11-16 00:11:01.529 3688-3688/com.spdesigns.funfacts E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.spdesigns.funfacts, PID: 3688 
                    java.lang.RuntimeException: Canvas: trying to draw too large(120362760bytes) bitmap. 
                     at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260) 
                     at android.graphics.Canvas.drawBitmap(Canvas.java:1420) 
                     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545) 
                     at android.widget.ImageView.onDraw(ImageView.java:1286) 
                     at android.view.View.draw(View.java:18394) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.draw(View.java:18397) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.draw(View.java:18397) 
                     at com.android.internal.policy.DecorView.draw(DecorView.java:967) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:722) 
                     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:728) 
                     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:836) 
                     at android.view.ViewRootImpl.draw(ViewRootImpl.java:3181) 
                     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2977) 
                     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2565) 
                     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1550) 
                     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7189) 
                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:959) 
                     at android.view.Choreographer.doCallbacks(Choreographer.java:734) 
                     at android.view.Choreographer.doFrame(Choreographer.java:670) 
                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945) 
                     at android.os.Handler.handleCallback(Handler.java:751) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6776) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

答えて

2

あなたはメモリに120メガバイトの画像をロードしようとしています。 これは、これまでロードされるべき画像の約20倍です。

エミュレータでは、コンピュータのメモリを利用することができ、メモリ消費に関するルールが緩い可能性があります。しかし、実際のデバイスははるかに厳しいです。

あなたは、次の操作を行う必要があります。
1)あなたのアプリケーション内のすべての画像上のさらに画像)を実行しPNGCrushを縮小。これは、品質を失うことなくイメージのメモリサイズを減らすプログラムです(詳細については、ドキュメントを参照してください)。
3)hdpi、xhdpi、xxhdpi、xxxhdpiの密度に異なるサイズのイメージを提供します。このようにして、システムは画面サイズに従って適切な画像をロードする。

+0

エミュレータで動作していたのはかなり心配ですが、その目的に反するものです!また、それはスプラッシュスクリーン用のプレイストアダウンロードの1つの地獄でした! –

+0

@Moonbloom私はそれぞれ30〜40KBに圧縮しましたが、私は同じエラーが出て、私は121500000byteのビットマップを描こうとしています。私はそれらを圧縮してからどのように可能ですか? –

+0

それはエラーの原因となる画像ではありません。文字通り画像を削除し、背景/ロゴとして設定しないで、アプリを実行して何が起こるかを確認できますか? – Moonbloom

0

問題を修正しました。

同じ問題に直面している人は、ビットマップをmipmap-xxxhdpiフォルダ内に移動してください。画像が大きすぎるので、ドロウアブルディレクトリ内に配置してから、アンドロイドはこれをmdpi画像と見なします。これによりアンドロイドはアプリケーションをクラッシュさせ、OutOfMemory Exceptionをスローします。それをmipmap-xxxhdpiフォルダの中に入れることで、アンドロイドはそれをターゲットresに縮尺します。

関連する問題