2014-03-07 90 views
7

我是Android動畫中的新成員,我的要求是在單擊該視圖時將視圖從一種佈局轉換爲單個xml文件中的佈局。使用翻譯動畫將視圖從一種佈局翻譯爲另一種

方案: 假設我點擊一個按鈕,現在在一個XML文件中的標頭的頂部,它應該移動/平移向下(它應該給一個衝擊,它位於其他佈局向下的頭)而且我希望當用戶再次點擊它時,它現在應該移動到原來的位置。

在這裏,我用我的XML文件解釋:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/app_bg" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/top" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/header" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" > 

     <Button 
      android:id="@+id/btnSearchHeader" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_centerInParent="true" 
      android:background="@drawable/search_icon" /> 


    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@color/app_transparent" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:layout_marginTop="10dp" 
     android:visibility="visible" > 

     <Button 
      android:id="@+id/btnMenu" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:layout_marginRight="5dp" 
      android:text="ABC" /> 

     <Button 
      android:id="@+id/btnSearchSelected" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toRightOf="@+id/btnMenu" 
      android:text="CDE" /> 
    </RelativeLayout> 
</LinearLayout> 

更精確的要求規範(請仔細閱讀:)

這裏我有兩個子內的佈局: -

頂部佈局 - id->頂部 底部佈局 - > - 底部

現在,一個視圖(按鈕 - > btnSearchHeader)位於我的頂層佈局中,我想將底層佈局設置爲相同的動畫效果(它應該給它帶來的影響,即將其翻譯爲底層佈局的翻譯動畫)該按鈕,當用戶點擊該按鈕,它應該再次翻譯回到其原始位置與翻譯動畫..即它應該顯示在頂部佈局

我不知道如何使用翻譯給這些影響動畫,但我只有一個基本的翻譯動畫知識,這對我來說不足以滿足我的要求。

任何類型的相關幫助是可觀的。

感謝

+0

什麼ü可以嘗試是,三個按鈕A(頂部),B, C(在底部),點擊A,它變得不可見,B變得可見,並且轉化爲C,它變得不可見,並且C變得可見,並且整體反過來 – user2609847

+0

也許你還沒有選中這個:http:// developer.android.com/training/animation/layout.html – clemp6r

+0

仍然不清楚你要求什麼。也許圖像會有所幫助。 –

回答

0

您是否嘗試過一些簡單的像下面?

final int topHeight = findViewById(R.id.top).getHeight();   
final int bottomHeight = findViewById(R.id.bottom).getHeight(); 
final View button = findViewById(R.id.btnSearchHeader);                    
final ObjectAnimator moveDownAnim = ObjectAnimator.ofFloat(button, "translationY", 0.F, topHeight + bottomHeight/2 - button.getHeight()/2); 
final ObjectAnimator moveUpAnim = ObjectAnimator.ofFloat(button, "translationY", topHeight + bottomHeight/2 - button.getHeight()/2, 0.F); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override     
    public void onClick(View v) {  
     if (0.F == v.getTranslationY()) 
      moveDownAnim.start(); 
     else      
      moveUpAnim.start(); 
    } 
}); 

如果你確實需要的按鈕來查看改變父母,你可以使用AnimatorListener在每個動畫的結尾來實現這一目標。喜歡的東西:(。而對於moveUpAnim類似監聽器)

moveDownAnim.addListener(new Animator.AnimatorListener() { 
    @Override           
    public void onAnimationEnd(Animator animation) { 
     ((ViewGroup)findViewById(R.id.top)).removeView(button); 
     ((ViewGroup)findViewById(R.id.bottom)).addView(button); 
     ((RelativeLayout)button.getLayoutParams()).addRule(RelativeLayout.CENTER_IN_PARENT); 
     button.setTranslationY(0.F);  // Since it is now positioned in the new layout, no need for translation. 
    }  
    @Override 
    public void onAnimationCancel(Animator animation) { /* NOP */ } 
    @Override 
    public void onAnimationRepeat(Animator animation) { /* NOP */ } 
    @Override 
    public void onAnimationStart(Animator animation) { /* NOP */ } 
}); 

不過,我懷疑你需要真正做到這一點,以達到你想要的視覺效果。但是如果您這樣做,那麼您可能還需要爲您的top視圖設置一個固定高度,而不是wrap_content。 (否則,如果在按鈕移動到底部視圖時發生佈局傳遞,則頂部佈局的高度可能會變爲0,如果沒有其他內容的話)。最簡單的方法是直接在xml佈局文件中執行此操作。但是,如果你想「做對飛」,你可以使用類似的onAnimationEnd()方法改變佈局的高度:

@Override           
public void onAnimationEnd(Animator animation) { 
    final ViewGroup topLayout = findViewById(R.id.top); 
    topLayout.getLayoutParams().height = topLayout.getHeight(); // Keep it the same height... 
    topLayout.removeView(button); 
    ((ViewGroup)findViewById(R.id.bottom)).addView(button); 
    ((RelativeLayout)button.getLayoutParams()).addRule(RelativeLayout.CENTER_IN_PARENT); 
    button.setTranslationY(0.F);  // Since it is now positioned in the new layout, no need for translation. 
}