设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 418|回复: 4

Android进阶-实现侧滑菜单框架

[复制链接]
发表于 2014-1-22 15:51:35 | 显示全部楼层 |阅读模式
先来看下面的这张效果图:

上面这张效果图是百度影音的,现在在Android上很流行,最初是由facebook自己实现的,而后各大应用有跟风之势,那么这种侧滑效果是如何实现的呢?
网上现在这种侧滑菜单的例子很对,也有开源的框架sliderMenu,而且可以定义很多样式,但大部分例子,都只是实现了这种类似效果,没有实现一种可移植的框架,仅仅是单页面效果而已,而且集成起来复杂,鉴于此,我自己实现了一套侧滑菜单的框架:
1、最常用的支持左右策划
2、多个页面切换也好不费力,页面切换的逻辑已经实现好了,集成进来,只需要关注自己项目的业务逻辑
3、支持多个页面集成
4、支持退出业务逻辑

先上我自己实现的效果图:




下面 说一下实现原理:
     布局文件采用FrameLayout, 在一个FrameLayout下有二个子布局,一个是菜单,另一个是LeftSliderLayout,而LeftSliderLayout下面可以放二个子布局:第一个是阴影布局(左边阴影),第二个是要拖动的内容。,当向右拖动LeftSliderLayout时,就显示露出菜单布局。而向左拖动LeftSliderLayout时,就覆盖菜单布局。

   1.FrameLayout的布局文件local_media_fragment.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent" >

  5.     <include android:id="@+id/main_layout_below" layout="@layout/main_layout_below" />

  6.     <com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout
  7.         android:id="@+id/main_slider_layout"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent" >


  10.         <!-- Shadow Child -->
  11.         <ImageView
  12.                 android:layout_width="15px"
  13.                 android:layout_height="fill_parent"
  14.                 android:contentDescription="@null"
  15.                 android:scaleType="fitXY"
  16.                 android:src="@drawable/main_side_shadow" />

  17.         <!-- Main Child -->
  18.         <include android:id="@+id/main_slider_main" layout="@layout/local_media" />


  19.     </com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout>

  20. </FrameLayout>
复制代码

下面 说一下实现原理:
     布局文件采用FrameLayout, 在一个FrameLayout下有二个子布局,一个是菜单,另一个是LeftSliderLayout,而LeftSliderLayout下面可以放二个子布局:第一个是阴影布局(左边阴影),第二个是要拖动的内容。,当向右拖动LeftSliderLayout时,就显示露出菜单布局。而向左拖动LeftSliderLayout时,就覆盖菜单布局。

   1.FrameLayout的布局文件local_media_fragment.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent" >

  5.     <include android:id="@+id/main_layout_below" layout="@layout/main_layout_below" />

  6.     <com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout
  7.         android:id="@+id/main_slider_layout"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent" >


  10.         <!-- Shadow Child -->
  11.         <ImageView
  12.                 android:layout_width="15px"
  13.                 android:layout_height="fill_parent"
  14.                 android:contentDescription="@null"
  15.                 android:scaleType="fitXY"
  16.                 android:src="@drawable/main_side_shadow" />

  17.         <!-- Main Child -->
  18.         <include android:id="@+id/main_slider_main" layout="@layout/local_media" />


  19.     </com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout>

  20. </FrameLayout>
复制代码


上面 xml 中main_layout_below是对应的左边菜单Menu布局文件(这个布局文件是固定的),local_media是你要的拖动布局
2、LeftSliderLayout.java代码

来自圈子: Demo俱乐部
 楼主| 发表于 2014-1-22 15:52:40 | 显示全部楼层
  1. package com.zhaoxufeng.leftsliderlayout.lib;

  2. import android.content.Context;
  3. import android.graphics.Rect;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.view.MotionEvent;
  7. import android.view.VelocityTracker;
  8. import android.view.View;
  9. import android.view.ViewConfiguration;
  10. import android.view.ViewGroup;
  11. import android.widget.Scroller;

  12. public class LeftSliderLayout extends ViewGroup {

  13.     private static final String TAG = "LeftSliderLayout"  ;

  14.     private Scroller mScroller;
  15.     private VelocityTracker mVelocityTracker;


  16.     /**
  17.      * Constant value for touch state
  18.      * TOUCH_STATE_REST : no touch
  19.      * TOUCH_STATE_SCROLLING : scrolling
  20.      */
  21.     private static final int TOUCH_STATE_REST = 0;
  22.     private static final int TOUCH_STATE_SCROLLING = 1;
  23.     private int mTouchState = TOUCH_STATE_REST;
  24.    
  25.     /**
  26.      * Distance in pixels a touch can wander before we think the user is scrolling
  27.      */
  28.     private int mTouchSlop;
  29.    
  30.     /**
  31.      * Values for saving axis of the last touch event.
  32.      */
  33.     private float mLastMotionX;
  34.     private float mLastMotionY;
  35.    
  36.     /**
  37.      * Values for VelocityTracker to compute current velocity.
  38.      * VELOCITY_UNITS in dp
  39.      * mVelocityUnits in px
  40.      */
  41.     private static final int VELOCITY_UNITS = 1000;
  42.     private int mVelocityUnits;       
  43.    
  44.     /**
  45.      * The minimum velocity for determining the direction.
  46.      * MINOR_VELOCITY in dp
  47.      * mMinorVelocity in px
  48.      */
  49.     private static final float MINOR_VELOCITY = 150.0f;
  50.     private int mMinorVelocity;                                                               
  51.    
  52.     /**
  53.      * The width of Sliding distance from left.
  54.      * And it should be the same with the width of the View below SliderLayout in a FrameLayout.
  55.      * DOCK_WIDTH in dp
  56.      * mDockWidth in px
  57.      */
  58.     private static final float SLIDING_WIDTH = 270.0f;
  59.     private int mSlidingWidth;                                                                       
  60.    
  61.     /**
  62.      * The default values of shadow.
  63.      * VELOCITY_UNITS in dp
  64.      * mVelocityUnits in px
  65.      */
  66.     private static final float DEF_SHADOW_WIDTH = 10.0f;               
  67.     private int mDefShadowWidth;                                                               

  68.     /**
  69.      * Value for checking a touch event is completed.
  70.      */
  71.     private boolean mIsTouchEventDone = false;                               
  72.    
  73.     /**
  74.      * Value for checking slider is open.
  75.      */
  76.     private boolean mIsOpen = false;                                               
  77.    
  78.     /**
  79.      * Value for saving the last offset of scroller ’ x-axis.
  80.      */
  81.     private int mSaveScrollX = 0;                                                       
  82.    
  83.     /**
  84.      * Value for checking slider is allowed to slide.
  85.      */
  86.     private boolean mEnableSlide = true;                                       
  87.    
  88.     private View mMainChild = null;
  89.     private OnLeftSliderLayoutStateListener mListener = null;

  90.         /**
  91.          * Instantiates a new LeftSliderLayout.
  92.          *
  93.          * @param context the associated Context
  94.          * @param attrs AttributeSet
  95.          */
  96.     public LeftSliderLayout(Context context, AttributeSet attrs) {
  97.             this(context, attrs, 0);
  98.     }

  99.         /**
  100.          * Instantiates a new LeftSliderLayout.
  101.          *
  102.          * @param context the associated Context
  103.          * @param attrs AttributeSet
  104.          * @param defStyle Style
  105.          */
  106.     public LeftSliderLayout(Context context, AttributeSet attrs, int defStyle) {
  107.             super(context, attrs, defStyle);
  108.         mScroller = new Scroller(context);
  109.         mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
  110.         
  111.         /**
  112.          * Convert values in dp to values in px;
  113.          */
  114.         final float fDensity = getResources().getDisplayMetrics().density;
  115.         mVelocityUnits = (int) (VELOCITY_UNITS * fDensity + 0.5f);
  116.         mMinorVelocity = (int) (MINOR_VELOCITY * fDensity + 0.5f);
  117.         mSlidingWidth = (int) (SLIDING_WIDTH * fDensity + 0.5f);
  118.         mDefShadowWidth = (int) (DEF_SHADOW_WIDTH * fDensity + 0.5f);
  119.     }
  120.    
  121.     @Override
  122.         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  123.             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  124.            
  125.             // check Measure Mode is Exactly.
  126.             final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  127.         if (widthMode != MeasureSpec.EXACTLY) {
  128.             throw new IllegalStateException("LeftSliderLayout only canmCurScreen run at EXACTLY mode!");
  129.         }
  130.         final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
  131.         if (heightMode != MeasureSpec.EXACTLY) {
  132.                 throw new IllegalStateException("LeftSliderLayout only can run at EXACTLY mode!");
  133.         }

  134.         // measure child views
  135.         int nCount = getChildCount();
  136.         for (int i = 2; i < nCount; i++) {
  137.                 removeViewAt(i);
  138.         }
  139.         nCount = getChildCount();
  140.         if (nCount > 0) {
  141.                 if (nCount > 1) {
  142.                         mMainChild = getChildAt(1);
  143.                         getChildAt(0).measure(widthMeasureSpec, heightMeasureSpec);
  144.                         } else {
  145.                                 mMainChild = getChildAt(0);
  146.                         }
  147.                 mMainChild.measure(widthMeasureSpec, heightMeasureSpec);
  148.                 }
  149.         
  150.         // Set the scrolled position
  151.         scrollTo(mSaveScrollX, 0);
  152.     }
  153.    
  154.         @Override
  155.         protected void onLayout(boolean changed, int l, int t, int r, int b) {
  156.                 final int nCount = getChildCount();
  157.                 if (nCount <= 0) {
  158.                         return;
  159.                 }
  160.                
  161.                 // Set the size and position of Main Child
  162.                 if (mMainChild != null) {
  163.                         mMainChild.layout(
  164.                                 l,
  165.                                 t,
  166.                                 l + mMainChild.getMeasuredWidth(),
  167.                                 t + mMainChild.getMeasuredHeight());
  168.                 }
  169.                
  170.                 // Set the size and position of Shadow Child
  171.                 if (nCount > 1) {
  172.                         int nLeftChildWidth = 0;
  173.                         View leftChild = getChildAt(0);
  174.                         ViewGroup.LayoutParams layoutParams = leftChild.getLayoutParams();
  175.                         if (layoutParams.width == ViewGroup.LayoutParams.FILL_PARENT
  176.                                         || layoutParams.width == ViewGroup.LayoutParams.MATCH_PARENT) {
  177.                                 nLeftChildWidth = mDefShadowWidth;
  178.                         } else {
  179.                                 nLeftChildWidth = layoutParams.width;
  180.                         }
  181.                         leftChild.layout(
  182.                                         l - nLeftChildWidth,
  183.                                         t,
  184.                                         l,
  185.                                         t + leftChild.getMeasuredHeight());
  186.                 }
  187.         }
  188.        
  189.     @Override
  190.         public void computeScroll() {
  191.                 if (mScroller.computeScrollOffset()) {
  192.             Log.d(TAG,"computeScroll exeuted:" + "x:" + mScroller.getCurrX() + "Y:" + mScroller.getCurrY())  ;
  193.                         scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  194.                         postInvalidate();
  195.                 }
  196.     }

  197.     @Override
  198.         public boolean onTouchEvent(MotionEvent event) {
  199.            
  200.             int nCurScrollX = getScrollX();
  201.            
  202.             // check touch point is in the rectangle of Main Child
  203.             if (mMainChild != null
  204.                             && mTouchState != TOUCH_STATE_SCROLLING
  205.                             && mIsTouchEventDone) {
  206.                         Rect rect = new Rect();
  207.                         mMainChild.getHitRect(rect);
  208.                         if (!rect.contains((int)event.getX() + nCurScrollX, (int)event.getY())) {
  209.                                 return false;
  210.                         }
  211.                 }
  212.            
  213.             if (mVelocityTracker == null) {
  214.             mVelocityTracker = VelocityTracker.obtain();
  215.         }

  216.         mVelocityTracker.addMovement(event);
  217.         
  218.         final int action = event.getAction();
  219.         final float x = event.getX();
  220.         
  221.         switch (action) {
  222.         case MotionEvent.ACTION_DOWN: {
  223.                 if (!mScroller.isFinished()) {
  224.                         mScroller.abortAnimation();
  225.                 }
  226.                
  227.                 mIsTouchEventDone = false;
  228.             mLastMotionX = x;
  229.             break;
  230.         }

  231.         case MotionEvent.ACTION_MOVE: {
  232.                 // check slider is allowed to slide.
  233.                 if (!mEnableSlide) {
  234.                                 break;
  235.                         }
  236.                
  237.                 // compute the x-axis offset from last point to current point
  238.             int deltaX = (int) (mLastMotionX - x);
  239.             if (nCurScrollX + deltaX < getMinScrollX()) {
  240.                         deltaX = getMinScrollX() - nCurScrollX;
  241.                         mLastMotionX = mLastMotionX - deltaX;
  242.                         } else if (nCurScrollX + deltaX > getMaxScrollX()) {
  243.                         deltaX = getMaxScrollX() - nCurScrollX;
  244.                         mLastMotionX = mLastMotionX - deltaX;
  245.                         } else {
  246.                                 mLastMotionX = x;
  247.                         }
  248.                
  249.             // Move view to the current point
  250.                 if (deltaX != 0) {
  251.                         scrollBy(deltaX, 0);
  252.                         }
  253.                
  254.                 // Save the scrolled position
  255.                 mSaveScrollX = getScrollX();
  256.                 break;
  257.         }

  258.         case MotionEvent.ACTION_CANCEL:
  259.         case MotionEvent.ACTION_UP: {
  260.                
  261.                 // check slider is allowed to slide.
  262.                 if (!mEnableSlide) {
  263.                                 break;
  264.                         }
  265.                
  266.                 final VelocityTracker velocityTracker = mVelocityTracker;
  267.                 velocityTracker.computeCurrentVelocity(mVelocityUnits);
  268.                
  269.                 // Set open or close state, when get ACTION_UP or ACTION_CANCEL event.
  270.                 if (nCurScrollX < 0) {
  271.                         int velocityX = (int) velocityTracker.getXVelocity();
  272.                         if (velocityX > mMinorVelocity) {
  273.                             scrollByWithAnim(getMinScrollX() - nCurScrollX);
  274.                             setState(true);
  275.                     }
  276.                     else if (velocityX < -mMinorVelocity) {
  277.                             scrollByWithAnim(-nCurScrollX);
  278.                             setState(false);
  279.                     } else {
  280.                             if (nCurScrollX >= getMinScrollX() / 2) {
  281.                                     scrollByWithAnim(- nCurScrollX);
  282.                                                 setState(false);
  283.                                         } else {
  284.                                                 scrollByWithAnim(getMinScrollX() - nCurScrollX);
  285.                                     setState(true);
  286.                                         }
  287.                     }
  288.                         } else {
  289.                                 if (nCurScrollX > 0) {
  290.                                         scrollByWithAnim(-nCurScrollX);
  291.                                 }
  292.                                 setState(false);
  293.                         }
  294.                
  295.             if (mVelocityTracker != null) {
  296.                     mVelocityTracker.recycle();
  297.                     mVelocityTracker = null;
  298.             }

  299.             mTouchState = TOUCH_STATE_REST;
  300.             mIsTouchEventDone = true;
  301.             break;
  302.         }
  303.         
  304.         }
  305.         return true;
  306.     }

  307.    
复制代码


 楼主| 发表于 2014-1-22 15:54:25 | 显示全部楼层
  1. @Override
  2. public boolean onInterceptTouchEvent(MotionEvent ev) {

  3. final int action = ev.getAction();

  4. if (mListener != null && !mListener.OnLeftSliderLayoutInterceptTouch(ev)) {
  5. return false;
  6. }

  7. if ((action == MotionEvent.ACTION_MOVE)
  8. && (mTouchState != TOUCH_STATE_REST)) {
  9. return true;
  10. }

  11. final float x = ev.getX();
  12. final float y = ev.getY();
  13. switch (action) {
  14. case MotionEvent.ACTION_DOWN:
  15. mLastMotionX = x;
  16. mLastMotionY = y;
  17. mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;
  18. break;

  19. case MotionEvent.ACTION_MOVE:
  20. final int xDiff = (int) Math.abs(mLastMotionX - x);
  21. if (xDiff > mTouchSlop) {
  22. if (Math.abs(mLastMotionY - y) / Math.abs(mLastMotionX - x) < 1)
  23. mTouchState = TOUCH_STATE_SCROLLING;
  24. }
  25. break;

  26. case MotionEvent.ACTION_CANCEL:
  27. case MotionEvent.ACTION_UP:
  28. mTouchState = TOUCH_STATE_REST;
  29. break;
  30. }
  31. return mTouchState != TOUCH_STATE_REST;
  32. }

  33. /**
  34. * With the horizontal scroll of the animation
  35. *
  36. * @param nDx x-axis offset
  37. */
  38. void scrollByWithAnim(int nDx) {
  39. if (nDx == 0) {
  40. return;
  41. }

  42. Log.d(TAG,"scrollByWithAnim:" + "x:" + (getScrollX() + "Y:" + Math.abs(nDx))) ;
  43. mScroller.startScroll(getScrollX(), 0, nDx, 0,
  44. Math.abs(nDx));

  45. invalidate();
  46. }

  47. /**
  48. * Get distance of the maximum horizontal scroll
  49. *
  50. * @return distance in px
  51. */
  52. private int getMaxScrollX() {
  53. return 0;
  54. }

  55. /**
  56. * Get distance of the minimum horizontal scroll
  57. * @return distance in px
  58. */
  59. private int getMinScrollX() {
  60. return -mSlidingWidth;
  61. }


  62. /**
  63. * Open LeftSlideLayout
  64. */
  65. public void open() {
  66. Log.d(TAG,"scroll by width:" + (getMinScrollX() - getScrollX())) ;
  67. if (mEnableSlide) {
  68. Log.d(TAG,"scroll by width:" + (getMinScrollX() - getScrollX())) ;
  69. scrollByWithAnim(getMinScrollX() - getScrollX());
  70. setState(true);
  71. }
  72. }


  73. /**
  74. * Close LeftSlideLayout
  75. */
  76. public void close() {
  77. if (mEnableSlide) {
  78. scrollByWithAnim((-1) * getScrollX());
  79. setState(false);
  80. }
  81. }

  82. /**
  83. * Determine whether LeftSlideLayout is open
  84. *
  85. * @return true-open,false-close
  86. */
  87. public boolean isOpen() {
  88. return mIsOpen;
  89. }

  90. /**
  91. * Set state of LeftSliderLayout
  92. *
  93. * @param bIsOpen the new state
  94. */
  95. private void setState(boolean bIsOpen) {
  96. boolean bStateChanged = false;
  97. if (mIsOpen && !bIsOpen) {
  98. bStateChanged = true;
  99. } else if (!mIsOpen && bIsOpen) {
  100. bStateChanged = true;
  101. }

  102. mIsOpen = bIsOpen;

  103. if (bIsOpen) {
  104. mSaveScrollX = getMaxScrollX();
  105. } else {
  106. mSaveScrollX = 0;
  107. }

  108. if (bStateChanged && mListener != null) {
  109. mListener.OnLeftSliderLayoutStateChanged(bIsOpen);
  110. }
  111. }

  112. /**
  113. * enable slide action of LeftSliderLayout
  114. *
  115. * @param bEnable
  116. */
  117. public void enableSlide(boolean bEnable) {
  118. mEnableSlide = bEnable;
  119. }

  120. /**
  121. * Set listener to LeftSliderLayout
  122. */
  123. public void setOnLeftSliderLayoutListener(OnLeftSliderLayoutStateListener listener) {
  124. mListener = listener;
  125. }

  126. /**
  127. * LeftSliderLayout Listener
  128. *
  129. */
  130. public interface OnLeftSliderLayoutStateListener {

  131. /**
  132. * Called when LeftSliderLayout’s state has been changed.
  133. *
  134. * @param bIsOpen the new state
  135. */
  136. public void OnLeftSliderLayoutStateChanged(boolean bIsOpen);

  137. /**
  138. * Called when LeftSliderLayout has got onInterceptTouchEvent.
  139. *
  140. * @param ev Touch Event
  141. * @return true - LeftSliderLayout need to manage the InterceptTouchEvent.
  142. * false - LeftSliderLayout don't need to manage the InterceptTouchEvent.
  143. */
  144. public boolean OnLeftSliderLayoutInterceptTouch(MotionEvent ev);
  145. }
  146. }
复制代码

LeftSliderLayout有一个Listener。它有二个函数,一个是LeftSliderLayout的打开与关闭的状态改变;另一个是InterceptTouchEvent的回调,主要解决的是在拖动内容中有要处理左右滑动的控件与LeftSliderLayout的左右滑动的事件有冲突,当它返回true时,LeftSliderLayout会处理左右滑动,当它返回false时,就不处理左右滑动的事件。为了实现侧滑菜单框架,故实现了一个BaseActivity,其他Activity只需要继承这个Activity就行,
3、BaseActivity.java代码


 楼主| 发表于 2014-1-22 15:55:06 | 显示全部楼层
本帖最后由 Test 于 2014-1-22 15:59 编辑
  1. package com.zhaoxufeng.leftsliderlayout.example;

  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.widget.*;
  9. import com.zhaoxufeng.leftsliderlayout.R;
  10. import com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout;

  11. import java.util.ArrayList;
  12. import java.util.List;

  13. /**
  14. * 基类Activity,SliderMenu的基础统一框架
  15. * User: zhiwen.nan
  16. * Date: 13-10-7
  17. * Time: 下午8:31
  18. *
  19. */
  20. public class BaseActivity extends Activity implements LeftSliderLayout.OnLeftSliderLayoutStateListener, View.OnClickListener {

  21.     private  LeftSliderLayout leftSliderLayout;
  22.     private ImageView mOpenButton;
  23.     private TextView mTitleText;
  24.     private ListView mListView;
  25.     private List<ListItem> mDataList;
  26.     private  long waitTime = 2000;
  27.     private  long touchTime = 0;
  28.     private static final  String TAG = "BaseActivity"  ;

  29.     public void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.     }

  32.     @Override
  33.     protected void onResume() {
  34.         super.onResume();
  35.         bindView();
  36.         initialDataList();
  37.         ListViewAdapter listViewAdapter = new ListViewAdapter(BaseActivity.this,mDataList) ;
  38.         mListView.setAdapter(listViewAdapter);
  39.         mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  40.             @Override
  41.             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  42.                 finish();
  43.                 switch (i)  {
  44.                     case 0:
  45.                         mTitleText.setText(getText(R.string.categ_local_video_list));
  46.                         Intent intent = new Intent(BaseActivity.this,LocalMediaActivity.class)  ;
  47.                         startActivity(intent);
  48.                         break;
  49.                     case 1:
  50.                         mTitleText.setText(getText(R.string.cate_leida));
  51.                         Intent radIntent = new Intent(BaseActivity.this,RadoActivity.class)  ;
  52.                         startActivity(radIntent);
  53.                         break;
  54.                     case 2:
  55.                         mTitleText.setText(getText(R.string.hot_viedo));
  56.                         Intent hotIntent = new Intent(BaseActivity.this,HotMediaListActivity.class)  ;
  57.                         startActivity(hotIntent);
  58.                         break;
  59.                     case 3:
  60.                         mTitleText.setText(getText(R.string.cate_favrouite_list));
  61.                         Intent collectIntent = new Intent(BaseActivity.this,CollectListActivity.class)  ;
  62.                         startActivity(collectIntent);
  63.                         break;
  64.                     default:
  65.                         leftSliderLayout.close();
  66.                         break;

  67.                 }
  68.             }
  69.         });
  70.     }

  71.     @Override
  72.     public void onClick(View view) {

  73.     }

  74.     @Override
  75.     public void OnLeftSliderLayoutStateChanged(boolean bIsOpen) {

  76.         if (bIsOpen) {
  77. //            Toast.makeText(this, "LeftSliderLayout is open!", Toast.LENGTH_SHORT).show();
  78.             Log.d(TAG," leftsilder is open")  ;
  79.         } else {
  80.            // Toast.makeText(this, "LeftSliderLayout is close!", Toast.LENGTH_SHORT).show();
  81.             Log.d(TAG," leftsilder is close")  ;
  82.         }

  83.     }

  84.     @Override
  85.     public boolean OnLeftSliderLayoutInterceptTouch(MotionEvent ev) {

  86.         return false;
  87.     }

  88.     private  void initialDataList(){
  89.         mDataList = new ArrayList<ListItem>() ;
  90.         for (int i = 0; i<= 3; i ++)       {
  91.             ListItem listItem = new ListItem();
  92.             listItem.setImageType(i);
  93.             mDataList.add(listItem);

  94.         }
  95.     }

  96.     private  void bindView(){
  97.         leftSliderLayout = (LeftSliderLayout) findViewById(R.id.main_slider_layout);
  98.         leftSliderLayout.setOnLeftSliderLayoutListener(this);
  99.         mOpenButton = (ImageView)findViewById(R.id.openButton) ;
  100.         mTitleText = (TextView)findViewById(R.id.titleText) ;
  101.         mListView = (ListView)findViewById(R.id.listTab)  ;

  102.         mOpenButton.setOnClickListener(new View.OnClickListener() {
  103.             @Override
  104.             public void onClick(View view) {
  105.                 if(leftSliderLayout.isOpen()) {
  106.                     leftSliderLayout.close();
  107.                 } else {
  108.                     leftSliderLayout.open();
  109.                 }

  110.             }
  111.         });

  112.     }

  113.     public  void openLeftSlider(boolean isToOpen){
  114.         if(isToOpen)    {
  115.             leftSliderLayout.open();
  116.         }else {
  117.             leftSliderLayout.close();
  118.         }

  119.     }


  120.     public  void enableSlider(boolean isEnable)    {
  121.          if(isEnable)  {
  122.               leftSliderLayout.enableSlide(true);
  123.          } else {
  124.              leftSliderLayout.enableSlide(false);
  125.          }
  126.     }

  127.     @Override
  128.     public void onBackPressed() {
  129.         if(!leftSliderLayout.isOpen())   {
  130.             leftSliderLayout.open();
  131.         } else {
  132.             long currentTime = System.currentTimeMillis();
  133.             if((currentTime-touchTime)>=waitTime) {
  134.                 Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
  135.                 touchTime = currentTime;
  136.             }else {
  137.                 finish();
  138.                 //todo
  139.                 //退出业务逻辑 ,根据项目需求来写
  140.             }
  141.         }

  142.     }
  143. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2014-1-22 15:58:00 | 显示全部楼层
关于左侧菜单的业务逻辑都在BaseActivity里处理,另外返回的逻辑也在里面处理,顶部统一的导航栏打开菜单栏业务逻辑,还有左侧菜单跳转的业务逻辑

4、LocalMediaActivity.java
  1. package com.zhaoxufeng.leftsliderlayout.example;

  2. import android.app.Activity;
  3. import android.database.Cursor;
  4. import android.os.Bundle;
  5. import android.provider.Contacts;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.*;
  10. import com.zhaoxufeng.leftsliderlayout.R;
  11. import com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout;
  12. import com.zhaoxufeng.leftsliderlayout.lib.LeftSliderLayout.OnLeftSliderLayoutStateListener;

  13. import java.util.ArrayList;
  14. import java.util.List;

  15. /**
  16. * @author zhiwen.nan
  17. * @since 1.0
  18. * 本地视频界面
  19. */
  20. public class LocalMediaActivity extends BaseActivity {

  21.     private ListView mListView;
  22.     private TextView mTitleText;

  23.     @Override
  24.     public void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.local_media_fragment);

  27.         mListView = (ListView)findViewById(R.id.localVideoList) ;

  28.         mTitleText = (TextView)findViewById(R.id.titleText)  ;
  29.         mTitleText.setText("本地视频");

  30.         Cursor cursor = getContentResolver().query(Contacts.People.CONTENT_URI, null, null, null, null);
  31.         startManagingCursor(cursor);
  32.         ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,
  33.                 cursor,new String[]{Contacts.People.NAME},new int[]{android.R.id.text1});
  34.         mListView.setAdapter(listAdapter);

  35.     }


  36.    
  37.     @Override
  38.     public boolean OnLeftSliderLayoutInterceptTouch(MotionEvent ev) {

  39.         return true;
  40.     }


  41. }
复制代码


LocalMediaActivity是自己定义的Activty和业务逻辑界面,只需继承BaseActivity即可,其他Activity类似。
以上就是核心代码,源代码下载:
http://download.csdn.net/detail/nanzhiwen666/6394347


您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-12 18:54 , Processed in 0.014713 second(s), 17 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表