0

使用ObjectAnimator旋轉LinearLayout。單擊該按鈕可使LinearLayout以360度(度)旋轉,底部爲透視。Android:旋轉LinearLayout留下痕跡

佈局完成旋轉後,它會留下「痕跡」/黑色標記,並且整個視圖看起來很奇怪。我如何避免這種情況發生?佈局完成360動畫之後,我希望視圖看起來像在開始時一樣(基本上乾淨)。 是否有一個view.refresh或更新命令我假設調用某處?

1)如何在最後看到清晰的視圖?

2)當圖像處於中間狀態時,爲什麼後部顯示爲黑色?我怎樣才能看到(即相對佈局的顏色)?

參數initialstate> IntermediateState> FinalState: enter image description here

MainActivity

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:****增加了一個處理程序,並註釋掉線程

回答

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 

     } 
    });