2012-09-08 44 views
2

我有一個圖像視圖作爲菜單。當用戶點擊它時,一個視圖組(包括5個其他圖像視圖)將從左向右滑動。當用戶再次點擊菜單時,從右向左查看組幻燈片。Android,如何爲視圖組設置動畫偵聽器?

我可以模擬這種行爲,但從右向左滑動後,我希望看不到視圖組,但視圖組將放在它的位置。我試圖使用LinearLayout.setVisibiliy(View.Invisible),但那時我看不到從右向左滑動的動畫。

這是我的代碼,任何建議,將不勝感激。

menu_open.xml

<layoutAnimation 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:delay="10%" 
    android:animation="@anim/slide_out" /> 

slide_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"> 

    <translate 
     android:fromXDelta="-100%p" 
     android:toXDelta="0" 
     android:duration="@android:integer/config_mediumAnimTime" /> 

    <alpha 
     android:fromAlpha="0.0" 
     android:toAlpha="1.0" 
     android:duration="@android:integer/config_mediumAnimTime" /> 
</set> 

menu_close.xml

<layoutAnimation 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:delay="10%" 
    android:animation="@anim/slide_in" /> 

slide_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <translate 
     android:fromXDelta="0%p" 
     android:toXDelta="-100%p" 
     android:duration="@android:integer/config_mediumAnimTime" /> 

    <alpha 
     android:fromAlpha="1.0" 
     android:toAlpha="0.0" 
     android:duration="@android:integer/config_mediumAnimTime" /> 
</set> 

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/ivMenu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:contentDescription="@string/CD" 
     android:src="@drawable/ic_menu_01" /> 

    <LinearLayout 
     android:id="@+id/linearLayout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_toRightOf="@+id/ivMenu" > 

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:contentDescription="@string/CD" 
      android:src="@drawable/ic_menu_03" /> 

     <ImageView 
      android:id="@+id/imageView2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:contentDescription="@string/CD" 
      android:src="@drawable/ic_menu_04" /> 

     <ImageView 
      android:id="@+id/imageView3" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:contentDescription="@string/CD" 
      android:src="@drawable/ic_menu_05" /> 

     <ImageView 
      android:id="@+id/imageView4" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:contentDescription="@string/CD" 
      android:src="@drawable/ic_menu_06" /> 

     <ImageView 
      android:id="@+id/imageView5" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:contentDescription="@string/CD" 
      android:src="@drawable/ic_menu_07" /> 
    </LinearLayout> 

</RelativeLayout> 

MainActivity.java

public class MainActivity extends Activity { 

    private ImageView ivMenu; 
    private Animation animate; 
    private LinearLayout groupLayout; 
    private boolean menuState = false; 

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

     groupLayout = (LinearLayout) findViewById(R.id.linearLayout); 
     groupLayout.setVisibility(View.INVISIBLE); 

     ivMenu = (ImageView) findViewById(R.id.ivMenu); 
     animate = AnimationUtils.loadAnimation(this, R.anim.animate); 
     ivMenu.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ivMenu.startAnimation(animate); 
       runFadeOutAnimationOn(MainActivity.this, ivMenu); 

       if(!menuState) { 
        groupLayout.setVisibility(View.VISIBLE); 
        runExpandMenuAnimation(groupLayout, MainActivity.this); 
       } else { 
        runCollapseMenuAnimation(groupLayout, MainActivity.this); 
//     groupLayout.setVisibility(View.INVISIBLE); 
       } 

       menuState = !menuState; 
       Log.i("Menu state", "" + menuState); 
      } 
     }); 
    } 

    public static void runExpandMenuAnimation(ViewGroup panel, Context ctx) { 
     LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(ctx, R.anim.menu_open); 
     panel.setLayoutAnimation(controller); 
    } 

    public static void runCollapseMenuAnimation(ViewGroup panel, Context ctx) { 
     LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(ctx, R.anim.menu_close); 
     panel.setLayoutAnimation(controller); 
    } 

    public static Animation runFadeOutAnimationOn(Activity ctx, View target) { 
      Animation animation = AnimationUtils.loadAnimation(ctx, android.R.anim.fade_out); 
      target.startAnimation(animation); 

      return animation; 
    } 
} 

enter image description here

回答

5

最後我找到了解決辦法。在這種情況下,我們應該使用aViewGroup.setLayoutAnimationListener(new AnimationListener()...)並覆蓋其方法。

所以我說:

groupLayout.setLayoutAnimationListener(new AnimationListener() { 

      @Override 
      public void onAnimationStart(Animation animation) {} 

      @Override 
      public void onAnimationRepeat(Animation animation) {} 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       if(menuState) 
        groupLayout.setVisibility(View.INVISIBLE); 

       menuState = !menuState; 
       Log.i("Menu state", "" + menuState); 
      } 
     }); 
相關問題