以编程方式更改ImageView大小 [英] Change ImageView size programmatically

查看:204
本文介绍了以编程方式更改ImageView大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a relative layout with 3 ImageViews. The first one is a square image, the second is just used for spacing, and the third one is another square image.

这是该布局的xml代码: / p>

Here is the xml code for that layout:

<?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个ImageViews( sssImageView gaImageView )的大小(宽度,高度) 。

Now, I want my app to be useful for various screen densities, so therefore, in the java file, I ask for the density and use a switch-case statement afterwards. In this statement, the size (width, height) of the 2 ImageViews (sssImageView and gaImageView) have to be changed.

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

For instance, if the density of the screen is high, I want the width and height of the ImageViews to be 200sp. I've just put 10sp in the xml as a 'standard' value.

这是用于高屏幕密度的用例语句的一部分:

This is the part of the use-case statement for high screen density:

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)。

Now, the part with the ImageView sssImageView works perfectly. It correctly enlarges the image from 10sp to 200sp (don't worry - the image is not 10sp originally!). The problem is the fact that the other ImageView, gaImageView, puts itself on top of sssImageView and destroys the layout. If I comment out the 3 lines with gaImageView, it is on its correct place in the layout, but is still small (10sp) of course.

我也尝试了相反的方法:用 sssImageView 评论3行,只操纵 gaImageView 。现在顶部的ImageView( sssImageView )位于正确的位置,并且如预期的那样小。但是,底部的ImageView, gaImageView ,将自己置于 sssImageView 之上,而不是像xml布局中所写的那样文件。

I have also tried the opposite: commenting out the 3 lines with sssImageView and only manipulating gaImageView. Now the top ImageView (sssImageView) is on its correct place and small as expected. However, the bottom ImageView, gaImageView, positions itself on top of sssImageView, and not below as written in the xml layout file.

这里有什么问题?

推荐答案

我设法解决这个问题。

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

Here is the code for the DENSITY_HIGH case statement:

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

So generally, it looks like I had to "re-create" the xml file programmatically.

这篇关于以编程方式更改ImageView大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆