在Android應(yīng)用開發(fā)中,滑動側(cè)邊欄經(jīng)常使用,今天我也試著自己進(jìn)行了一個簡單的實(shí)踐,雖然功能還不是很強(qiáng)大,但是可以保留下來為以后的開發(fā)使用,有需要時在進(jìn)行簡單的修改。實(shí)現(xiàn)一個滑動側(cè)邊欄思路也很簡單:
1.重寫一個SlidingMenu類繼承ViewGroup,病危該ViewGroup添加兩個子布局,分別為菜單和主界面顯示;
2.為了得到一個滑動的效果,選擇Scroller幫助我們實(shí)現(xiàn),配合ViewGroup下的computeScroll方法實(shí)現(xiàn)界面的更新;
3.利用一個boolean來記錄菜單是否打開,在菜單打開的狀態(tài)下向右滑動不會響應(yīng),在菜單關(guān)閉的情況向左滑動不會響應(yīng);
4.為了得到一個良好的交互,我們可以為界面滑動與手指移動的距離定義一個比例,如每次觸摸事件發(fā)生,界面移動的距離僅為手指移動距離的一半;
下面是兩張效果圖,界面沒怎么布局,大家湊合看
SlidingMenu實(shí)現(xiàn)代碼:
package com.example.test; import android.content.Context; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Scroller; public class SlidingMenu extends ViewGroup { private static final String TAG = SlidingMenu.class.getName(); private enum Scroll_State { Scroll_to_Open, Scroll_to_Close; } private Scroll_State state; private int mMostRecentX; private int downX; private boolean isOpen = false; private View menu; private View mainView; private Scroller mScroller; private OnSlidingMenuListener onSlidingMenuListener; public SlidingMenu(Context context, View main, View menu) { super(context); // TODO Auto-generated constructor stub setMainView(main); setMenu(menu); init(context); } private void init(Context context) { mScroller = new Scroller(context); } @Override protected void onLayout(boolean arg0, int l, int t, int r, int b) { // TODO Auto-generated method stub mainView.layout(l, t, r, b); menu.layout(-menu.getMeasuredWidth(), t, 0, b); } public void setMainView(View view) { mainView = view; addView(mainView); } public void setMenu(View view) { menu = view; addView(menu); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); mainView.measure(widthMeasureSpec, heightMeasureSpec); menu.measure(widthMeasureSpec - 150, heightMeasureSpec); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mMostRecentX = (int) event.getX(); downX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); int deltaX = mMostRecentX - moveX; // 如果在菜單打開時向右滑動及菜單關(guān)閉時向左滑動不會觸發(fā)Scroll事件 if ((!isOpen && (downX - moveX) < 0) || (isOpen && (downX - moveX) > 0)) { scrollBy(deltaX / 2, 0); } mMostRecentX = moveX; break; case MotionEvent.ACTION_UP: int upX = (int) event.getX(); int dx = upX - downX; if (!isOpen) {// 菜單關(guān)閉時 // 向右滑動超過menu一半寬度才會打開菜單 if (dx > menu.getMeasuredWidth() / 3) { state = Scroll_State.Scroll_to_Open; } else { state = Scroll_State.Scroll_to_Close; } } else {// 菜單打開時 // 當(dāng)按下時的觸摸點(diǎn)在menu區(qū)域時,只有向左滑動超過menu的一半,才會關(guān)閉 // 當(dāng)按下時的觸摸點(diǎn)在main區(qū)域時,會立即關(guān)閉 if (downX < menu.getMeasuredWidth()) { if (dx < -menu.getMeasuredWidth() / 3) { state = Scroll_State.Scroll_to_Close; } else { state = Scroll_State.Scroll_to_Open; } } else { state = Scroll_State.Scroll_to_Close; } } smoothScrollto(); break; default: break; } return true; } private void smoothScrollto() { int scrollx = getScrollX(); switch (state) { case Scroll_to_Close: mScroller.startScroll(scrollx, 0, -scrollx, 0, 500); if (onSlidingMenuListener != null && isOpen) { onSlidingMenuListener.close(); } isOpen = false; break; case Scroll_to_Open: mScroller.startScroll(scrollx, 0, -scrollx - menu.getMeasuredWidth(), 0, 500); if (onSlidingMenuListener != null && !isOpen) { onSlidingMenuListener.close(); } isOpen = true; break; default: break; } } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), 0); } invalidate(); } public void open() { state = Scroll_State.Scroll_to_Open; smoothScrollto(); } public void close() { state = Scroll_State.Scroll_to_Close; smoothScrollto(); } public boolean isOpen() { return isOpen; } public void setOnSlidingMenuListener( OnSlidingMenuListener onSlidingMenuListener) { this.onSlidingMenuListener = onSlidingMenuListener; } public interface OnSlidingMenuListener { public void open(); public void close(); } }
網(wǎng)站題目:Android實(shí)現(xiàn)滑動側(cè)邊欄-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.rwnh.cn/article22/joijc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、Google、網(wǎng)站設(shè)計公司、網(wǎng)站導(dǎo)航、全網(wǎng)營銷推廣、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容