2011-07-13 135 views
1

我有3個ImageViews的相對佈局。第一個是方形圖像,第二個僅用於間距,第三個是另一個方形圖像。以編程方式更改ImageView的大小

下面是該佈局的XML代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/radioSV" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/radioLayout" 
    android:orientation="vertical" 
    android:gravity="center"> 

    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center"> 

    <ImageView 
     android:id="@+id/sssImageView" 
     android:src="@drawable/radio_sss_400_r" 
     android:layout_width="10sp" 
     android:layout_height="10sp" 
     android:layout_gravity="center" 
     android:scaleType="centerCrop"> 
    </ImageView> 

    <!-- spacing --> 

    <ImageView 
     android:id="@+id/spacing1" 
     android:background="@android:color/transparent" 
     android:layout_width="wrap_content" 
     android:layout_height="10dip" 
     android:layout_below="@id/sssImageView"> 
    </ImageView> 

    <ImageView 
     android:id="@+id/gaImageView" 
     android:src="@drawable/radio_ga_400_r" 
     android:layout_width="10sp" 
     android:layout_height="10sp" 
     android:layout_gravity="center" 
     android:scaleType="centerCrop" 
     android:layout_below="@id/spacing1"> 
    </ImageView> 

    </RelativeLayout> 
</LinearLayout> 
</ScrollView> 

現在,我想我的應用程序是不同的屏幕密度是有用的,因此,因此,在java文件,我問的密度和使用之後的開關盒聲明。在此聲明中,必須更改2個ImageView(sssImageViewgaImageView)的尺寸(寬度,高度)。

例如,如果屏幕的密度很高,我希望ImageViews的寬度和高度爲200sp。我只是把xsp中的10sp作爲「標準」值。

這對於高屏幕密度使用-case語句的一部分:

case DisplayMetrics.DENSITY_HIGH: 
    layoutParams = new RelativeLayout.LayoutParams(val_high, val_high); 
    sssImageView.setLayoutParams(layoutParams); 
    sssImageView.setMaxHeight(val_high); 
    sssImageView.setMaxWidth(val_high); 

    gaImageView.setLayoutParams(layoutParams); 
    gaImageView.setMaxHeight(val_high); 
    gaImageView.setMaxWidth(val_high); 
    break; 

此外,val_high是200SP:

int val_high = (int) TypedValue.applyDimension(
       TypedValue.COMPLEX_UNIT_SP, 200, this.getResources().getDisplayMetrics()); 

現在,隨着ImageView的sssImageView部分完美的作品。它正確地將圖像從10sp放大到200sp(不要擔心 - 圖像最初不是10sp!)。 問題是其他ImageView gaImageView將其自身置於sssImageView之上並銷燬佈局的事實。如果我用gaImageView註釋掉3行,它在佈局中的正確位置,但當然仍然很小(10sp)。

我也嘗試了相反的做法:用sssImageView註釋掉3行並且只操作gaImageView。現在,頂級ImageView(sssImageView)位於正確的位置,並且與預期的一樣小。但是,ImageView的底部gaImageView定位在sssImageView之上,而不是像xml佈局文件中所寫的那樣。

這裏有什麼問題?

+0

冒着說明顯而易見的原因,爲什麼不對不同的密度使用不同的drawable /佈局? – Idistic

+0

@我很喜歡。但是如果我不改變圖像的大小,我的應用程序中某些地方的佈局就會被破壞。這是其中的一個地方。實際上,對於這2個ImageViews的圖像,我有3種不同的尺寸,但是在其他密度測試時,它們不會改變。 – eightx2

回答

2

我設法解決了這個問題。

下面是DENSITY_HIGH case語句代碼:

case DisplayMetrics.DENSITY_HIGH:    
    display = getWindowManager().getDefaultDisplay(); 
    width = display.getWidth(); 
    height = display.getHeight();    

    // 0.36 is a scaling factor 
    int val_high = (int) (height*0.36); 

    sssImageView.setId(1); 
    gaImageView.setId(2); 
    spacing.setId(3); 

    layoutParams = new RelativeLayout.LayoutParams(val_high, val_high); 
    layoutParams2 = new RelativeLayout.LayoutParams(val_high, val_high); 
    layoutParams3 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
     (int) TypedValue.applyDimension(
     TypedValue.COMPLEX_UNIT_DIP, 10, this.getResources().getDisplayMetrics())); 

    sssImageView.setMaxHeight(val_high); 
    sssImageView.setMaxWidth(val_high); 
    relativeLayout.updateViewLayout(sssImageView, layoutParams);    

    layoutParams3.addRule(RelativeLayout.BELOW, sssImageView.getId()); 
    relativeLayout.updateViewLayout(spacing, layoutParams3); 

    layoutParams2.addRule(RelativeLayout.BELOW, spacing.getId()); 
    gaImageView.setMaxHeight(val_high); 
    gaImageView.setMaxWidth(val_high); 
    relativeLayout.updateViewLayout(gaImageView, layoutParams2);     
    break; 

所以一般情況下,它看起來像我不得不「重新創建」 XML文件編程。

相關問題