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

相关问题