2011-07-13 12 views
1

私は3つのImageViewで相対レイアウトを持っています。最初の画像は正方形の画像で、2番目の画像はスペーシングに使用され、3番目の画像は別の正方形の画像です。ここで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ファイルで、私は密度を求めると使用します後でswitch-caseステートメント。このステートメントでは、2つのImageView(sssImageViewおよびgaImageView)のサイズ(幅、高さ)を変更する必要があります。

たとえば、画面の濃度が高い場合、ImageViewの幅と高さを200spにします。私は10spを「標準」値としてxmlに入れました。

これは、高画面密度に使用-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()); 

、完璧に動作sssImageView ImageViewの持つ部分。それは10spから200spに画像を正しく拡大します(心配しないでください - 画像はもともと10spではありません!)。 問題は、もう1つのImageView、gaImageViewsssImageViewの上に置かれ、レイアウトが破棄されるという事実です。私がgaImageViewで3行をコメントアウトすると、それはレイアウトの正しい場所にありますが、もちろん小さい(10sp)です。

私はまた、逆の試みをしました:sssImageViewで3行をコメントアウトし、gaImageViewを操作するだけです。 ImageView(sssImageView)の先頭が正しい場所にあり、期待どおりに小さくなっています。しかし、下部のImageView、gaImageViewは、sssImageViewの上に位置し、xmlレイアウトファイルに書かれているとおりではありません。

ここで何が間違っていますか?

+0

異なる密度の異なるドロアブル/レイアウトを使用するだけではなく、明白な理由があるでしょうか? – Idistic

+0

@Idisticです。しかし、私も画像のサイズを変更しない場合、私のアプリのいくつかの場所のレイアウトが破壊されます。これはその場所の一つです。実際には、私はこれらの2つのImageViewsの画像の3つの異なるサイズを持っていますが、どういうわけか他の濃度でテストすると変更されません。 – eightx2

答えて

2

私はこの問題を解決することができました。

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ファイルを「再作成」しなければならなかったのようになります。ここでは

はDENSITY_HIGHのcase文のコードです。

関連する問題