0

ObjectAnimator を使用して LinearLayout を回転させます。ボタンをクリックすると、LinearLayout が下部をピボットとして 360(度) 回転します。

レイアウトが回転を完了すると、「トレイル」/黒いマークが残り、全体のビューが奇妙に見えます。これが起こらないようにするにはどうすればよいですか?レイアウトが 360 アニメーションを完成させた後、ビューを最初と同じように見せたい (基本的にクリーン)。どこかに呼び出すと思われるview.refreshまたはupdateコマンドはありますか?

1) 最後にきれいなビューを表示するにはどうすればよいですか?

2)画像が中間状態のとき、背中の部分が黒く見えるのはなぜですか? それをどのように見えるようにしますか(つまり、相対的なレイアウトの色)?

初期状態>中間状態>最終状態: ここに画像の説明を入力

主な活動

Button bt1;

float pivotX=0f;
float pivotY=0f;

int a=0;

float width,height;

ViewGroup mContainer=null;

Thread t;

private Handler mHandler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bt1 = (Button) findViewById(R.id.button1);
    mContainer = (ViewGroup) findViewById(R.id.container);

    bt1.setOnClickListener(this);

            t=new Thread()
    {
        @Override
        public void run()
        {
            try {
                while(true)
                {
                    relativeLayout.postInvalidate();
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    };
}

@Override
public void onWindowFocusChanged(boolean hasFocus) 
{
  super.onWindowFocusChanged(hasFocus);

  //Here you can get the size!

    width = mContainer.getWidth();
    height = mContainer.getHeight();

    pivotX = mContainer.getPivotX()+width; 
    pivotY = mContainer.getPivotY()+height; 

    mContainer.setPivotX(pivotX);
    mContainer.setPivotY(pivotY);
}

private void rotate()
{
    a -=360;

    ObjectAnimator rotate = ObjectAnimator.ofFloat(mContainer, View.ROTATION_X,a);
    rotate.setDuration(2000);

    AnimatorSet aSet = new AnimatorSet();
    aSet.play(rotate);
    aSet.start();

    mHandler.post(new Runnable() 
    {
        @Override
        public void run() 
        {
            b+=1;
            relativeLayout.invalidate();
            relativeLayout.postInvalidate();
            bt1.setText(Integer.toString(b));
        }
    });

    rotate.addListener(new AnimatorListener() 
    {

        @Override
        public void onAnimationStart(Animator animation) {
            // TODO Auto-generated method stub
            //relativeLayout.invalidate();
            t.start();
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // TODO Auto-generated method stub
            //mContainer.invalidate();
            //relativeLayout.invalidate();
            try {
                t.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            // TODO Auto-generated method stub

        }
    });
}

@Override
public void onClick(View v) 
{
    switch(v.getId())
    {
    case R.id.button1:
        rotate();
        break;

    }
}

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >

<LinearLayout
    android:id="@+id/container"
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="#140A1F"
    android:orientation="horizontal" >
</LinearLayout>

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/container"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="80dp"
    android:text="Rotate" />

</RelativeLayout>

編集:スレッドを追加しました。**Edit2:**** ハンドラーを追加し、スレッドをコメントアウトしました

4

1 に答える 1

0

これをコードに追加すると、アニメーションが完了するとビューが修正されますが、中間段階は同じように見えます。私がそれを理解したら、これを更新します。

        rotate.addListener(new AnimatorListener() 
    {

        @Override
        public void onAnimationStart(Animator animation) {
            // TODO Auto-generated method stub
            relativeLayout.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // TODO Auto-generated method stub
            //mContainer.invalidate();
            relativeLayout.invalidate();
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            // TODO Auto-generated method stub

        }
    });
于 2014-03-02T12:19:25.163 に答える