2013-07-11 78 views
3

我已經嘗試了幾種解決方案,但需要幫助。下面的主題非常有用,但我認爲我做錯了什麼。如何爲兩者設置佈局高度/設置?假設我有2個LinearLayout用於內容和底部菜單。Android:上/下動畫滑動菜單

另外我不希望滑動後底部菜單消失。它應該在那裏不變。我正在使用片段進行菜單點擊/更改視圖。

Android: Expand/collapse animation

Android animate drop down/up view proper

enter image description here

+2

類似的東西? https://github.com/umano/AndroidSlidingUpPanel –

+0

@Waza_Be非常感謝!你救了我的思想:))我正在嘗試做這樣的事情幾天。我很喜歡它。 –

回答

2

至於我的評論似乎幫助,我將發佈的鏈接作爲一個答案:https://github.com/umano/AndroidSlidingUpPanel

完整的代碼不能在StackOverflow上粘貼,但整個圖書館將幫助你清楚你需要什麼。

2.2版本的Umano Android應用程序功能滑動 可拖動面板爲當前正在播放的文章。這種類型的 面板是在Google音樂應用和 Rdio應用中使用的常見模式。這是這個組件的開源實現,你可以在你的應用程序中免費使用這個組件。 Umano團隊< 3開放 來源。

<com.sothree.slidinguppaneldemo.SlidingUpPanelLayout 
    android:id="@+id/sliding_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:text="Main Content" 
     android:textSize="16sp" /> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center|top" 
     android:text="The Awesome Sliding Up Panel" 
     android:textSize="16sp" /> 
</com.sothree.slidinguppaneldemo.SlidingUpPanelLayout> 
1

您也可以嘗試ExpandablePanel發現它的地方,當我需要創造這樣的事情該自定義視圖。

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Point; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.Transformation; 
import android.widget.LinearLayout; 

public class ExpandablePanel extends LinearLayout { 

    private final int mHandleId; 
    private final int mContentId; 

    // Contains references to the handle and content views 
    private View mHandle; 
    private View mContent; 

    // Does the panel start expanded? 
    private boolean mExpanded = false; 
    // The height of the content when collapsed 
    private int mCollapsedHeight = 0; 
    // The full expanded height of the content (calculated) 
    private int mContentHeight = 0; 
    // How long the expand animation takes 
    private int mAnimationDuration = 0; 
    int height; 
    private Context context; 
    // Listener that gets fired onExpand and onCollapse 
    private OnExpandListener mListener; 

    public ExpandablePanel(Context context) { 
     this(context, null); 
     this.context = context; 

    } 

    public void setSize(int size) { 
     this.height = size; 
    } 

    /** 
    * The constructor simply validates the arguments being passed in and sets 
    * the global variables accordingly. Required attributes are 'handle' and 
    * 'content' 
    */ 
    public ExpandablePanel(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mListener = new DefaultOnExpandListener(); 

     TypedArray a = context.obtainStyledAttributes(attrs, 
       R.styleable.ExpandablePanel, 0, 0); 

     // How high the content should be in "collapsed" state 
     mCollapsedHeight = (int) a.getDimension(
       R.styleable.ExpandablePanel_collapsedHeight, 0.0f); 

     // How long the animation should take 
     mAnimationDuration = a.getInteger(
       R.styleable.ExpandablePanel_animationDuration, 500); 

     int handleId = a.getResourceId(R.styleable.ExpandablePanel_handle, 0); 

     if (handleId == 0) { 
      throw new IllegalArgumentException(
        "The handle attribute is required and must refer " 
          + "to a valid child."); 
     } 

     int contentId = a.getResourceId(R.styleable.ExpandablePanel_content, 0); 
     if (contentId == 0) { 
      throw new IllegalArgumentException(
        "The content attribute is required and must " 
          + "refer to a valid child."); 
     } 

     mHandleId = handleId; 
     mContentId = contentId; 

     a.recycle(); 
    } 

    // Some public setters for manipulating the 
    // ExpandablePanel programmatically 
    public void setOnExpandListener(OnExpandListener listener) { 
     mListener = listener; 
    } 

    public void setCollapsedHeight(int collapsedHeight) { 
     mCollapsedHeight = collapsedHeight; 
    } 

    public void setAnimationDuration(int animationDuration) { 
     mAnimationDuration = animationDuration; 
    } 

    /** 
    * This method gets called when the View is physically visible to the user 
    */ 
    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 

     mHandle = findViewById(mHandleId); 
     if (mHandle == null) { 
      throw new IllegalArgumentException(
        "The handle attribute is must refer to an" 
          + " existing child."); 
     } 

     mContent = findViewById(mContentId); 
     if (mContent == null) { 
      throw new IllegalArgumentException(
        "The content attribute must refer to an" 
          + " existing child."); 
     } 

     // This changes the height of the content such that it 
     // starts off collapsed 
     android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams(); 
     lp.height = mCollapsedHeight; 
     mContent.setLayoutParams(lp); 

     // Set the OnClickListener of the handle view 
     mHandle.setOnClickListener(new PanelToggler()); 
    } 

    /** 
    * This is where the magic happens for measuring the actual (un-expanded) 
    * height of the content. If the actual height is less than the 
    * collapsedHeight, the handle will be hidden. 
    */ 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // First, measure how high content wants to be 
     mContent.measure(widthMeasureSpec, MeasureSpec.UNSPECIFIED); 
     mContentHeight = mContent.getMeasuredHeight(); 



     Log.v("cHeight", mContentHeight + ""); 
     Log.v("cCollapseHeight", mCollapsedHeight + ""); 

     if (mContentHeight < mCollapsedHeight) { 
      mHandle.setVisibility(View.GONE); 
     } else { 
      mHandle.setVisibility(View.VISIBLE); 
     } 

     // Then let the usual thing happen 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

    /** 
    * This is the on click listener for the handle. It basically just creates a 
    * new animation instance and fires animation. 
    */ 
    private class PanelToggler implements OnClickListener { 
     public void onClick(View v) { 
      Animation a; 
      if (mExpanded) { 
       a = new ExpandAnimation(mContentHeight, mCollapsedHeight); 
       mListener.onCollapse(mHandle, mContent); 
      } else { 
       a = new ExpandAnimation(mCollapsedHeight, mContentHeight); 
       mListener.onExpand(mHandle, mContent); 
      } 
      a.setDuration(mAnimationDuration); 
      mContent.startAnimation(a); 
      mExpanded = !mExpanded; 
     } 
    } 

    /** 
    * This is a private animation class that handles the expand/collapse 
    * animations. It uses the animationDuration attribute for the length of 
    * time it takes. 
    */ 
    private class ExpandAnimation extends Animation { 
     private final int mStartHeight; 
     private final int mDeltaHeight; 

     public ExpandAnimation(int startHeight, int endHeight) { 
      mStartHeight = startHeight; 
      mDeltaHeight = endHeight - startHeight; 
     } 

     @Override 
     protected void applyTransformation(float interpolatedTime, 
       Transformation t) { 
      android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams(); 
      lp.height = (int) (mStartHeight + mDeltaHeight * interpolatedTime); 
      mContent.setLayoutParams(lp); 
     } 

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

    /** 
    * Simple OnExpandListener interface 
    */ 
    public interface OnExpandListener { 
     public void onExpand(View handle, View content); 

     public void onCollapse(View handle, View content); 
    } 

    private class DefaultOnExpandListener implements OnExpandListener { 
     public void onCollapse(View handle, View content) { 
     } 

     public void onExpand(View handle, View content) { 
     } 
    } 
} 
+0

嗨Vipul。你能分享一個例子來使用它嗎? –