从左到右的动画滑动面板?

问题描述:

我试图滑动面板添加到我的布局类似于滑动抽屉,但它会放在我的主要布局的左边,而不是覆盖它。在我的布局的左上角有一个小按钮,当我点击它时展开/折叠面板。当它展开/折叠,我希望动画是光滑的,使得邻近于它的视图将移动为好。这是我试过的代码。该小组停止第一展开/折叠后的工作:从左到右的动画滑动面板?

public Animation expandHiddenPanel(final View v, final boolean expand) { 
    panelExpanded = expand; 
    v.measure(MeasureSpec.makeMeasureSpec(200, MeasureSpec.AT_MOST), 
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

    final int initialWidth = v.getMeasuredWidth(); 
    Log.i("test", "initialWidth = " + initialWidth); 

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

    Animation a = new Animation() { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) { 
      int newWidth; 

      if (expand) { 
       newWidth = (int)(initialWidth * interpolatedTime); 
       Log.i("test", "new Width = " + newWidth); 
      } 
      else { 
       newWidth = (int)(initialWidth * (1 - interpolatedTime)); 
       Log.i("test", "new Width = " + newWidth); 
      } 

      v.getLayoutParams().width = newWidth; 
      v.requestLayout();    
     } 

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

    a.setInterpolator(new AccelerateInterpolator()); 
    a.setDuration(2500); 
    v.startAnimation(a); 

    return a; 
} 

确保如果u要显示动画增长幅度则提到在XML文件中的布局特定的宽度和使用下面的代码进行展开和折叠动画宽度的条款。

//expand animation  
public static void expand(final View v) { 
     v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
     final int targtetWidth = v.getMeasuredWidth(); 
     Log.v("view width", "view expand width==>"+targtetWidth); 
     v.getLayoutParams().width = 0; 
     v.setVisibility(View.VISIBLE); 

     Animation a = new Animation() { 
      @Override 
      protected void applyTransformation(float interpolatedTime,Transformation t) { 
       v.getLayoutParams().width = interpolatedTime == 1 ? LayoutParams.WRAP_CONTENT: (int)(targtetWidth * interpolatedTime); 
       v.requestLayout(); 
      } 

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

     a.setDuration(100); 
     v.startAnimation(a); 
    } 

//collapse animation 
    public static void collapse(final View v) { 
     final int initialWidth = v.getMeasuredWidth(); 
     Log.v("initial width", "initial width==>"+initialWidth); 
     Animation a = new Animation() { 
      @Override 
      protected void applyTransformation(float interpolatedTime, 
        Transformation t) { 
       if (interpolatedTime == 1) { 
        Log.v("interpolated", "interpolated time is 1"); 
        v.setVisibility(View.GONE); 
       } else { 

        v.getLayoutParams().width = initialWidth - (int) (initialWidth * interpolatedTime); 
        Log.v("interpolated", "interpolated time is===>"+v.getLayoutParams().width); 
        v.requestLayout(); 
       } 
      } 

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

     // 1dp/ms 
     Log.v("duration", "duration for collapse==>"+((int)(initialWidth /v.getContext().getResources().getDisplayMetrics().density))); 
     a.setDuration((int) (initialWidth/v.getContext().getResources().getDisplayMetrics().density)); 
     v.startAnimation(a); 
    }