1. 程式人生 > >android imageview 圖片不能正常顯示 或不能自適應的解決方法

android imageview 圖片不能正常顯示 或不能自適應的解決方法

      起因:

                       是由於最近在本地pc搭建伺服器,把安卓圖片傳到電腦進行處理,然後在把處理資訊發回來。

                      但在設定圖片的時候折騰了好久。

         問題如下:

                       1 取到圖片了,但是返回的是縮圖,沒有放大顯示在手機螢幕上

                       2 設定了獲取螢幕的寬度,用於重新設定圖片的寬高,但是發現圖片只是進行簡單的拉伸放大
                       3 拉伸或剪下後圖片很模糊

                       後來在google找了很久也沒有解決問題,最後還是解決了問題。

     話不多說,直接上圖:

之前的圖片:                                                現在的圖片:

img                 img

是不是放大了,而且很清晰。

好了,接下來就是重點了:

    首先是通過這段來到相簿:

  Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                image_Uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"workupload.jpg"));
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, image_Uri);
                startActivityForResult(cameraIntent, camera_code);

      然後在 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        //判斷是否是選擇照片的請求
        if(requestCode == gallery_code)
        {
            if(intent != null)
            {
                Uri uri = intent.getData();
                //還回的結果是一個遊標
                Cursor cursor =  getContentResolver().query(uri,null,null,null,null);
                cursor.moveToFirst();
                //拿索引 路徑
                int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                //string
                photo_url = cursor.getString(idx);
                //關閉索引
                cursor.close();
                //通過路徑獲得圖片 並進行壓縮
                resizePhoto();
                show_img_view.setImageBitmap(mPhotoImg_bitmap);
            }
        }

}

為了防止圖片過大,對圖片進行壓縮(這是在慕課上看到的,不過不壓縮的話,有些圖片確實會崩潰掉):

  private void resizePhoto()
    {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        //不會載入,只會獲取圖片的一個尺寸
        //options裡面儲存了圖片的高度和寬度
        //讀取檔案
        BitmapFactory.decodeFile(photo_url ,options);
        //改變圖片的大小
        double ratio = Math.max(options.outWidth *1.0d/1024f,options.outHeight *1.0d/1024);
        options.inSampleSize =(int) Math.ceil(ratio);
        //設定後會載入圖片
        options.inJustDecodeBounds = false;
        //圖片壓縮完成
        mPhotoImg_bitmap  =  BitmapFactory.decodeFile(photo_url ,options);
    }

接下來如何放大圖片進行顯示呢?

其實 imageView本身沒有大小之分,只是圖片多大,它就多大,圖片撐的。

所以我們可以通過一個屬性: 

                 Android:adjustViewBounds="true" ,進行調節,小圖可以放大,但是大圖就完了

為了照顧大圖不至於碾壓螢幕,還要配合 :

               android:maxHeight ="460dp"
              android:maxWidth="360dp"

防止大圖太大。當然還有一定是 wrap_content也要注意。

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

好了,就這樣。最後再來一張圖:

img

希望能幫助到你,轉載請註明出處。

另附 ImageView屬性說明:

1、類概述

    顯示任意影象,例如圖示。ImageView類可以載入各種來源的圖片(如資源或圖片庫),需要計算影象的尺寸,比便它可以在其他佈局中使用,並提供例如縮放和著色(渲染)各種顯示選項。

2、XML屬性

屬性名稱

描述

android:adjustViewBounds

是否保持寬高比。需要與maxWidthMaxHeight一起使用,否則單獨使用沒有效果。

android:cropToPadding

是否擷取指定區域用空白代替。單獨設定無效果,需要與scrollY一起使用,效果如下,實現程式碼見程式碼部分:

 

android:maxHeight

設定View的最大高度,單獨使用無效,需要與setAdjustViewBounds一起使用。如果想設定圖片固定大小,又想保持圖片寬高比,需要如下設定:

1) 設定setAdjustViewBoundstrue

2) 設定maxWidthMaxHeight

3) 設定設定layout_widthlayout_heightwrap_content

android:maxWidth

設定View的最大寬度。同上。

android:scaleType

設定圖片的填充方式。

matrix

0

用矩陣來繪圖

fitXY

1

拉伸圖片(不按比例)以填充View的寬高

layout_

height

:30px

layout_

width

:120px

fitStart

2

按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的左邊

fitCenter

3

按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的中間

fitEnd

4

按比例拉伸圖片,拉伸後圖片的高度為View的高度,且顯示在View的右邊

center

5

按原圖大小顯示圖片,但圖片寬高大於View的寬高時,截圖圖片中間部分顯示

layout_

height

:60px

layout_

width

:80px

padding

:10px

centerCrop

6

按比例放大原圖直至等於某邊View的寬高顯示。

centerInside

7

當原圖寬高或等於View的寬高時,按原圖大小居中顯示;反之將原圖縮放至View的寬高居中顯示。

android:src

設定Viewdrawable(如圖片,也可以是顏色,但是需要指定View的大小)

android:tint

將圖片渲染成指定的顏色。見下圖:

 左邊為原圖,右邊為設定後的效果,見後面程式碼。