Масштабирование CardView пропорционально разрешению экрана - PullRequest
2 голосов
/ 07 июля 2019

У меня есть активность с тремя прямоугольниками CardViews. Я установил ограничения по размеру, чтобы они менялись в зависимости от разрешения экрана. Пожалуйста, посмотрите мои ограничения здесь.

Проблема в том, что CardViews не меняют свой размер пропорционально. Например, когда я запускаю свое приложение на Nexus 5 (1080 x 1920), нижний компонент получает разрезать пополам, где, как будто я бегу на пикселе (также 1080 x 1920), нижний компонент - желаемый размер.

Хотя я постараюсь сделать пост максимально четким, фотографии определенно помогут понять проблему, с которой я сталкиваюсь, поэтому просмотрите их.

..

Почему нижний компонент изменяется так резко, когда размеры экрана очень похожи? Как я могу изменить компоненты так, чтобы они были желаемого размера для этих разных размеров экрана?

Я знаю, что вы можете создавать маленькие, нормальные, большие и большие макеты, и у меня есть, но я не думаю, что в этом проблема.

Код для 3 CardView:

Верхний левый

    <android.support.v7.widget.CardView
        android:id="@+id/capture_receipt_cardview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/margin_width_normal"
        android:layout_marginEnd="@dimen/button_gap_normal"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="@+id/create_invoice_cardview"
        app:layout_constraintEnd_toStartOf="@+id/create_invoice_cardview"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/create_invoice_cardview">
    </android.support.v7.widget.CardView>

Вверху справа:

    <android.support.v7.widget.CardView
        android:id="@+id/create_invoice_cardview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/button_gap_normal"
        android:layout_marginTop="185dp"
        android:layout_marginEnd="@dimen/margin_width_normal"
        android:layout_marginBottom="@dimen/button_gap_normal"
        app:layout_constraintBottom_toTopOf="@+id/add_single_cardview"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/capture_receipt_cardview"
        app:layout_constraintTop_toTopOf="parent">
   </android.support.v7.widget.CardView>

Нижняя Горизонтальная:

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/add_single_cardview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="400dp"
        android:layout_marginBottom="68dp"
        app:layout_constraintBottom_toTopOf="@+id/navigation"
        app:layout_constraintEnd_toEndOf="@+id/create_invoice_cardview"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/capture_receipt_cardview"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        app:layout_constraintVertical_weight="0">
    </android.support.v7.widget.CardView>

1 Ответ

0 голосов
/ 07 июля 2019

То, что вы испытываете, связано с различием в представлении о разрешении экрана и плотности пикселей.Как уже упоминалось здесь :

Плотность пикселей - это количество пикселей в физической области экрана, которое называется dpi (точек на дюйм).Это отличается от разрешения, которое является общим количеством пикселей на экране.

В вашем случае плотность пикселей выше, чем у Nexus 5.

.покажите разницу, возьмите формулу :

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));     
}

Учитывая ваше android:layout_marginBottom="68dp"

Количество пикселей в вашем телефоне Nexus 5:

102 = 68 * (240 / 160); // I am assuming the DPI is HIGH

Количество пикселей в вашем телефоне Pixel:

136 = 68 * (320 / 160); // I am assuming the DPI is XHIGH   

Понимание этой концепции может иметь большое значение в вашей карьере программиста на Android.

...