Android动画仅在滚动父视图后启动

问题描述:

我试图在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> 

如果你还没有解决你的问题,或者如果有其他人遇到这个问题,这里是一个快速解决方案。在每次点击时使您的父视图无效(在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

“如果容器不滚动,动画从未开始” - >看一看我类似的问题,Scrollview doesn't swipe when it's too short to scroll。我发现在我的情况下,这是Android 2.1及以下版本中的一个接触错误。

我有一个看法,我宣布在我的布局结束,以保持其Z指数高于其兄弟姐妹。我必须触摸该页面才能使动画生效。

所以我通过Java再次设置Z指数,它工作。

view.bringToFront(); 

给任何可能再次遇到此问题的人。

如果您的视图,即您正在进行动画处理的视图处于不存在状态,那么在这种情况下,在开始动画之前,请将Visiblity设置为不可见。它会在第一时间工作。

来源here

嗯,我只用2行解决了这个问题。

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

好运