android一個向上滑動顯示菜單,向下滑動隱藏菜單實現
瀏覽器qq獵豹等,很多都是,向上滑動顯示搜索菜單,向下瀏覽網頁隱藏搜索菜單,而且非常平滑的效果,用Visistty.setVisisty(View....)一直達到我想要的效果。用改變view的位置,平移到屏幕顯示外面。并且帶有動畫效果來實現。貌似會更好點。直接看代碼。一部分代碼仿另一個開源項目基礎上修改而來的。
主要原理是檢查判定是否在滑動到屏幕的頂部或者底部,根據其頂部的話就,讓我們的內容view 偏移頂部高度為我們topview高度,否則view偏移量為0。并為其設置平移動畫效果。
public class ScrollViewActivity extends Activity { private PoppyViewHelper mPoppyViewHelper; private LayoutInflater layoutInflater; private NotifyingScrollView scrollView; private View poppyview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scrollview); layoutInflater=LayoutInflater.from(this); scrollView=(NotifyingScrollView)findViewById(R.id.scrollView); poppyview=layoutInflater.inflate(R.layout.poppyview, null);mPoppyViewHelper = new PoppyViewHelper(this, PoppyViewPosition.TOP); ViewGroup poppyView = mPoppyViewHelper.createPoppyViewOnScrollView(scrollView, poppyview); poppyView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(ScrollViewActivity.this, "Click me!", Toast.LENGTH_SHORT).show(); } }); }
}
public class PoppyViewHelper { public enum PoppyViewPosition { TOP, BOTTOM }; private static final int SCROLL_TO_TOP = - 1; private static final int SCROLL_TO_BOTTOM = 1; private static final int SCROLL_DIRECTION_CHANGE_THRESHOLD = 5; private Activity mActivity; private LayoutInflater mLayoutInflater; private View mPoppyView; private int mScrollDirection = 0; private int mPoppyViewHeight = - 1;
private PoppyViewPosition mPoppyViewPosition; public PoppyViewHelper(Activity activity, PoppyViewPosition position) { mActivity = activity; mLayoutInflater = LayoutInflater.from(activity); mPoppyViewPosition = position; } public PoppyViewHelper(Activity activity) { this(activity, PoppyViewPosition.BOTTOM); } private ViewGroup viewGroup; // for scrollview private NotifyingScrollView scrollView; public ViewGroup createPoppyViewOnScrollView(NotifyingScrollView scrollViewId, View poppyViewResId) { mPoppyView =poppyViewResId; scrollView = scrollViewId; initPoppyViewOnScrollView(); return viewGroup; } // for ListView public View createPoppyViewOnListView(int listViewId, int poppyViewResId, OnScrollListener onScrollListener) { final ListView listView = (ListView)mActivity.findViewById(listViewId); if(listView.getHeaderViewsCount() != 0) { throw new IllegalArgumentException("use createPoppyViewOnListView with headerResId parameter"); } if(listView.getFooterViewsCount() != 0) { throw new IllegalArgumentException("poppyview library doesn't support listview with footer"); } mPoppyView = mLayoutInflater.inflate(poppyViewResId, null); initPoppyViewOnListView(listView, onScrollListener); return mPoppyView; } public View createPoppyViewOnListView(int listViewId, int poppyViewResId) { return createPoppyViewOnListView(listViewId, poppyViewResId, null); } // common private void setPoppyViewOnView(View view) { LayoutParams lp = view.getLayoutParams(); ViewParent parent = view.getParent(); ViewGroup group = (ViewGroup)parent; int index = group.indexOfChild(view); final FrameLayout newContainer = new FrameLayout(mActivity); group.removeView(view); group.addView(newContainer, index, lp); newContainer.addView(view); final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layoutParams.gravity = mPoppyViewPosition == PoppyViewPosition.BOTTOM ? Gravity.BOTTOM : Gravity.TOP; newContainer.addView(mPoppyView, layoutParams); group.invalidate(); viewGroup=group; } private boolean isjixu=false; private void onScrollPositionChanged(int oldScrollPosition, int newScrollPosition) { int newScrollDirection; System.out.println(oldScrollPosition + " ->" + newScrollPosition); if(newScrollPosition < oldScrollPosition) { newScrollDirection = SCROLL_TO_TOP; isjixu=true; //gundong滾動dao到dingb頂部 } else { newScrollDirection = SCROLL_TO_BOTTOM; isjixu=false; } if(newScrollDirection != mScrollDirection) { mScrollDirection = newScrollDirection; translateYPoppyView(); } } private int translationY = 0; private boolean isdingbu=false; private void translateYPoppyView() { mPoppyView.post(new Runnable() { @Override public void run() { if(mPoppyViewHeight <= 0) { mPoppyViewHeight = mPoppyView.getHeight(); } switch (mPoppyViewPosition) { case BOTTOM: translationY = mScrollDirection == SCROLL_TO_TOP ? 0 : mPoppyViewHeight; break; case TOP: translationY = mScrollDirection == SCROLL_TO_TOP ? 0: -mPoppyViewHeight; isdingbu=true; break; } ViewPropertyAnimator.animate(mPoppyView).setDuration(300).translationY(translationY); } }); if(isdingbu){ scrollView.post(new Runnable() { @Override public void run() { 如果為頂部顯示就讓view平移Mpoppyviewhiegh高度 ViewPropertyAnimator.animate(scrollView).setDuration(300).translationY(mPoppyViewHeight); isdingbu=false; } }); }else{ scrollView.post(new Runnable() { @Override public void run() { 不然就讓他顯示在屏幕頂部 ViewPropertyAnimator.animate(scrollView).setDuration(300).translationY(0); } }); } } // for ScrollView private void initPoppyViewOnScrollView() { setPoppyViewOnView(scrollView); scrollView.setOnScrollChangedListener(new NotifyingScrollView.OnScrollChangedListener() { int mScrollPosition; public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { if(Math.abs(t - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) { onScrollPositionChanged(mScrollPosition, t); } mScrollPosition = t; } }); } // for ListView private void initPoppyViewOnListView(ListView listView, final OnScrollListener onScrollListener) { setPoppyViewOnView(listView); listView.setOnScrollListener(new OnScrollListener() { int mScrollPosition; @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(onScrollListener != null) { onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } View topChild = view.getChildAt(0); int newScrollPosition = 0; if(topChild == null) { newScrollPosition = 0; } else { newScrollPosition = - topChild.getTop() + view.getFirstVisiblePosition() * topChild.getHeight(); } if(Math.abs(newScrollPosition - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) { onScrollPositionChanged(mScrollPosition, newScrollPosition); } mScrollPosition = newScrollPosition; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(onScrollListener != null) { onScrollListener.onScrollStateChanged(view, scrollState); } } }); }
} </pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!