2014-02-06 74 views
3

我有下一個XML佈局:如何保持圖像寬高比上API <18

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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="#fff" 
android:gravity="center_vertical" 
android:orientation="vertical" > 

<RelativeLayout 
    android:id="@+id/my_frame" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#fff" 
    android:gravity="center_vertical" > 

    <ImageView 
     android:id="@+id/image_areas" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:adjustViewBounds="true" 
     android:background="#9a05e7" 
     android:scaleType="fitXY" 
     android:src="@drawable/mapa_mask" 
     android:visibility="invisible" 
     tools:ignore="ContentDescription" /> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:adjustViewBounds="true" 
     android:background="#fff" 
     android:scaleType="fitXY" 
     android:src="@drawable/mapa_default" 
     android:visibility="visible" 
     tools:ignore="ContentDescription" /> 
</RelativeLayout> 

有兩個圖像 「重疊」。

如果我在已安裝Android 4.3或更高版本(> = API 18)的設備上測試應用程序,則圖像寬高比保持完美。但是,如果我在API> = 14 API < = 17之間的設備上測試應用程序,則圖像顯示的「高度窄」很少。

我用旁邊設置正確的大小,但它沒有工作:

 // load the original BitMap (768 x 583 px) 
    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), 
      R.drawable.mapa_default); 
      // iv is an ImageView referenced in onCreate (mapa_default) 
    int width = bitmapOrg.getWidth(); 
    int height = bitmapOrg.getHeight(); 
    int newWidth = iv.getWidth(); 
    int newHeight = heightRealImg; 

    // calculate the scale 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    // create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 

    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, 
      height, matrix, true); 

    // make a Drawable from Bitmap to allow to set the BitMap 
    // to the ImageView, ImageButton or what ever 
    BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); 

    // set the Drawable on the ImageView 
    iv.setImageDrawable(bmd); 

    // center the Image 
    iv.setScaleType(ScaleType.FIT_XY); 
    iv.setAdjustViewBounds(true); 

這個崩潰,因爲iv.getWidth返回0。我想,這是因爲佈局還沒有完成加載呢。

如何保持圖像寬高比? 感謝

我的解決辦法:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/my_frame" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:background="#fff" 
android:gravity="center_vertical" > 

<ImageView 
    android:id="@+id/image_areas" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:adjustViewBounds="true" 
    android:background="#9a05e7" 
    android:scaleType="fitXY" 
    android:src="@drawable/mapacyl_mask" 
    android:visibility="invisible" 
    tools:ignore="ContentDescription" /> 

<ImageView 
    android:id="@+id/image" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:scaleType="fitXY" 
    android:src="@drawable/mapacyl" 
    android:visibility="visible" 
    tools:ignore="ContentDescription" /> 

</RelativeLayout> 

在這種情況下,我管理「所有」屏幕的觸摸,我不需要獲取圖像的寬度和高度或修改這些值。而隨着fitXY的形象擴大和適應所有的屏幕尺寸,儘管比例不保留。

非常感謝@Doctoror驅動

回答

3

爲什麼不使用

android:scaleType="centerCrop"? 

編輯: 您不需要做任何事情的代碼。

你誤解了wrap_content和縮放類型的含義。

wrap_content意味着視圖將像圖像一樣小,並且不會大於其父邊界。

fitXY表示將調整圖像的大小以適合整個ImageView而不保留寬高比。 canterCrop裝置

縮放圖像均勻(保持圖像的縱橫比),以使圖像的兩個尺寸(寬度和高度)將等於或小於所述視圖(負填充)的對應尺寸大。

因此,也許要嘗試

android:scaleType="centerInside" 

縮放圖像均勻(保持圖像的縱橫比),以使圖像的兩個尺寸(寬度和高度)將等於或小於比視圖的相應維度(減填充)。

ImageView scaleType

+0

centerCrop不起作用,頂部和圖像的底部「板缺」,我不知道爲什麼,因爲高度設置爲wrap_content。謝謝你的時間。 – Adrian

+0

@Adrian再次更新。 –

+0

感謝您的解釋!!!我已使用我的解決方案更新了該文章。 – Adrian

相關問題