2017-01-03 65 views
0

我想在ImageView中顯示圖像。Android位圖可以在橫向或縱向上工作

我做這種方式:

File externalDirectory = Environment.getExternalStorageDirectory(); 

    File directory = new File (externalDirectory.getAbsolutePath()); 
    File file = new File(directory, "pic.jpg"); //or any other format supported 

    FileInputStream streamIn = null; 
    try { 
     streamIn = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    bitmap = BitmapFactory.decodeStream(streamIn); //This gets the image 

    try { 
     streamIn.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    imageView = (ImageView) findViewById(R.id.image_view); 
    imageView.setImageBitmap(bitmap); 

的問題是,如果我開始在園林應用和事後旋轉設備,應用程序崩潰。

XML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/image_view"/> 

</FrameLayout> 

接下來的問題是,圖象不在全屏顯示。
你有什麼建議可以解決這些問題嗎?

的logcat當旋轉設備

01-03 11:23:45.810 25429-25429/com.kamera E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.kamera, PID: 25429 
                    java.lang.OutOfMemoryError: Failed to allocate a 80683020 byte allocation with 16765280 free bytes and 63MB until OOM 
                     at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
                     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
                     at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635) 
                     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611) 
                     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649) 
                     at com.kamera.PhotoActivity.loadImageFromExternalStorage(PhotoActivity.java:47) 
                     at com.kamera.PhotoActivity.onCreate(PhotoActivity.java:29) 
                     at android.app.Activity.performCreate(Activity.java:6248) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2437) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544) 
                     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4398) 
                     at android.app.ActivityThread.access$1000(ActivityThread.java:150) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:168) 
                     at android.app.ActivityThread.main(ActivityThread.java:5845) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
+1

發佈logcat的錯誤細節總是 –

+0

好吧,我現在又增加了它 – mafioso

+1

需要應用'BitmapFactory.Option'而解碼的流,因爲你的位圖佔用太多的內存由於大尺寸 –

回答

1

調整大小的位圖(根據需要小心你不會失去太多的質量。改變樣本大小的值)

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 8; 
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options); 

並在您的清單中放入android:allowBackup =「true」

<application 
    android:allowBackup="true" 
    android:hardwareAccelerated="false" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

全屏圖像使用:

機器人:scaleType = 「fitXY」

+0

好,謝謝好現在的作品!如何以橫向/縱向模式全屏顯示圖像?這不能正常工作 – mafioso

+0

@mafioso我更新了答案。這將在條件風景和肖像中起作用。 – Spartan

+0

我已經將allowBackup設置爲true,但在橫向模式下,圖片仍然不是全屏 – mafioso

1

您旋轉則設備O.S.每次重新創建活動並創建/初始化所有對象。假設您啓動了應用程序,並且您的設備處於肖像模式,則您的位圖將在內存中加載並處理。當您旋轉設備時,位圖將再次從存儲器解碼到內存中。

解決方案:1.保持位圖參考全局。 2.在savedInstanceState()或onCreate()檢查位圖是否處理。如果處理,則不需要再處理它。

例子。

public void onCreate(Bundle savedInstanceState) { 
     if(null != savedInstanceState && null != bitmap) { 
     // Bitmap is processed already. 
} 
else { 
     // Bitmap is not processed. Need to process it. 
} 
} 

或者在onSaveInstanceState()方法中檢查相同。

+0

bitmap = BitmapFactory.decodeStream(streamIn); //這樣得到的圖像 這條線每次都被執行並且一次又一次地在內存中加載位圖。 – Priyavrat

1
  1. 爲了避免內存不足的問題,請參見下面的鏈接,縮放位圖 https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

  2. 要在全屏中顯示圖像,請在圖像標記內的xml文件中添加「android:scaleType =」fitXY「」。

+0

謝謝,適用於肖像模式,但在橫向模式下它仍然是一樣的..你知道爲什麼嗎? – mafioso

+0

當您更改方向時,您的視圖是否正在重新創建? – Jayamurugan

相關問題