2011-04-12 60 views
1

我試圖在android中創建可展開的菜單項,該菜單項看起來像一個按鈕,並且在按鈕單擊時,按鈕將隨着動畫展開向下。我爲展開的佈局設置了一個展開動畫,當我點擊到我的視圖時,我想展開該佈局,並且我遇到了動畫問題。當我點擊視圖時它不會立即開始,並且當我向下滾動或向上滾動視圖的容器時,它會開始。如果容器不可滾動,我的動畫永遠不會啓動。我究竟做錯了什麼?Android動畫僅在滾動父視圖後啓動

這裏是我的擴展方法的onClick方法和我的自定義視圖佈局的XML文件,該文件會做這樣的事情:

擴大:

public void expand(final View v) { 

     try { 
      Method m = v.getClass().getDeclaredMethod("onMeasure", int.class, int.class); 
      m.setAccessible(true); 
      m.invoke(v, 
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
        MeasureSpec.makeMeasureSpec(((View)v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST) 
      ); 
     } catch (Exception e) { 
      Log.e(TAG , "Caught an exception!", e); 
     } 
     final int initialHeight = v.getMeasuredHeight(); 
     Log.d("test", "initialHeight="+initialHeight); 

     v.getLayoutParams().height = 0; 
     v.setVisibility(View.VISIBLE); 


     Animation a = new Animation() { 

      @Override 
      protected void applyTransformation(float interpolatedTime, 
        Transformation t) { 
       final int newHeight = (int) (initialHeight * interpolatedTime); 
       v.getLayoutParams().height = newHeight; 
       v.requestLayout(); 
      } 

      @Override 
      public boolean willChangeBounds() { 
       return true; 
      } 

     }; 

     a.setDuration(1000); 
     a.setInterpolator(AnimationUtils.loadInterpolator(context, 
       android.R.anim.accelerate_decelerate_interpolator)); 
     v.startAnimation(a); 

     isExpanded = !isExpanded; 

    } 

的onClick:

public void onClick(View v) { 
    if (!isExpanded) { 
     expand(subButtonsLayout); 
    } else { 
     collapse(subButtonsLayout); 
    } 
} 

佈局xml自定義菜單項視圖:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:mtx="http://schemas.android.com/apk/res/com.matriksdata.trademaster" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:gravity="center_horizontal"> 
    <LinearLayout 
     android:id="@+id/xExpandableMenuButtonTop" 
     android:background="@drawable/opened_menu_bg_top" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </LinearLayout> 
    <LinearLayout 
     android:background="@drawable/opened_menu_bg_center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center_vertical"> 
     <LinearLayout 
      android:id="@+id/xExpandableMenuButtonTitle" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical"> 
      <TextView 
       android:id="@+id/xExpandableMenuButtonText" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:layout_marginLeft="10dip" 
       android:layout_marginRight="10dip" 
         android:textAppearance="@style/expandable_menu_button_textstyle" 
       android:text="Button Text"> 
      </TextView> 
      <ImageView 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="6" 
       android:src="@drawable/menu_button_down_arrow"> 
      </ImageView> 
     </LinearLayout> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/xExpandableMenuButtonSubButtonsLayout" 
     android:background="@drawable/opened_menu_bg_center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center_vertical" 
     android:visibility="gone"> 
     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical"> 

      <com.myproject.control.XSubMenuButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       mtx:XSubMenuButtonText="SubMenu1"> 
      </ccom.myproject.control.XSubMenuButton> 
      <com.myproject.control.XSubMenuButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       mtx:XSubMenuButtonText="SubMenu2"> 
      </com.myproject.control.XSubMenuButton> 
      <com.myproject.control.XSubMenuButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       mtx:XSubMenuButtonText="SubMenu3"> 
      </com.myproject.control.XSubMenuButton> 

     </LinearLayout> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/xExpandableMenuButtonBottom" 
     android:background="@drawable/opened_menu_bg_bottom" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </LinearLayout> 
</LinearLayout> 

回答

2

如果你還沒有解決你的問題,或者如果有其他人遇到這個問題,這裏是一個快速解決方案。在每次點擊時使您的父視圖無效(在onClick方法中)。無論父母是否可滾動,這都應該起作用。

也就是說,你的代碼將是這樣的:


public void onClick(View v) { 
    if (!isExpanded) { 
     expand(subButtonsLayout); 
    } else { 
     collapse(subButtonsLayout); 
    } 
    rootView.invalidate(); 
} 
+2

我打了這個問題,但這個修復遺憾的是沒有工作。 – 2012-12-11 05:06:05

+0

它爲我工作。 – 2014-01-09 12:54:55

+0

它爲我工作或者:(.. @LearnOpenGLES你有解決這個問題嗎? – 2014-03-30 14:39:24

1

我有一個看法,我宣佈在我的佈局結束,以保持其Z指數高於其兄弟姐妹。我必須觸摸該頁面才能使動畫生效。

所以我通過Java再次設置Z指數,它工作。

view.bringToFront(); 
1

給任何可能再次遇到此問題的人。

如果您的視圖,即您正在進行動畫處理的視圖處於不存在狀態,那麼在這種情況下,在開始動畫之前,請將Visiblity設置爲不可見。它會在第一時間工作。

來源here

1

嗯,我只用2行解決了這個問題。

scroll.setFocusableInTouchMode(true); 
scroll.requestFocus(); 
animation.Start();//Start anim 

好運