0

ConstraintLayout内のいくつかのビューを縦方向に移動する必要があります(スキップしないようにすることをお勧めします)。Android Viewは、ConstraintLayoutのトランジションを使用してVerticalBiasを

レイアウトは、いくつかのウィジェット(階層なし)を含む制約レイアウトであり、すべてが親に制約されています。

マイレイアウトファイル:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.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:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:orientation="vertical" 
android:id="@+id/myLayout" 
tools:context="com.example.quant.icarus.MainActivity"> 

<SurfaceView 
    android:id="@+id/surfaceView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="125dp" 
    android:layout_height="48dp" 
    android:alpha="0.5" 
    android:background="@drawable/button_border" 
    android:textColor="@color/ret_text" 
    app:layout_constraintVertical_bias="0.97" 
    app:layout_constraintHorizontal_bias="0.2" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:text="some text" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="125dp" 
    android:layout_height="48dp" 
    android:alpha="0.5" 
    app:layout_constraintVertical_bias="0.97" 
    app:layout_constraintHorizontal_bias="0.8" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:text="some text" /> 

<SeekBar 
    android:id="@+id/prog_bar" 
    android:layout_width="210dp" 
    android:layout_height="40dp" 
    app:layout_constraintHorizontal_bias="0.0" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:thumb="@drawable/seekbar_thumb" 
    android:max="100" 
    android:progress="0" 
    android:rotation="270" /> 

<TextView 
    android:id="@+id/prog_text" 
    android:layout_width="wrap_content" 
    android:layout_height="20dp" 
    app:layout_constraintVertical_bias="0.1" 
    app:layout_constraintLeft_toLeftOf="@+id/prog_bar" 
    app:layout_constraintRight_toRightOf="@+id/prog_bar" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:text="some text"/> 

<View 
    android:id="@+id/viewToMove1" 
    android:layout_width="40dp" 
    android:layout_height="1dp" 
    app:layout_constraintVertical_bias="0.2" 
    app:layout_constraintHorizontal_bias="0.34" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:background="@color/ret_text" /> 

<View 
    android:id="@+id/viewToMove2" 
    android:layout_width="40dp" 
    android:layout_height="1dp" 
    app:layout_constraintVertical_bias="0.35" 
    app:layout_constraintHorizontal_bias="0.34" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:background="@color/ret_text" /> 

<View 
    android:layout_width="1dp" 
    android:layout_height="30dp" 
    app:layout_constraintVertical_bias="0.35" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:background="@color/ret_text" /> 

<View 
    android:layout_width="1dp" 
    android:layout_height="30dp" 
    app:layout_constraintVertical_bias="0.65" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:background="@color/ret_text" /> 

</android.support.constraint.ConstraintLayout> 

2つのビューvewToMove1とviewToMove2をプログラム的に再配置されます。しかし、私が次のことを試すと2つの問題が生じます。 1)他の要素が画面上に正しく配置されていないが、ビューがスキップして移動する。私は移行をしようとした場合2)、移動するビューは全く移動しない(および他の要素がまだ間違って配置されている。

ここでは、関連するJavaコードです。

public class MainActivity extends AppCompatActivity { 

    ConstraintSet cSet = new ConstraintSet(); 
    ConstraintLayout cLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     //Thread which updates views. 
     TimerTask move_views = new TimerTask(){ 
      @Override 
      public void run() { 

       //some code here... 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         cLayout = (ConstraintLayout) findViewById(R.id.myLayout);//can this be put in onCreate or need to wait until render complete? 
         cSet.clone(cLayout); 

         //TransitionManager.beginDelayedTransition(cLayout);//adding this removes View movement. 

         cSet.setVerticalBias(R.id.viewToMove1,0.43f);//updated in the above thread. 
         cSet.setVerticalBias(R.id.viewToMove2,0.68f); 

         cSet.applyTo(cLayout); 

        } 
       }); 

      } 
     }; 

     Timer move_views_timer = new Timer(); 
     move_views_timer.scheduleAtFixedRate(move_views,10,10);//time in milliseconds 
    } 


} 

私は理解できません何故他のビューがこの操作の影響を受けているのか、そしてなぜその遷移がうまくいかないのかを調べてください。

私が持っていたアイデア:レイアウトのロードが完了するのを待つ必要がありますかどうすればいいですか?

答えて

0

ouトン独創的なアプローチの何が問題になっていたが、これは(クリーナーソリューションに確かにオープン)私の仕事:

Animation a = new Animation() { 
    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     ConstraintLayout.LayoutParams lparams = (ConstraintLayout.LayoutParams) myViewToMove1.getLayoutParams(); 
     lparams.verticalBias = 0.43f; 
     myViewToMove1.setLayoutParams(lparams); 
    } 
}; 
a.setDuration(8); // in ms 
a.setFillAfter(true); 
myViewToMove1.startAnimation(a); 

は、ビューごとに、新しいアニメーションを定義します。 PS:私はもはや見つけることができない別のSOの質問への答えに基づいてこれ。

+0

これは機能しますが、アニメーションが滑らかではありません –

1

だから、しばらくの間探した後、スムーズなトランジションとバイアスを変更できる答えが見つかりました。あなたの答えは部分的には正しいが100%正しくない。

最初に、2つの制約セットが必要な効果を持つものと、もう1つがそれらの効果をリセットする必要があります。

private ConstraintSet applyConstraint=new ConstraintSet(); 
private ConstraintSet resetConstraint = new ConstraintSet(); 

は、その後私はそのIDを見つけ、ConstraintSetに設定する意味ConstraintLayoutを設定し、これらのConstraintSet.Byの両方に制約ConstraintLayoutを設定する必要があります。

applyConstraint.clone(constraintLayout); 
resetConstraint.clone(constraintLayout); 

この例では、変更を指定する必要があります。これは設定の垂直バイアスです。

resetConstraintを使用すると、効果を元に戻すことができます。

public void resetEffect(){ 
    TransitionManager.beginDelayedTransition(constraintLayout); 
    resetConstraint.applyTo(constraintLayout); 
} 
関連する問題