2017-01-03 8 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

Ok я добавил сейчас – 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

Каждый раз, когда вы поворачиваете устройство затем младший матрос воссоздает действие и все его объекты создаются/инициализируются. Предположим, что вы запустили приложение, и ваше устройство находится в портретном режиме, ваше растровое изображение загружено и обработано в памяти. Когда вы поворачиваете устройство, растровое изображение снова декодируется в память из вашего хранилища.

Решение: 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. Чтобы отобразить изображение в полноэкранном режиме, добавьте «android: scaleType =« fitXY »» в свой XML-файл внутри тега изображения.

+0

Спасибо, работает в портретном режиме, но в ландшафтном режиме это все равно. Знаете почему? – mafioso

+0

Воспроизводится ли ваше представление при изменении ориентации? – Jayamurugan