Изменить размер ImageView программно

1

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

Например, если плотность экрана высока, я хочу, чтобы ширина и высота изображения были равны 200 с. Я просто поставил 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 - 200sp:

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

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

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

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

  • 0
    С риском констатировать очевидное, почему бы просто не использовать разные drawables / layout для разных плотностей?
  • 0
    @ Идентично. Но если я не изменю размер изображений, макет некоторых мест в моем приложении будет разрушен. Это одно из тех мест. На самом деле у меня есть 3 разных размера для изображений для этих 2 ImageViews, но почему-то они не меняются при тестировании на других плотностях.
Теги:
relativelayout
imageview

1 ответ

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 файл программным путем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню