android: изменение размера текста в MotionLayout

Я собираюсь анимировать изменение размера текста с помощью MotionLayout.

Я делаю следующее для начального состояния

<CustomAttribute
    motion:attributeName="textSize"
    motion:customDimension="16sp" />

И следующее для конечного состояния

<CustomAttribute
    motion:attributeName="textSize"
    motion:customDimension="14sp" />

В результате похоже, что размер на самом деле меняется, но он намного больше, чем 14–16 ст.

Итак, как правильно изменить размер текста?


person Artyom    schedule 14.11.2019    source источник
comment
Попробуйте следующее: stackoverflow.com/questions/53603009/   -  person Rahul Khatri    schedule 14.11.2019


Ответы (5)


Попробуй это

<CustomAttribute
    motion:attributeName="textSize"
    motion:customFloatValue="14" />
person Sk Suraj    schedule 14.11.2019
comment
Будет ли это размер в sp, а не в физических пикселях? - person Artyom; 14.11.2019
comment
Извините, если вы используете это, вы не можете передавать значения в sp или pixel, у вас есть передаваемые значения в float. - person Sk Suraj; 14.11.2019

Попробуйте анимировать размер шрифта с помощью атрибута scale, так как это тип Double вместо textSize (Integer). Анимация будет чище, потому что двойное масштабирование более плавное.

<ConstraintSet 
        android:id="@id/start">
    <Constraint
        android:id="@id/element"   
        android:scaleX="1.0"
        android:scaleY="1.0"/>
</ConstraintSet>

<ConstraintSet
        android:id="@id/end">
    <Constraint
        android:id="@id/element"   
        android:scaleX="0.5"
        android:scaleY="0.5"/>
</ConstraintSet>
person Irwin Nawrocki    schedule 26.04.2020
comment
Это решение намного надежнее, чем анимация textSize. Прежде всего, значения размера текста, установленные с помощью setTextSize, не совпадают со значениями, установленными с помощью android:textSize. Во-вторых, установив android:transformPivotX и android:transformPivotY, вы можете разместить точку масштабирования текста там, где вам это нужно. - person Slav; 18.11.2020

Приведенный выше ответ правильный. Поскольку это CustomAttribute со значением customFloatValue, вы должны передать значение с плавающей запятой, а не масштабируемое измерение в пикселях.

Однако настраиваемый атрибут textSize при использовании в TextView просто вызывает setTextSize, который, как вы можете видеть, здесь интерпретирует данное значение с плавающей запятой как масштабируемый тип, поэтому оно автоматически установит sp! Тада!

person kjanderson2    schedule 30.12.2019

Используйте «motion: customDimension» для изменения textSize. Ниже находится файл scene.xml.

  <?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@+id/start"
        motion:duration="2000">
        <OnSwipe
            motion:dragDirection="dragDown"
            motion:moveWhenScrollAtTop="true"
            motion:touchAnchorSide="bottom"
            motion:touchRegionId="@+id/ivExpand" />
    </Transition>

    <ConstraintSet android:id="@+id/start">

    <Constraint
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <CustomAttribute
                motion:attributeName="textSize"
                motion:customDimension="10sp" />

        </Constraint>

 </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
 <Constraint
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <CustomAttribute
                motion:attributeName="textSize"
                motion:customDimension="5sp" />

        </Constraint>
    </ConstraintSet>

Добавьте scene.xml (файл описания сцены) в mainActivity.xml.

<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
            <?xml version="1.0" encoding="utf-8"?>
    <MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:motion="http://schemas.android.com/apk/res-auto">

 <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>
</<androidx.constraintlayout.motion.widget.MotionLayout>
person Chirag Prajapati    schedule 18.02.2020

Я боролся с тем же самым, и мне удалось заставить это работать. Если вы используете редактор движения, скорее всего, начальный набор ограничений основан на макете. Вы должны вручную указать textSize в start constraintSet:

<ConstraintSet android:id="@+id/start">
    <Constraint
        android:id="@+id/tv_car_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="@id/iv_car"
        app:layout_constraintStart_toStartOf="parent">
        <CustomAttribute
            app:attributeName="textSize"
            app:customFloatValue="30"/>
    </Constraint>
</ConstraintSet>

И, наконец, для конечного набора ограничений:

<ConstraintSet android:id="@+id/end">
    <Constraint
        android:id="@+id/tv_car_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="@id/iv_car"
        app:layout_constraintStart_toStartOf="parent">
        <CustomAttribute
            app:attributeName="textSize"
            app:customFloatValue="15"/>
    </Constraint>
</ConstraintSet>
person Jim Ovejera    schedule 05.02.2021