ホーム>source

MotionLayoutには2つのウィジェットがあり、1つはMotionLayoutで、2つ目はシーンファイルで説明されています。

レイアウトファイル:

<android.support.constraint.motion.MotionLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motion_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/scene_test">
    <View
        android:id="@+id/test_view_static"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:background="#ff0000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <View
        android:id="@+id/test_view_dynamic"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:background="#00ff11" />
</android.support.constraint.motion.MotionLayout>

シーンファイル:

<MotionScene xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Transition
        app:constraintSetStart="@+id/start"
        app:constraintSetEnd="@+id/end"/>
    <ConstraintSet android:id="@id/start">
        <Constraint
            android:id="@+id/test_view_dynamic"
            android:layout_width="40dp"
            android:layout_height="40dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </ConstraintSet>
    <ConstraintSet android:id="@id/end">
        <Constraint
            android:id="@id/test_view_dynamic"
            android:layout_width="40dp"
            android:layout_height="40dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" />
    </ConstraintSet>
</MotionScene>

その後、アクティビティで進行状況を設定します。

//onCreate, etc..
MotionLayout motionLayout = findViewById(R.id.motion_layout);
motionLayout.setProgress(0.5f);

動的ビューは正しい位置にありますが、静的ビューはすべての制約を失いますが、説明したようにシーンの影響を受けませんここに、シーンファイルに記述されているウィジェットのみが影響を受けます。

On the other hand, let’s say that you have a layout with a dozen widgets, but only one that you are animating — the ConstraintSet in MotionScene only need to contain the Constraint for that one widget.

ライブラリバージョン:

implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha2'

ここでのプロジェクト例:https://github.com/Anrimian/MotionLayoutIssueTest

更新: についてありがとうございましたケリアンの答え 私は解決策を見つけました:

public static void setProgress(MotionLayout motionLayout, float progress) {
    if (ViewCompat.isLaidOut(motionLayout)) {
        motionLayout.setProgress(progress);
    } else {
        motionLayout.post(() -> motionLayout.setProgress(progress));
    }
}

あなたの答え
  • 解決した方法 # 1

    これは奇妙です、レイアウトインスペクターは test_view_static を表示します  サイズ:幅= 0および高さ= 0。

    コードを少し更新しました:onCreateで test_view_static にクリックリスナーを追加します  進行を実行し、それはうまくいきました。

    私は別のことを試しました:onStart()メソッドに私は入れました:

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            MotionLayout motionLayout = findViewById(R.id.motion_layout);
            motionLayout.setProgress(0.5f);
        }
    }, 1000);
    
    

    そして、MotionLayoutは期待どおりに動作します。進行状況を更新する前にMotionLayoutが初期化されるのを待つ必要があるようなものです。

    実際、シーンで記述したものとは別の開始レイアウトが必要です。進行状況を更新せずにこれを行うことができます:

    <ConstraintSet android:id="@id/start">
        <Constraint
            android:id="@+id/test_view_dynamic"
            android:layout_width="40dp"
            android:layout_height="40dp"
            motion:layout_constraintRight_toRightOf="parent"
            motion:layout_constraintTop_toTopOf="parent"
            motion:layout_constraintBottom_toBottomOf="parent" />
    </ConstraintSet>
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ php - Laravel 56に見られない雄弁なモデルクラス