Android: изменение размера просмотра без потери позиции

У меня есть этот макет

<RelativeLayout
        android:id="@+id/gameportView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.pepotegames.spotthedifferences.DifferenceView
            android:id="@+id/imageA"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/progressBar1"
            android:layout_centerHorizontal="true" />

        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="16dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:max="1000"
            android:progress="0" />

        <com.pepotegames.spotthedifferences.DifferenceView
            android:id="@+id/imageB"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/progressBar1"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

Как вы можете видеть, imageA и imageB расположены относительно моего ProgressBar. Проблема в том, что мне нужно изменить размер ProgressBar во время выполнения. Для этого у меня есть пользовательский прослушиватель, который запускается при вызове моего пользовательского метода View onSizeChanged.

imageA.setOnSizeChangedLister(new DifferenceView.OnSizeChangedListener(){
        @Override
        public void onResize(){
            level.scaleBy(imageA.getScale());

            bar.setLayoutParams(new RelativeLayout.LayoutParams(imageA.getWidth(),bar.getHeight()));
        }
    });

Все работает отлично, за исключением того, что я передаю набор новых LayoutParams в мой бар. Итак, как я могу изменить размер этого индикатора без потери атрибутов android:layout_centerHor horizontal="true" и android:layout_centerVertical="true"?

2 ответа

Решение

Используйте следующее -

imageA.setOnSizeChangedLister(new DifferenceView.OnSizeChangedListener(){
    @Override
    public void onResize(){
        level.scaleBy(imageA.getScale());

        RelativeLayout.LayoutParams existingLayoutParams = ((RelativeLayout.LayoutParams) bar.getLayoutParams());
        existingLayoutParams.width = imageA.getWidth();
        existingLayoutParams.height = imageA.getHeight();
        bar.setLayoutParams(existingLayoutParams);
    }
});

Вместо создания новых LayoutParams, попробуйте извлечь текущие LayoutParams представления, используя getLayoutParams, а затем отредактируйте желаемые значения.

Другие вопросы по тегам