以编程方式更改ImageView大小

时间:2011-07-13 17:24:42

标签: java android imageview relativelayout

我有3个ImageViews的相对布局。第一个是方形图像,第二个用于间距,第三个是另一个方形图像。

以下是该布局的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(sssImageViewgaImageView)的大小(宽度,高度)。

例如,如果屏幕密度很高,我希望ImageViews的宽度和高度为200sp。我只是将xsp中的10sp作为“标准”值。

这是高屏幕密度的用例陈述的一部分:

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布局文件中所写的那样。

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。

以下是DENSITY_HIGH案例陈述的代码:

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文件。

相关问题