Изменить размер ImageView программно - PullRequest
1 голос
/ 13 июля 2011

У меня есть относительный макет с 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-х ImageViews (sssImageView и gaImageView) необходимо изменить.

Например, если плотность экрана высокая, я хочуширина и высота ImageViews должны быть 200sp.Я только что поместил 10sp в xml как «стандартное» значение.

Это часть описания варианта использования для высокой плотности экрана:

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 is 200sp:

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

Теперь деталь с ImageView sssImageView работает отлично.Он корректно увеличивает изображение с 10 до 200sp (не волнуйтесь - изначально изображение не 10sp!).Проблема заключается в том, что другой ImageView, gaImageView, ставит себя поверх sssImageView и разрушает макет.Если я закомментирую 3 строки с помощью gaImageView, он будет на своем правильном месте в макете, но все еще будет небольшим (10sp), конечно.

Я также попробовал обратное: закомментировал 3 строкис sssImageView и только манипулированием gaImageView.Теперь вершина ImageView (sssImageView) находится на своем правильном месте и небольшого размера, как и ожидалось.Однако нижний ImageView, gaImageView, располагается сверху sssImageView, а не ниже, как написано в файле макета xml.

Что здесь не так?

1 Ответ

2 голосов
/ 23 июля 2011

Мне удалось решить эту проблему.

Вот код для выражения дела 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-файл программно.

...