Масштабируйте дочерние элементы макета так же, как родительские - PullRequest
0 голосов
/ 17 июня 2020

Я создаю приложение Android, которое будет иметь циферблат компаса, на котором отображается азимутальное положение солнца. Циферблат компаса представляет собой вектор размером 100x100 dp, который я масштабирую с помощью match_parent в обоих измерениях, чтобы заполнить доступную область экрана. Изображение солнца - это векторный рисунок 10x10 dp, который накладывается на изображение компаса в соответствующем месте. Оба они находятся внутри ConstraintLayout, также с использованием match_parent масштабирования.

Моя проблема в том, что я не могу найти способ сделать масштабируемый масштаб солнца с тем же коэффициентом, что и компас. Если я использую match_parent, он расширяется, чтобы заполнить свой родительский макет. Если я использую wrap_content, он вообще не масштабируется и отображается с размером намного меньше, чем 1/10 от размера циферблата.

Далее следует отрывок из моего файла макета. Есть ли какой-либо простой способ, декларативно в макете или в соответствующем действии, увеличить меньший масштабируемый масштаб с тем же коэффициентом, что и его родственный компас?

Примечание: я использую app:layout_constraintCircle* для размещения солнца выдвигается. Я смирился с необходимостью масштабировать app:layout_constraintCircleRadius в коде приложения, основываясь на той небольшой информации, которую мне удалось найти. Но если есть способ сделать и эту шкалу с циферблатом компаса доступной для рисования, это было бы замечательно.

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/compass_composite"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="false">

        <ImageView
            android:id="@+id/compass_face"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/content_compass_display"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_compass_face"
            android:tint="@android:color/darker_gray" />

        <ImageView
            android:id="@+id/sun"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintCircle="@+id/compass_face"
            app:layout_constraintCircleRadius="45dp"
            app:layout_constraintCircleAngle="210"
            android:src="@drawable/ic_sun"
            android:tint="@color/bg_noon"
            android:visibility="visible" />

    </androidx.constraintlayout.widget.ConstraintLayout>

1 Ответ

0 голосов
/ 20 июня 2020

Я нашел решение: использовать атрибуты ширины и высоты макета на основе процентов. Для них требуется много шаблонов xml, но как только вы их выбросите, все будет работать очень хорошо. Тем не менее, мне все еще нужно масштабировать радиус ограничения круга с помощью грубой силы. Я надеюсь, что либо я найду лучшее решение, либо будущая версия Android предоставит лучший способ сделать это.

Между прочим, эти предполагаемые "процентные" значения на самом деле являются десятичными дробями, так что например 1/10 - это 0,1, а не 10. Меня это необоснованно раздражает. :)

Вот отрывок из моего макета, показывающий трюк:

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/compass_rotating"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="false">

            <ImageView
                android:id="@+id/compass_face"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:contentDescription="@string/content_compass_display"
                android:scaleType="fitCenter"
                android:src="@drawable/ic_compass_face"
                android:tint="@android:color/darker_gray" />

            <ImageView
                android:id="@+id/sun"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:contentDescription="@string/content_sun_position"
                android:tooltipText="@string/content_sun_position"
                android:src="@drawable/ic_solid_dot"
                android:tint="@color/sun_yellow"
                app:layout_constraintCircle="@+id/compass_face"
                app:layout_constraintCircleAngle="0"
                app:layout_constraintCircleRadius="45dp"
                app:layout_constraintHeight_default="percent"
                app:layout_constraintHeight_percent="0.1"
                app:layout_constraintWidth_default="percent"
                app:layout_constraintWidth_percent="0.1"
                tools:ignore="MissingConstraints" />
...