Как выровнять вид с помощью ConstraintLayout, который поддерживает все экраны разных размеров? - PullRequest
0 голосов
/ 09 марта 2019

Я использую ConstraintLayout для оформления экрана.

Вот мой код, который я пробовал до сих пор

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/home_bg">

    <ImageView
        android:id="@+id/topImage"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_marginTop="20dp"
        android:contentDescription="@string/app_name"
        android:src="@drawable/splash_heading"
        app:layout_constraintStart_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvAllOverResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:text="@string/allover_result"
        android:textColor="@color/colorBlue"
        android:textSize="20sp"
        android:textStyle="bold"
        ads:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/topImage" />

    <android.support.v7.widget.CardView
        android:id="@+id/firstCardView"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="2dp"
        ads:cardElevation="5dp"
        app:layout_constraintBottom_toBottomOf="@+id/tvVs"
        app:layout_constraintEnd_toStartOf="@+id/tvVs"
        app:layout_constraintTop_toTopOf="@+id/tvVs">


        <abak.tr.com.boxedverticalseekbar.BoxedVertical
            android:id="@+id/firstSeekBar"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:layout_gravity="center"
            app:backgroundColor="@android:color/white"
            app:defaultImage="@drawable/ic_play"
            app:imageEnabled="true"
            app:max="100"
            app:maxImage="@drawable/ic_play"
            app:minImage="@drawable/ic_play"
            app:progressColor="@color/colorGreen"
            app:textEnabled="false"
            app:touchDisabled="false" />

    </android.support.v7.widget.CardView>


    <TextView
        android:id="@+id/tvOneScore"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Streak"
        android:textColor="@color/colorBlue"
        android:textSize="12sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="@+id/firstCardView"
        app:layout_constraintStart_toStartOf="@+id/firstCardView"
        app:layout_constraintTop_toBottomOf="@+id/firstCardView" />


    <TextView
        android:id="@+id/tvVs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="V/S"
        android:textColor="@color/colorBlue"
        android:textSize="40sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <android.support.v7.widget.CardView
        android:id="@+id/secondCardView"
        android:layout_width="60dp"
        android:layout_height="250dp"
        android:layout_marginStart="10dp"
        app:cardElevation="5dp"
        app:layout_constraintBottom_toBottomOf="@+id/tvVs"
        app:layout_constraintStart_toEndOf="@+id/tvVs"
        app:layout_constraintTop_toTopOf="@+id/tvVs">

        <abak.tr.com.boxedverticalseekbar.BoxedVertical
            android:id="@+id/secondSeekBar"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:layout_gravity="center"
            ads:points="50"
            app:backgroundColor="@android:color/white"
            app:defaultImage="@drawable/ic_play"
            app:imageEnabled="true"
            app:max="100"
            app:maxImage="@drawable/ic_play"
            app:minImage="@drawable/ic_play"
            app:progressColor="@color/colorGreen"
            app:textEnabled="false"
            app:touchDisabled="false" />

    </android.support.v7.widget.CardView>

    <TextView
        android:id="@+id/tvTwoScore"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Steps"
        android:textColor="@color/colorBlue"
        android:textSize="12sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="@+id/secondCardView"
        app:layout_constraintStart_toStartOf="@+id/secondCardView"
        app:layout_constraintTop_toBottomOf="@+id/secondCardView" />


    <TextView
        android:id="@+id/tvWin"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:gravity="center"
        android:padding="10dp"
        android:textColor="@color/colorBlue"
        android:text="@string/str_win"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvTwoScore" />

    <ImageView
        android:id="@+id/tvPlayGame"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:layout_marginBottom="40dp"
        android:scaleType="fitXY"
        android:src="@drawable/ic_play"
        app:backgroundTint="#0b961e"
        app:layout_constraintBottom_toBottomOf="@id/bottomLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvWin" />


    <RelativeLayout
        android:id="@+id/bottomLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:paddingTop="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <com.leinardi.android.speeddial.SpeedDialOverlayLayout
            android:id="@+id/speedDialOverlayLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#81000000"
            app:clickable_overlay="true"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        <com.leinardi.android.speeddial.SpeedDialOverlayLayout
            android:id="@+id/speedDialOverlayLayout2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#81000000"
            app:clickable_overlay="true"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />


        <com.leinardi.android.speeddial.SpeedDialView
            android:id="@+id/speedDial"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/mAdView"
            android:layout_alignParentEnd="true"
            ads:layout_constraintEnd_toEndOf="parent"
            ads:layout_constraintHorizontal_bias="0.5"
            app:backgroundTint="@android:color/white"
            app:layout_behavior="@string/speeddial_scrolling_view_snackbar_behavior"
            app:sdExpansionMode="top"
            app:sdMainFabAnimationRotateAngle="90"
            app:sdMainFabClosedBackgroundColor="@android:color/white"
            app:sdMainFabClosedSrc="@drawable/ic_settings"
            app:sdMainFabOpenedBackgroundColor="#4e4c4c"
            app:sdMainFabOpenedSrc="@drawable/ic_close"
            app:sdUseReverseAnimationOnClose="true" />

        <com.leinardi.android.speeddial.SpeedDialView
            android:id="@+id/langSpeedDial"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/mAdView"
            android:layout_alignParentStart="true"
            android:layout_marginStart="8dp"
            ads:layout_constraintHorizontal_bias="0.5"
            ads:layout_constraintStart_toStartOf="parent"
            app:layout_behavior="@string/speeddial_scrolling_view_snackbar_behavior"
            app:sdExpansionMode="top"
            app:sdMainFabAnimationRotateAngle="90"
            app:sdMainFabClosedBackgroundColor="@android:color/white"
            app:sdMainFabClosedSrc="@drawable/ic_language"
            app:sdMainFabOpenedBackgroundColor="#4e4c4c"
            app:sdMainFabOpenedSrc="@drawable/ic_close"
            app:sdUseReverseAnimationOnClose="true" />


        <com.google.android.gms.ads.AdView
            android:id="@+id/mAdView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            ads:adSize="BANNER"
            ads:adUnitId="@string/bannerID" />

    </RelativeLayout>


</android.support.constraint.ConstraintLayout>

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

  • на маленьком экране imageview прячется за addview
  • Когда я прячу addview нижнюю часть SpeedDialView, не регулирую
  • Как ограничить SpeedDialView тем, что когда я прячу addview, он будет работать так же, как когда addview виден

выпуск скриншота

- проблема на большом экране

- проблема на маленьком экране

Я проверил ТАК сообщение

Пожалуйста, проверьте ниже экран мой ожидаемый вывод

мой ожидаемый результат

Может кто-нибудь помочь мне создать этот макет, используя макет ConstraintLayout

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Заранее спасибо. Ваши усилия будут оценены.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Мне очень нравится этот вопрос, потому что вы действительно проявили свои усилия, и вам легко помочь, когда вы так ясны со своим намерением.

Сейчас - когда вы используете ConstraintLayout и хотите, чтобы изображения реагировали на то, что не должно делать - это придайте вашим просмотрам фиксированный размер - потому что разные телефоны имеют разный размер экрана и с фиксированным размером макета просто не реагирует на все экраны.

Вы можете использовать инструкции следующим образом:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/frameLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragments.MenusDesign.ExpandableCategoriesMenu.ExpandableCategoriesMenu">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="Dummy text"
        app:layout_constraintBottom_toTopOf="@+id/guideline2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="V/s"
        app:layout_constraintBottom_toTopOf="@+id/guideline3"
        app:layout_constraintEnd_toStartOf="@+id/button7"
        app:layout_constraintStart_toEndOf="@+id/button5"
        app:layout_constraintTop_toTopOf="@+id/guideline2" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="streak"
        app:layout_constraintBottom_toTopOf="@+id/textView8"
        app:layout_constraintEnd_toStartOf="@+id/textView10"
        app:layout_constraintStart_toStartOf="@+id/guideline5"
        app:layout_constraintTop_toTopOf="@+id/guideline2" />

    <Button
        android:id="@+id/button7"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="steps"
        app:layout_constraintBottom_toTopOf="@+id/textView9"
        app:layout_constraintEnd_toStartOf="@+id/guideline4"
        app:layout_constraintStart_toEndOf="@+id/textView10"
        app:layout_constraintTop_toTopOf="@+id/guideline2" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="@+id/button3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/button3" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="setings"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline4"
        app:layout_constraintTop_toTopOf="@+id/guideline3" />

    <Button
        android:id="@+id/button4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="16dp"
        android:text="Ad"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guideline4"
        app:layout_constraintStart_toStartOf="@+id/guideline5" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.2" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.6" />

    <TextView
        android:id="@+id/textView8"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/guideline3"
        app:layout_constraintEnd_toEndOf="@+id/button5"
        app:layout_constraintStart_toStartOf="@+id/button5" />

    <TextView
        android:id="@+id/textView9"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/guideline3"
        app:layout_constraintEnd_toEndOf="@+id/button7"
        app:layout_constraintStart_toStartOf="@+id/button7" />

    <TextView
        android:id="@+id/textView10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Dummy text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline3" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.8" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.2" />

    <Button
        android:id="@+id/button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="Play"
        app:layout_constraintBottom_toTopOf="@+id/button4"
        app:layout_constraintEnd_toStartOf="@+id/button3"
        app:layout_constraintStart_toEndOf="@+id/button2"
        app:layout_constraintTop_toBottomOf="@+id/textView10" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/textView4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:src="@tools:sample/avatars[5]" />
</androidx.constraintlayout.widget.ConstraintLayout>

Итак ... что я действительно здесь сделал?

в основном - я использовал ориентиры на некотором проценте экрана (например, 1 ограничение на 20%, а другое на 30%). После этого я ограничил свои взгляды этими рекомендациями и, сделав это, смог смотреть с размером, который я хочу в некотором настоящем по отношению к экрану.

1 голос
/ 09 марта 2019

Вы можете поддерживать различные размеры экрана, используя Guidelines, который в основном является компонентом, который наследуется от android.view.View и специально создан для ограничения Имея это в виду, вы сможете использовать его атрибут процентов и вот фрагмент примера компонента

<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline8"
app:layout_constraintGuide_percent="0.9"
android:orientation="horizontal"/>

это означает, что на 90% экрана будет указатель, и вы можете установить для своего компонента ограничение сверху-вниз для этого указателя вместо кнопки, чтобы оно не имело странного поведения, а ограничение bottomToBottom было бы родитель, если вы хотите, чтобы он был прикреплен к нижней части экрана ... и т.д.

вот пример: вы обнаружите, что теперь у imageview нижний предел ограничен до 90% экрана, независимо от того, что вы делаете с textview, и то же самое для textview, так как его верх имеет 90% независимо от того, что вы делаете в viewview, а также закреплен за родителем. с его приложением: layout_constraintBottom_toBottomOf = "parent"

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_bg">

<android.support.constraint.Guideline
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/guideline8"
    app:layout_constraintGuide_percent="0.9"
    android:orientation="horizontal"/>

<ImageView
    android:id="@+id/topImage"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_marginTop="20dp"
    android:contentDescription="@string/app_name"
    android:src="@drawable/splash_heading"
    app:layout_constraintStart_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@+id/guideline8"/>

<TextView
    android:id="@+id/tvAllOverResult"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="10dp"
    android:text="@string/allover_result"
    android:textColor="@color/colorBlue"
    android:textSize="20sp"
    android:textStyle="bold"
    ads:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/guideline8"
    app:layout_constraintBottom_toBottomOf="parent"/>


</android.support.constraint.ConstraintLayout>
...