超酷的Android 侧滑(双向滑动菜单)效果_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 超酷的Android 侧滑(双向滑动菜单)效果

超酷的Android 侧滑(双向滑动菜单)效果

 2014/11/20 17:18:56  xiaochao1234  程序员俱乐部  我要评论(0)
  • 摘要:Java代码下面看看我们如何使用它,达到我们想要的效果publicclassMainActivityextendsActivity{/***双向滑动菜单布局*/privateSliderMenuSliderMenu;/***在内容布局上显示的ListView*/privateListViewcontentList;/***ListView的适配器*/privateArrayAdapter<String>contentListAdapter
  • 标签:android 滑动 菜单
Java代码 javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash">class%20MainActivity%20extends%20Activity%20%7B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%8F%8C%E5%90%91%E6%BB%91%E5%8A%A8%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20SliderMenu%20SliderMenu%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%9C%A8%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E4%B8%8A%E6%98%BE%E7%A4%BA%E7%9A%84ListView%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20ListView%20contentList%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20ListView%E7%9A%84%E9%80%82%E9%85%8D%E5%99%A8%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20ArrayAdapter%3CString%3E%20contentListAdapter%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E7%94%A8%E4%BA%8E%E5%A1%AB%E5%85%85contentListAdapter%E7%9A%84%E6%95%B0%E6%8D%AE%E6%BA%90%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20String%5B%5D%20contentItems%20%3D%20%7B%20%22Content%20Item%201%22%2C%20%22Content%20Item%202%22%2C%20%22Content%20Item%203%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content%20Item%204%22%2C%20%22Content%20Item%205%22%2C%20%22Content%20Item%206%22%2C%20%22Content%20Item%207%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content%20Item%208%22%2C%20%22Content%20Item%209%22%2C%20%22Content%20Item%2010%22%2C%20%22Content%20Item%2011%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content%20Item%2012%22%2C%20%22Content%20Item%2013%22%2C%20%22Content%20Item%2014%22%2C%20%22Content%20Item%2015%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content%20Item%2016%22%20%7D%3B%0A%0A%20%20%20%20%40Override%0A%20%20%20%20protected%20void%20onCreate(Bundle%20savedInstanceState)%20%7B%0A%20%20%20%20%20%20%20%20super.onCreate(savedInstanceState)%3B%0A%20%20%20%20%20%20%20%20setContentView(R.layout.main)%3B%0A%20%20%20%20%20%20%20%20SliderMenu%20%3D%20(SliderMenu)%20findViewById(R.id.bidir_sliding_layout)%3B%0A%20%20%20%20%20%20%20%20contentList%20%3D%20(ListView)%20findViewById(R.id.contentList)%3B%0A%20%20%20%20%20%20%20%20contentListAdapter%20%3D%20new%20ArrayAdapter%3CString%3E(this%2C%20android.R.layout.simple_list_item_1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentItems)%3B%0A%20%20%20%20%20%20%20%20contentList.setAdapter(contentListAdapter)%3B%0A%20%20%20%20%20%20%20%20SliderMenu.setScrollEvent(contentList)%3B%0A%20%20%20%20%7D%0A%0A%7D" />ways" /> 收藏代码
  1. 下面看看我们如何使用它,达到我们想要的效果  
  2. public class MainActivity extends Activity {  
  3.   
  4.     /** 
  5.      * 双向滑动菜单布局 
  6.      */  
  7.     private SliderMenu SliderMenu;  
  8.   
  9.     /** 
  10.      * 在内容布局上显示的ListView 
  11.      */  
  12.     private ListView contentList;  
  13.   
  14.     /** 
  15.      * ListView的适配器 
  16.      */  
  17.     private ArrayAdapter<String> contentListAdapter;  
  18.   
  19.     /** 
  20.      * 用于填充contentListAdapter的数据源。 
  21.      */  
  22.     private String[] contentItems = { "Content Item 1", "Content Item 2", "Content Item 3",  
  23.             "Content Item 4", "Content Item 5", "Content Item 6", "Content Item 7",  
  24.             "Content Item 8", "Content Item 9", "Content Item 10", "Content Item 11",  
  25.             "Content Item 12", "Content Item 13", "Content Item 14", "Content Item 15",  
  26.             "Content Item 16" };  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.         SliderMenu = (SliderMenu) findViewById(R.id.bidir_sliding_layout);  
  33.         contentList = (ListView) findViewById(R.id.contentList);  
  34.         contentListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,  
  35.                 contentItems);  
  36.         contentList.setAdapter(contentListAdapter);  
  37.         SliderMenu.setScrollEvent(contentList);  
  38.     }  
  39.   
  40. }  



Java代码 touchSlop%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%AE%B0%E5%BD%95%E6%89%8B%E6%8C%87%E6%8C%89%E4%B8%8B%E6%97%B6%E7%9A%84%E6%A8%AA%E5%9D%90%E6%A0%87%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20float%20xDown%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%AE%B0%E5%BD%95%E6%89%8B%E6%8C%87%E6%8C%89%E4%B8%8B%E6%97%B6%E7%9A%84%E7%BA%B5%E5%9D%90%E6%A0%87%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20float%20yDown%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%AE%B0%E5%BD%95%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E6%97%B6%E7%9A%84%E6%A8%AA%E5%9D%90%E6%A0%87%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20float%20xMove%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%AE%B0%E5%BD%95%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E6%97%B6%E7%9A%84%E7%BA%B5%E5%9D%90%E6%A0%87%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20float%20yMove%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%AE%B0%E5%BD%95%E6%89%8B%E6%9C%BA%E6%8A%AC%E8%B5%B7%E6%97%B6%E7%9A%84%E6%A8%AA%E5%9D%90%E6%A0%87%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20float%20xUp%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%BD%93%E5%89%8D%E6%98%AF%E6%98%BE%E7%A4%BA%E8%BF%98%E6%98%AF%E9%9A%90%E8%97%8F%E3%80%82%E5%8F%AA%E6%9C%89%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E6%88%96%E9%9A%90%E8%97%8F%E6%97%B6%E6%89%8D%E4%BC%9A%E6%9B%B4%E6%94%B9%E6%AD%A4%E5%80%BC%EF%BC%8C%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%AD%A4%E5%80%BC%E6%97%A0%E6%95%88%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20isLeftMenuVisible%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%BD%93%E5%89%8D%E6%98%AF%E6%98%BE%E7%A4%BA%E8%BF%98%E6%98%AF%E9%9A%90%E8%97%8F%E3%80%82%E5%8F%AA%E6%9C%89%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E6%88%96%E9%9A%90%E8%97%8F%E6%97%B6%E6%89%8D%E4%BC%9A%E6%9B%B4%E6%94%B9%E6%AD%A4%E5%80%BC%EF%BC%8C%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%AD%A4%E5%80%BC%E6%97%A0%E6%95%88%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20isRightMenuVisible%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E6%98%AF%E5%90%A6%E6%AD%A3%E5%9C%A8%E6%BB%91%E5%8A%A8%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20isSliding%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20View%20leftMenuLayout%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20View%20rightMenuLayout%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20View%20contentLayout%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E7%94%A8%E4%BA%8E%E7%9B%91%E5%90%AC%E6%BB%91%E5%8A%A8%E4%BA%8B%E4%BB%B6%E7%9A%84View%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20View%20mBindView%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E7%9A%84%E5%8F%82%E6%95%B0%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20MarginLayoutParams%20leftMenuLayoutParams%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E7%9A%84%E5%8F%82%E6%95%B0%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20MarginLayoutParams%20rightMenuLayoutParams%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E7%9A%84%E5%8F%82%E6%95%B0%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20RelativeLayout.LayoutParams%20contentLayoutParams%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E7%94%A8%E4%BA%8E%E8%AE%A1%E7%AE%97%E6%89%8B%E6%8C%87%E6%BB%91%E5%8A%A8%E7%9A%84%E9%80%9F%E5%BA%A6%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20VelocityTracker%20mVelocityTracker%3B%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E9%87%8D%E5%86%99BidirSlidingLayout%E7%9A%84%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%EF%BC%8C%E5%85%B6%E4%B8%AD%E8%8E%B7%E5%8F%96%E4%BA%86%E5%B1%8F%E5%B9%95%E7%9A%84%E5%AE%BD%E5%BA%A6%E5%92%8CtouchSlop%E7%9A%84%E5%80%BC%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40param%20context%0A%20%20%20%20%20*%20%40param%20attrs%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20SliderMenu(Context%20context%2C%20AttributeSet%20attrs)%20%7B%0A%20%20%20%20%20%20%20%20super(context%2C%20attrs)%3B%0A%20%20%20%20%20%20%20%20WindowManager%20wm%20%3D%20(WindowManager)%20context.getSystemService(Context.WINDOW_SERVICE)%3B%0A%20%20%20%20%20%20%20%20screenWidth%20%3D%20wm.getDefaultDisplay().getWidth()%3B%0A%20%20%20%20%20%20%20%20touchSlop%20%3D%20ViewConfiguration.get(context).getScaledTouchSlop()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E7%BB%91%E5%AE%9A%E7%9B%91%E5%90%AC%E6%BB%91%E5%8A%A8%E4%BA%8B%E4%BB%B6%E7%9A%84View%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40param%20bindView%0A%20%20%20%20%20*%20%20%20%20%20%20%20%20%20%20%20%20%E9%9C%80%E8%A6%81%E7%BB%91%E5%AE%9A%E7%9A%84View%E5%AF%B9%E8%B1%A1%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20void%20setScrollEvent(View%20bindView)%20%7B%0A%20%20%20%20%20%20%20%20mBindView%20%3D%20bindView%3B%0A%20%20%20%20%20%20%20%20mBindView.setOnTouchListener(this)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B0%86%E7%95%8C%E9%9D%A2%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E7%95%8C%E9%9D%A2%EF%BC%8C%E6%BB%9A%E5%8A%A8%E9%80%9F%E5%BA%A6%E8%AE%BE%E5%AE%9A%E4%B8%BA-30.%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20void%20scrollToLeftMenu()%20%7B%0A%20%20%20%20%20%20%20%20new%20LeftMenuScrollTask().execute(-50)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B0%86%E7%95%8C%E9%9D%A2%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E7%95%8C%E9%9D%A2%EF%BC%8C%E6%BB%9A%E5%8A%A8%E9%80%9F%E5%BA%A6%E8%AE%BE%E5%AE%9A%E4%B8%BA-30.%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20void%20scrollToRightMenu()%20%7B%0A%20%20%20%20%20%20%20%20new%20RightMenuScrollTask().execute(-50)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B0%86%E7%95%8C%E9%9D%A2%E4%BB%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E7%95%8C%E9%9D%A2%EF%BC%8C%E6%BB%9A%E5%8A%A8%E9%80%9F%E5%BA%A6%E8%AE%BE%E5%AE%9A%E4%B8%BA30.%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20void%20scrollToContentFromLeftMenu()%20%7B%0A%20%20%20%20%20%20%20%20new%20LeftMenuScrollTask().execute(50)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B0%86%E7%95%8C%E9%9D%A2%E4%BB%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E7%95%8C%E9%9D%A2%EF%BC%8C%E6%BB%9A%E5%8A%A8%E9%80%9F%E5%BA%A6%E8%AE%BE%E5%AE%9A%E4%B8%BA30.%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20void%20scrollToContentFromRightMenu()%20%7B%0A%20%20%20%20%20%20%20%20new%20RightMenuScrollTask().execute(50)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%AF%E5%90%A6%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E5%87%BA%E6%9D%A5%EF%BC%8C%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%AD%A4%E5%80%BC%E6%97%A0%E6%95%88%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20boolean%20isLeftLayoutVisible()%20%7B%0A%20%20%20%20%20%20%20%20return%20isLeftMenuVisible%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%AF%E5%90%A6%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E5%87%BA%E6%9D%A5%EF%BC%8C%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%AD%A4%E5%80%BC%E6%97%A0%E6%95%88%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%8C%E5%85%A8%E6%98%BE%E7%A4%BA%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20public%20boolean%20isRightLayoutVisible()%20%7B%0A%20%20%20%20%20%20%20%20return%20isRightMenuVisible%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%9C%A8onLayout%E4%B8%AD%E9%87%8D%E6%96%B0%E8%AE%BE%E5%AE%9A%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E3%80%81%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E3%80%81%E4%BB%A5%E5%8F%8A%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E7%9A%84%E5%8F%82%E6%95%B0%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20%40Override%0A%20%20%20%20protected%20void%20onLayout(boolean%20changed%2C%20int%20l%2C%20int%20t%2C%20int%20r%2C%20int%20b)%20%7B%0A%20%20%20%20%20%20%20%20super.onLayout(changed%2C%20l%2C%20t%2C%20r%2C%20b)%3B%0A%20%20%20%20%20%20%20%20if%20(changed)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%0A%20%20%20%20%20%20%20%20%20%20%20%20leftMenuLayout%20%3D%20getChildAt(0)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20leftMenuLayoutParams%20%3D%20(MarginLayoutParams)%20leftMenuLayout.getLayoutParams()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%0A%20%20%20%20%20%20%20%20%20%20%20%20rightMenuLayout%20%3D%20getChildAt(1)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20rightMenuLayoutParams%20%3D%20(MarginLayoutParams)%20rightMenuLayout.getLayoutParams()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E5%AF%B9%E8%B1%A1%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout%20%3D%20getChildAt(2)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams%20%3D%20(RelativeLayout.LayoutParams)%20contentLayout.getLayoutParams()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.width%20%3D%20screenWidth%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%40Override%0A%20%20%20%20public%20boolean%20onTouch(View%20v%2C%20MotionEvent%20event)%20%7B%0A%20%20%20%20%20%20%20%20createVelocityTracker(event)%3B%0A%20%20%20%20%20%20%20%20switch%20(event.getAction())%20%7B%0A%20%20%20%20%20%20%20%20case%20MotionEvent.ACTION_DOWN%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%89%8B%E6%8C%87%E6%8C%89%E4%B8%8B%E6%97%B6%EF%BC%8C%E8%AE%B0%E5%BD%95%E6%8C%89%E4%B8%8B%E6%97%B6%E7%9A%84%E5%9D%90%E6%A0%87%0A%20%20%20%20%20%20%20%20%20%20%20%20xDown%20%3D%20event.getRawX()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20yDown%20%3D%20event.getRawY()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%B0%86%E6%BB%91%E5%8A%A8%E7%8A%B6%E6%80%81%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%BADO_NOTHING%0A%20%20%20%20%20%20%20%20%20%20%20%20slideState%20%3D%20DO_NOTHING%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20MotionEvent.ACTION_MOVE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20xMove%20%3D%20event.getRawX()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20yMove%20%3D%20event.getRawY()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E6%97%B6%EF%BC%8C%E5%AF%B9%E6%AF%94%E6%8C%89%E4%B8%8B%E6%97%B6%E7%9A%84%E5%9D%90%E6%A0%87%EF%BC%8C%E8%AE%A1%E7%AE%97%E5%87%BA%E7%A7%BB%E5%8A%A8%E7%9A%84%E8%B7%9D%E7%A6%BB%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20moveDistanceX%20%3D%20(int)%20(xMove%20-%20xDown)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20moveDistanceY%20%3D%20(int)%20(yMove%20-%20yDown)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%A3%80%E6%9F%A5%E5%BD%93%E5%89%8D%E7%9A%84%E6%BB%91%E5%8A%A8%E7%8A%B6%E6%80%81%0A%20%20%20%20%20%20%20%20%20%20%20%20checkSlideState(moveDistanceX%2C%20moveDistanceY)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%A0%B9%E6%8D%AE%E5%BD%93%E5%89%8D%E6%BB%91%E5%8A%A8%E7%8A%B6%E6%80%81%E5%86%B3%E5%AE%9A%E5%A6%82%E4%BD%95%E5%81%8F%E7%A7%BB%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%0A%20%20%20%20%20%20%20%20%20%20%20%20switch%20(slideState)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20SHOW_LEFT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%20-moveDistanceX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkLeftMenuBorder()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20HIDE_LEFT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%20-leftMenuLayoutParams.width%20-%20moveDistanceX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkLeftMenuBorder()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20SHOW_RIGHT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%20moveDistanceX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkRightMenuBorder()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20HIDE_RIGHT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%20-rightMenuLayoutParams.width%20%2B%20moveDistanceX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkRightMenuBorder()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20MotionEvent.ACTION_UP%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20xUp%20%3D%20event.getRawX()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20upDistanceX%20%3D%20(int)%20(xUp%20-%20xDown)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(isSliding)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%89%8B%E6%8C%87%E6%8A%AC%E8%B5%B7%E6%97%B6%EF%BC%8C%E8%BF%9B%E8%A1%8C%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E6%89%8B%E5%8A%BF%E7%9A%84%E6%84%8F%E5%9B%BE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(slideState)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SHOW_LEFT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(shouldScrollToLeftMenu())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToLeftMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromLeftMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20HIDE_LEFT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(shouldScrollToContentFromLeftMenu())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromLeftMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToLeftMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SHOW_RIGHT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(shouldScrollToRightMenu())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToRightMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromRightMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20HIDE_RIGHT_MENU%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(shouldScrollToContentFromRightMenu())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromRightMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToRightMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(upDistanceX%20%3C%20touchSlop%20%26%26%20isLeftMenuVisible)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%BD%93%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%BE%E7%A4%BA%E6%97%B6%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E7%82%B9%E5%87%BB%E4%B8%80%E4%B8%8B%E5%86%85%E5%AE%B9%E9%83%A8%E5%88%86%EF%BC%8C%E5%88%99%E7%9B%B4%E6%8E%A5%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E7%95%8C%E9%9D%A2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromLeftMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(upDistanceX%20%3C%20touchSlop%20%26%26%20isRightMenuVisible)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%BD%93%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%BE%E7%A4%BA%E6%97%B6%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E7%82%B9%E5%87%BB%E4%B8%80%E4%B8%8B%E5%86%85%E5%AE%B9%E9%83%A8%E5%88%86%EF%BC%8C%E5%88%99%E7%9B%B4%E6%8E%A5%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E7%95%8C%E9%9D%A2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scrollToContentFromRightMenu()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20recycleVelocityTracker()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(v.isEnabled())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(isSliding)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%AD%A3%E5%9C%A8%E6%BB%91%E5%8A%A8%E6%97%B6%E8%AE%A9%E6%8E%A7%E4%BB%B6%E5%BE%97%E4%B8%8D%E5%88%B0%E7%84%A6%E7%82%B9%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unFocusBindView()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(isLeftMenuVisible%20%7C%7C%20isRightMenuVisible)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%BD%93%E5%B7%A6%E4%BE%A7%E6%88%96%E5%8F%B3%E4%BE%A7%E5%B8%83%E5%B1%80%E6%98%BE%E7%A4%BA%E6%97%B6%EF%BC%8C%E5%B0%86%E7%BB%91%E5%AE%9A%E6%8E%A7%E4%BB%B6%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%B1%8F%E8%94%BD%E6%8E%89%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E6%A0%B9%E6%8D%AE%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E7%9A%84%E8%B7%9D%E7%A6%BB%EF%BC%8C%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7%E7%9A%84%E6%BB%91%E5%8A%A8%E6%84%8F%E5%9B%BE%EF%BC%8C%E7%84%B6%E5%90%8E%E7%BB%99slideState%E8%B5%8B%E5%80%BC%E6%88%90%E7%9B%B8%E5%BA%94%E7%9A%84%E6%BB%91%E5%8A%A8%E7%8A%B6%E6%80%81%E5%80%BC%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40param%20moveDistanceX%0A%20%20%20%20%20*%20%20%20%20%20%20%20%20%20%20%20%20%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8%E7%9A%84%E8%B7%9D%E7%A6%BB%0A%20%20%20%20%20*%20%40param%20moveDistanceY%0A%20%20%20%20%20*%20%20%20%20%20%20%20%20%20%20%20%20%E7%BA%B5%E5%90%91%E7%A7%BB%E5%8A%A8%E7%9A%84%E8%B7%9D%E7%A6%BB%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20checkSlideState(int%20moveDistanceX%2C%20int%20moveDistanceY)%20%7B%0A%20%20%20%20%20%20%20%20if%20(isLeftMenuVisible)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!isSliding%20%26%26%20Math.abs(moveDistanceX)%20%3E%3D%20touchSlop%20%26%26%20moveDistanceX%20%3C%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slideState%20%3D%20HIDE_LEFT_MENU%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(isRightMenuVisible)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!isSliding%20%26%26%20Math.abs(moveDistanceX)%20%3E%3D%20touchSlop%20%26%26%20moveDistanceX%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slideState%20%3D%20HIDE_RIGHT_MENU%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!isSliding%20%26%26%20Math.abs(moveDistanceX)%20%3E%3D%20touchSlop%20%26%26%20moveDistanceX%20%3E%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20Math.abs(moveDistanceY)%20%3C%20touchSlop)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slideState%20%3D%20SHOW_LEFT_MENU%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E6%83%B3%E8%A6%81%E6%BB%91%E5%8A%A8%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%EF%BC%8C%E5%B0%86%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%BE%E7%A4%BA%EF%BC%8C%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E9%9A%90%E8%97%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftMenuLayout.setVisibility(View.VISIBLE)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightMenuLayout.setVisibility(View.GONE)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(!isSliding%20%26%26%20Math.abs(moveDistanceX)%20%3E%3D%20touchSlop%20%26%26%20moveDistanceX%20%3C%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20Math.abs(moveDistanceY)%20%3C%20touchSlop)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slideState%20%3D%20SHOW_RIGHT_MENU%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E6%83%B3%E8%A6%81%E6%BB%91%E5%8A%A8%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%EF%BC%8C%E5%B0%86%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%98%BE%E7%A4%BA%EF%BC%8C%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E9%9A%90%E8%97%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightMenuLayout.setVisibility(View.VISIBLE)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftMenuLayout.setVisibility(View.GONE)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%9C%A8%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%A3%80%E6%9F%A5%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E7%9A%84%E8%BE%B9%E7%95%8C%E5%80%BC%EF%BC%8C%E9%98%B2%E6%AD%A2%E7%BB%91%E5%AE%9A%E5%B8%83%E5%B1%80%E6%BB%91%E5%87%BA%E5%B1%8F%E5%B9%95%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20checkLeftMenuBorder()%20%7B%0A%20%20%20%20%20%20%20%20if%20(contentLayoutParams.rightMargin%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(contentLayoutParams.rightMargin%20%3C%20-leftMenuLayoutParams.width)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%20-leftMenuLayoutParams.width%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%9C%A8%E6%BB%91%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%A3%80%E6%9F%A5%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E7%9A%84%E8%BE%B9%E7%95%8C%E5%80%BC%EF%BC%8C%E9%98%B2%E6%AD%A2%E7%BB%91%E5%AE%9A%E5%B8%83%E5%B1%80%E6%BB%91%E5%87%BA%E5%B1%8F%E5%B9%95%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20checkRightMenuBorder()%20%7B%0A%20%20%20%20%20%20%20%20if%20(contentLayoutParams.leftMargin%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(contentLayoutParams.leftMargin%20%3C%20-rightMenuLayoutParams.width)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%20-rightMenuLayoutParams.width%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E6%BB%9A%E5%8A%A8%E5%B0%86%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E3%80%82%E5%A6%82%E6%9E%9C%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E8%B7%9D%E7%A6%BB%E5%A4%A7%E4%BA%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%BD%E5%BA%A6%E7%9A%841%2F2%EF%BC%8C%E6%88%96%E8%80%85%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E9%80%9F%E5%BA%A6%E5%A4%A7%E4%BA%8ESNAP_VELOCITY%EF%BC%8C%0A%20%20%20%20%20*%20%E5%B0%B1%E8%AE%A4%E4%B8%BA%E5%BA%94%E8%AF%A5%E6%BB%9A%E5%8A%A8%E5%B0%86%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%A6%82%E6%9E%9C%E5%BA%94%E8%AF%A5%E5%B0%86%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20shouldScrollToLeftMenu()%20%7B%0A%20%20%20%20%20%20%20%20return%20xUp%20-%20xDown%20%3E%20leftMenuLayoutParams.width%20%2F%202%20%7C%7C%20getScrollVelocity()%20%3E%20SNAP_VELOCITY%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E6%BB%9A%E5%8A%A8%E5%B0%86%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E3%80%82%E5%A6%82%E6%9E%9C%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E8%B7%9D%E7%A6%BB%E5%A4%A7%E4%BA%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%BD%E5%BA%A6%E7%9A%841%2F2%EF%BC%8C%E6%88%96%E8%80%85%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E9%80%9F%E5%BA%A6%E5%A4%A7%E4%BA%8ESNAP_VELOCITY%EF%BC%8C%0A%20%20%20%20%20*%20%E5%B0%B1%E8%AE%A4%E4%B8%BA%E5%BA%94%E8%AF%A5%E6%BB%9A%E5%8A%A8%E5%B0%86%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%A6%82%E6%9E%9C%E5%BA%94%E8%AF%A5%E5%B0%86%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%B1%95%E7%A4%BA%E5%87%BA%E6%9D%A5%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20shouldScrollToRightMenu()%20%7B%0A%20%20%20%20%20%20%20%20return%20xDown%20-%20xUp%20%3E%20rightMenuLayoutParams.width%20%2F%202%20%7C%7C%20getScrollVelocity()%20%3E%20SNAP_VELOCITY%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E8%B7%9D%E7%A6%BB%E5%A4%A7%E4%BA%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%BD%E5%BA%A6%E7%9A%841%2F2%EF%BC%8C%E6%88%96%E8%80%85%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E9%80%9F%E5%BA%A6%E5%A4%A7%E4%BA%8ESNAP_VELOCITY%EF%BC%8C%0A%20%20%20%20%20*%20%E5%B0%B1%E8%AE%A4%E4%B8%BA%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%A6%82%E6%9E%9C%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%B7%A6%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20shouldScrollToContentFromLeftMenu()%20%7B%0A%20%20%20%20%20%20%20%20return%20xDown%20-%20xUp%20%3E%20leftMenuLayoutParams.width%20%2F%202%20%7C%7C%20getScrollVelocity()%20%3E%20SNAP_VELOCITY%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E8%B7%9D%E7%A6%BB%E5%A4%A7%E4%BA%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E5%AE%BD%E5%BA%A6%E7%9A%841%2F2%EF%BC%8C%E6%88%96%E8%80%85%E6%89%8B%E6%8C%87%E7%A7%BB%E5%8A%A8%E9%80%9F%E5%BA%A6%E5%A4%A7%E4%BA%8ESNAP_VELOCITY%EF%BC%8C%0A%20%20%20%20%20*%20%E5%B0%B1%E8%AE%A4%E4%B8%BA%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E5%A6%82%E6%9E%9C%E5%BA%94%E8%AF%A5%E4%BB%8E%E5%8F%B3%E4%BE%A7%E8%8F%9C%E5%8D%95%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%86%85%E5%AE%B9%E5%B8%83%E5%B1%80%E8%BF%94%E5%9B%9Etrue%EF%BC%8C%E5%90%A6%E5%88%99%E8%BF%94%E5%9B%9Efalse%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20boolean%20shouldScrollToContentFromRightMenu()%20%7B%0A%20%20%20%20%20%20%20%20return%20xUp%20-%20xDown%20%3E%20rightMenuLayoutParams.width%20%2F%202%20%7C%7C%20getScrollVelocity()%20%3E%20SNAP_VELOCITY%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%88%9B%E5%BB%BAVelocityTracker%E5%AF%B9%E8%B1%A1%EF%BC%8C%E5%B9%B6%E5%B0%86%E8%A7%A6%E6%91%B8%E4%BA%8B%E4%BB%B6%E5%8A%A0%E5%85%A5%E5%88%B0VelocityTracker%E5%BD%93%E4%B8%AD%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40param%20event%0A%20%20%20%20%20*%20%20%20%20%20%20%20%20%20%20%20%20%E5%8F%B3%E4%BE%A7%E5%B8%83%E5%B1%80%E7%9B%91%E5%90%AC%E6%8E%A7%E4%BB%B6%E7%9A%84%E6%BB%91%E5%8A%A8%E4%BA%8B%E4%BB%B6%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20createVelocityTracker(MotionEvent%20event)%20%7B%0A%20%20%20%20%20%20%20%20if%20(mVelocityTracker%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20mVelocityTracker%20%3D%20VelocityTracker.obtain()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20mVelocityTracker.addMovement(event)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E8%8E%B7%E5%8F%96%E6%89%8B%E6%8C%87%E5%9C%A8%E7%BB%91%E5%AE%9A%E5%B8%83%E5%B1%80%E4%B8%8A%E7%9A%84%E6%BB%91%E5%8A%A8%E9%80%9F%E5%BA%A6%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40return%20%E6%BB%91%E5%8A%A8%E9%80%9F%E5%BA%A6%EF%BC%8C%E4%BB%A5%E6%AF%8F%E7%A7%92%E9%92%9F%E7%A7%BB%E5%8A%A8%E4%BA%86%E5%A4%9A%E5%B0%91%E5%83%8F%E7%B4%A0%E5%80%BC%E4%B8%BA%E5%8D%95%E4%BD%8D%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20int%20getScrollVelocity()%20%7B%0A%20%20%20%20%20%20%20%20mVelocityTracker.computeCurrentVelocity(1000)%3B%0A%20%20%20%20%20%20%20%20int%20velocity%20%3D%20(int)%20mVelocityTracker.getXVelocity()%3B%0A%20%20%20%20%20%20%20%20return%20Math.abs(velocity)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E5%9B%9E%E6%94%B6VelocityTracker%E5%AF%B9%E8%B1%A1%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20recycleVelocityTracker()%20%7B%0A%20%20%20%20%20%20%20%20mVelocityTracker.recycle()%3B%0A%20%20%20%20%20%20%20%20mVelocityTracker%20%3D%20null%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E4%BD%BF%E7%94%A8%E5%8F%AF%E4%BB%A5%E8%8E%B7%E5%BE%97%E7%84%A6%E7%82%B9%E7%9A%84%E6%8E%A7%E4%BB%B6%E5%9C%A8%E6%BB%91%E5%8A%A8%E7%9A%84%E6%97%B6%E5%80%99%E5%A4%B1%E5%8E%BB%E7%84%A6%E7%82%B9%E3%80%82%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20unFocusBindView()%20%7B%0A%20%20%20%20%20%20%20%20if%20(mBindView%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20mBindView.setPressed(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20mBindView.setFocusable(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20mBindView.setFocusableInTouchMode(false)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20LeftMenuScrollTask%20extends%20AsyncTask%3CInteger%2C%20Integer%2C%20Integer%3E%20%7B%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20Integer%20doInBackground(Integer...%20speed)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20rightMargin%20%3D%20contentLayoutParams.rightMargin%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%A0%B9%E6%8D%AE%E4%BC%A0%E5%85%A5%E7%9A%84%E9%80%9F%E5%BA%A6%E6%9D%A5%E6%BB%9A%E5%8A%A8%E7%95%8C%E9%9D%A2%EF%BC%8C%E5%BD%93%E6%BB%9A%E5%8A%A8%E5%88%B0%E8%BE%BE%E8%BE%B9%E7%95%8C%E5%80%BC%E6%97%B6%EF%BC%8C%E8%B7%B3%E5%87%BA%E5%BE%AA%E7%8E%AF%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20(true)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightMargin%20%3D%20rightMargin%20%2B%20speed%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(rightMargin%20%3C%20-leftMenuLayoutParams.width)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightMargin%20%3D%20-leftMenuLayoutParams.width%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(rightMargin%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightMargin%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20publishProgress(rightMargin)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E4%B8%BA%E4%BA%86%E8%A6%81%E6%9C%89%E6%BB%9A%E5%8A%A8%E6%95%88%E6%9E%9C%E4%BA%A7%E7%94%9F%EF%BC%8C%E6%AF%8F%E6%AC%A1%E5%BE%AA%E7%8E%AF%E4%BD%BF%E7%BA%BF%E7%A8%8B%E7%9D%A1%E7%9C%A0%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%82%89%E7%9C%BC%E6%89%8D%E8%83%BD%E5%A4%9F%E7%9C%8B%E5%88%B0%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sleep(15)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(speed%5B0%5D%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isLeftMenuVisible%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isLeftMenuVisible%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20rightMargin%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20void%20onProgressUpdate(Integer...%20rightMargin)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%20rightMargin%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20unFocusBindView()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20void%20onPostExecute(Integer%20rightMargin)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.rightMargin%20%3D%20rightMargin%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20RightMenuScrollTask%20extends%20AsyncTask%3CInteger%2C%20Integer%2C%20Integer%3E%20%7B%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20Integer%20doInBackground(Integer...%20speed)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20leftMargin%20%3D%20contentLayoutParams.leftMargin%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%A0%B9%E6%8D%AE%E4%BC%A0%E5%85%A5%E7%9A%84%E9%80%9F%E5%BA%A6%E6%9D%A5%E6%BB%9A%E5%8A%A8%E7%95%8C%E9%9D%A2%EF%BC%8C%E5%BD%93%E6%BB%9A%E5%8A%A8%E5%88%B0%E8%BE%BE%E8%BE%B9%E7%95%8C%E5%80%BC%E6%97%B6%EF%BC%8C%E8%B7%B3%E5%87%BA%E5%BE%AA%E7%8E%AF%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20(true)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftMargin%20%3D%20leftMargin%20%2B%20speed%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(leftMargin%20%3C%20-rightMenuLayoutParams.width)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftMargin%20%3D%20-rightMenuLayoutParams.width%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(leftMargin%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftMargin%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20publishProgress(leftMargin)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E4%B8%BA%E4%BA%86%E8%A6%81%E6%9C%89%E6%BB%9A%E5%8A%A8%E6%95%88%E6%9E%9C%E4%BA%A7%E7%94%9F%EF%BC%8C%E6%AF%8F%E6%AC%A1%E5%BE%AA%E7%8E%AF%E4%BD%BF%E7%BA%BF%E7%A8%8B%E7%9D%A1%E7%9C%A0%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%82%89%E7%9C%BC%E6%89%8D%E8%83%BD%E5%A4%9F%E7%9C%8B%E5%88%B0%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sleep(15)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(speed%5B0%5D%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isRightMenuVisible%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isRightMenuVisible%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20isSliding%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20leftMargin%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20void%20onProgressUpdate(Integer...%20leftMargin)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%20leftMargin%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20unFocusBindView()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20protected%20void%20onPostExecute(Integer%20leftMargin)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayoutParams.leftMargin%20%3D%20leftMargin%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contentLayout.setLayoutParams(contentLayoutParams)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%E4%BD%BF%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9D%A1%E7%9C%A0%E6%8C%87%E5%AE%9A%E7%9A%84%E6%AF%AB%E7%A7%92%E6%95%B0%E3%80%82%0A%20%20%20%20%20*%20%0A%20%20%20%20%20*%20%40param%20millis%0A%20%20%20%20%20*%20%20%20%20%20%20%20%20%20%20%20%20%E6%8C%87%E5%AE%9A%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9D%A1%E7%9C%A0%E5%A4%9A%E4%B9%85%EF%BC%8C%E4%BB%A5%E6%AF%AB%E7%A7%92%E4%B8%BA%E5%8D%95%E4%BD%8D%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20void%20sleep(long%20millis)%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Thread.sleep(millis)%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20(InterruptedException%20e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.printStackTrace()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%E5%A4%8D%E5%88%B6%E4%BB%A3%E7%A0%81%0A1%0A2%0A3%0A4%0A5%0A6%0A7%0A8%0A9%0A10%0A11%0A12%0A13%0A14%0A15%0A16%0A17%0A18%0A19%0A20%0A21%0A22%0A23%0A24%0A25%0A26%0A27%0A28%0A29%0A30%0A31%0A32%0A33%0A34%0A35%0A36%0A37%0A38%0A39%0A40%0A41%0A42%0A43%0A44%0A45%0A46%0A47%0A48%0A49%0A50%0A51%0A52%0A53%0A54%0A55%0A56%0A57%0A%3Ccom.example.slidermenu.SliderMenu%20%0A%20%20%20%20xmlns%3Aandroid%3D%22http%3A%2F%2Fschemas.android.com%2Fapk%2Fres%2Fandroid%22%0A%20%20%20%20xmlns%3Atools%3D%22http%3A%2F%2Fschemas.android.com%2Ftools%22%0A%20%20%20%20android%3Aid%3D%22%40%2Bid%2Fbidir_sliding_layout%22%0A%20%20%20%20android%3Alayout_width%3D%22fill_parent%22%0A%20%20%20%20android%3Alayout_height%3D%22fill_parent%22%20%3E%0A%20%0A%20%20%20%20%3CRelativeLayout%0A%20%20%20%20%20%20%20%20android%3Aid%3D%22%40%2Bid%2Fleft_menu%22%0A%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22270dip%22%0A%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22fill_parent%22%0A%20%20%20%20%20%20%20%20android%3Alayout_alignParentLeft%3D%22true%22%0A%20%20%20%20%20%20%20%20android%3Abackground%3D%22%2300ccff%22%0A%20%20%20%20%20%20%20%20android%3Avisibility%3D%22invisible%22%20%3E%0A%20%0A%20%20%20%20%20%20%20%20%3CTextView%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22wrap_content%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22wrap_content%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_centerInParent%3D%22true%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Atext%3D%22This%20is%20left%20menu%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3AtextColor%3D%22%23000000%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3AtextSize%3D%2228sp%22%20%2F%3E%0A%20%20%20%20%3C%2FRelativeLayout%3E%0A%20%0A%20%20%20%20%3CRelativeLayout%0A%20%20%20%20%20%20%20%20android%3Aid%3D%22%40%2Bid%2Fright_menu%22%0A%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22270dip%22%0A%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22fill_parent%22%0A%20%20%20%20%20%20%20%20android%3Alayout_alignParentRight%3D%22true%22%0A%20%20%20%20%20%20%20%20android%3Abackground%3D%22%2300ffcc%22%0A%20%20%20%20%20%20%20%20android%3Avisibility%3D%22invisible%22%20%3E%0A%20%0A%20%20%20%20%20%20%20%20%3CTextView%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22wrap_content%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22wrap_content%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_centerInParent%3D%22true%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Atext%3D%22This%20is%20right%20menu%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3AtextColor%3D%22%23000000%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3AtextSize%3D%2228sp%22%20%2F%3E%0A%20%20%20%20%3C%2FRelativeLayout%3E%0A%20%0A%20%20%20%20%3CLinearLayout%0A%20%20%20%20%20%20%20%20android%3Aid%3D%22%40%2Bid%2Fcontent%22%0A%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22320dip%22%0A%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22fill_parent%22%0A%20%20%20%20%20%20%20%20android%3Abackground%3D%22%23e9e9e9%22%20%3E%0A%20%0A%20%20%20%20%20%20%20%20%3CListView%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Aid%3D%22%40%2Bid%2FcontentList%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_width%3D%22fill_parent%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Alayout_height%3D%22fill_parent%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3Ascrollbars%3D%22none%22%0A%20%20%20%20%20%20%20%20%20%20%20%20android%3AcacheColorHint%3D%22%2300000000%22%20%3E%0A%20%20%20%20%20%20%20%20%3C%2FListView%3E%0A%20%20%20%20%3C%2FLinearLayout%3E%0A%20%0A%3C%2Fcom.example.slidermenu.SliderMenu%3E%0A" /> 收藏代码
  1. 这个类就是实现双向滑动菜单功能的核心类  
  2.   
  3. public class SliderMenu extends RelativeLayout implements OnTouchListener {  
  4.   
  5.     /** 
  6.      * 滚动显示和隐藏左侧布局时,手指滑动需要达到的速度。 
  7.      */  
  8.     public static final int SNAP_VELOCITY = 200;  
  9.   
  10.     /** 
  11.      * 滑动状态的一种,表示未进行任何滑动。 
  12.      */  
  13.     public static final int DO_NOTHING = 0;  
  14.   
  15.     /** 
  16.      * 滑动状态的一种,表示正在滑出左侧菜单。 
  17.      */  
  18.     public static final int SHOW_LEFT_MENU = 1;  
  19.   
  20.     /** 
  21.      * 滑动状态的一种,表示正在滑出右侧菜单。 
  22.      */  
  23.     public static final int SHOW_RIGHT_MENU = 2;  
  24.   
  25.     /** 
  26.      * 滑动状态的一种,表示正在隐藏左侧菜单。 
  27.      */  
  28.     public static final int HIDE_LEFT_MENU = 3;  
  29.   
  30.     /** 
  31.      * 滑动状态的一种,表示正在隐藏右侧菜单。 
  32.      */  
  33.     public static final int HIDE_RIGHT_MENU = 4;  
  34.   
  35.     /** 
  36.      * 记录当前的滑动状态 
  37.      */  
  38.     private int slideState;  
  39.   
  40.     /** 
  41.      * 屏幕宽度值。 
  42.      */  
  43.     private int screenWidth;  
  44.   
  45.     /** 
  46.      * 在被判定为滚动之前用户手指可以移动的最大值。 
  47.      */  
  48.     private int touchSlop;  
  49.   
  50.     /** 
  51.      * 记录手指按下时的横坐标。 
  52.      */  
  53.     private float xDown;  
  54.   
  55.     /** 
  56.      * 记录手指按下时的纵坐标。 
  57.      */  
  58.     private float yDown;  
  59.   
  60.     /** 
  61.      * 记录手指移动时的横坐标。 
  62.      */  
  63.     private float xMove;  
  64.   
  65.     /** 
  66.      * 记录手指移动时的纵坐标。 
  67.      */  
  68.     private float yMove;  
  69.   
  70.     /** 
  71.      * 记录手机抬起时的横坐标。 
  72.      */  
  73.     private float xUp;  
  74.   
  75.     /** 
  76.      * 左侧菜单当前是显示还是隐藏。只有完全显示或隐藏时才会更改此值,滑动过程中此值无效。 
  77.      */  
  78.     private boolean isLeftMenuVisible;  
  79.   
  80.     /** 
  81.      * 右侧菜单当前是显示还是隐藏。只有完全显示或隐藏时才会更改此值,滑动过程中此值无效。 
  82.      */  
  83.     private boolean isRightMenuVisible;  
  84.   
  85.     /** 
  86.      * 是否正在滑动。 
  87.      */  
  88.     private boolean isSliding;  
  89.   
  90.     /** 
  91.      * 左侧菜单布局对象。 
  92.      */  
  93.     private View leftMenuLayout;  
  94.   
  95.     /** 
  96.      * 右侧菜单布局对象。 
  97.      */  
  98.     private View rightMenuLayout;  
  99.   
  100.     /** 
  101.      * 内容布局对象。 
  102.      */  
  103.     private View contentLayout;  
  104.   
  105.     /** 
  106.      * 用于监听滑动事件的View。 
  107.      */  
  108.     private View mBindView;  
  109.   
  110.     /** 
  111.      * 左侧菜单布局的参数。 
  112.      */  
  113.     private MarginLayoutParams leftMenuLayoutParams;  
  114.   
  115.     /** 
  116.      * 右侧菜单布局的参数。 
  117.      */  
  118.     private MarginLayoutParams rightMenuLayoutParams;  
  119.   
  120.     /** 
  121.      * 内容布局的参数。 
  122.      */  
  123.     private RelativeLayout.LayoutParams contentLayoutParams;  
  124.   
  125.     /** 
  126.      * 用于计算手指滑动的速度。 
  127.      */  
  128.     private VelocityTracker mVelocityTracker;  
  129.   
  130.     /** 
  131.      * 重写BidirSlidingLayout的构造函数,其中获取了屏幕的宽度和touchSlop的值。 
  132.      *  
  133.      * @param context 
  134.      * @param attrs 
  135.      */  
  136.     public SliderMenu(Context context, AttributeSet attrs) {  
  137.         super(context, attrs);  
  138.         WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
  139.         screenWidth = wm.getDefaultDisplay().getWidth();  
  140.         touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();  
  141.     }  
  142.   
  143.     /** 
  144.      * 绑定监听滑动事件的View。 
  145.      *  
  146.      * @param bindView 
  147.      *            需要绑定的View对象。 
  148.      */  
  149.     public void setScrollEvent(View bindView) {  
  150.         mBindView = bindView;  
  151.         mBindView.setOnTouchListener(this);  
  152.     }  
  153.   
  154.     /** 
  155.      * 将界面滚动到左侧菜单界面,滚动速度设定为-30. 
  156.      */  
  157.     public void scrollToLeftMenu() {  
  158.         new LeftMenuScrollTask().execute(-50);  
  159.     }  
  160.   
  161.     /** 
  162.      * 将界面滚动到右侧菜单界面,滚动速度设定为-30. 
  163.      */  
  164.     public void scrollToRightMenu() {  
  165.         new RightMenuScrollTask().execute(-50);  
  166.     }  
  167.   
  168.     /** 
  169.      * 将界面从左侧菜单滚动到内容界面,滚动速度设定为30. 
  170.      */  
  171.     public void scrollToContentFromLeftMenu() {  
  172.         new LeftMenuScrollTask().execute(50);  
  173.     }  
  174.   
  175.     /** 
  176.      * 将界面从右侧菜单滚动到内容界面,滚动速度设定为30. 
  177.      */  
  178.     public void scrollToContentFromRightMenu() {  
  179.         new RightMenuScrollTask().execute(50);  
  180.     }  
  181.   
  182.     /** 
  183.      * 左侧菜单是否完全显示出来,滑动过程中此值无效。 
  184.      *  
  185.      * @return 左侧菜单完全显示返回true,否则返回false。 
  186.      */  
  187.     public boolean isLeftLayoutVisible() {  
  188.         return isLeftMenuVisible;  
  189.     }  
  190.   
  191.     /** 
  192.      * 右侧菜单是否完全显示出来,滑动过程中此值无效。 
  193.      *  
  194.      * @return 右侧菜单完全显示返回true,否则返回false。 
  195.      */  
  196.     public boolean isRightLayoutVisible() {  
  197.         return isRightMenuVisible;  
  198.     }  
  199.   
  200.     /** 
  201.      * 在onLayout中重新设定左侧菜单、右侧菜单、以及内容布局的参数。 
  202.      */  
  203.     @Override  
  204.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  205.         super.onLayout(changed, l, t, r, b);  
  206.         if (changed) {  
  207.             // 获取左侧菜单布局对象  
  208.             leftMenuLayout = getChildAt(0);  
  209.             leftMenuLayoutParams = (MarginLayoutParams) leftMenuLayout.getLayoutParams();  
  210.             // 获取右侧菜单布局对象  
  211.             rightMenuLayout = getChildAt(1);  
  212.             rightMenuLayoutParams = (MarginLayoutParams) rightMenuLayout.getLayoutParams();  
  213.             // 获取内容布局对象  
  214.             contentLayout = getChildAt(2);  
  215.             contentLayoutParams = (RelativeLayout.LayoutParams) contentLayout.getLayoutParams();  
  216.             contentLayoutParams.width = screenWidth;  
  217.             contentLayout.setLayoutParams(contentLayoutParams);  
  218.         }  
  219.     }  
  220.   
  221.     @Override  
  222.     public boolean onTouch(View v, MotionEvent event) {  
  223.         createVelocityTracker(event);  
  224.         switch (event.getAction()) {  
  225.         case MotionEvent.ACTION_DOWN:  
  226.             // 手指按下时,记录按下时的坐标  
  227.             xDown = event.getRawX();  
  228.             yDown = event.getRawY();  
  229.             // 将滑动状态初始化为DO_NOTHING  
  230.             slideState = DO_NOTHING;  
  231.             break;  
  232.         case MotionEvent.ACTION_MOVE:  
  233.             xMove = event.getRawX();  
  234.             yMove = event.getRawY();  
  235.             // 手指移动时,对比按下时的坐标,计算出移动的距离。  
  236.             int moveDistanceX = (int) (xMove - xDown);  
  237.             int moveDistanceY = (int) (yMove - yDown);  
  238.             // 检查当前的滑动状态  
  239.             checkSlideState(moveDistanceX, moveDistanceY);  
  240.             // 根据当前滑动状态决定如何偏移内容布局  
  241.             switch (slideState) {  
  242.             case SHOW_LEFT_MENU:  
  243.                 contentLayoutParams.rightMargin = -moveDistanceX;  
  244.                 checkLeftMenuBorder();  
  245.                 contentLayout.setLayoutParams(contentLayoutParams);  
  246.                 break;  
  247.             case HIDE_LEFT_MENU:  
  248.                 contentLayoutParams.rightMargin = -leftMenuLayoutParams.width - moveDistanceX;  
  249.                 checkLeftMenuBorder();  
  250.                 contentLayout.setLayoutParams(contentLayoutParams);  
  251.             case SHOW_RIGHT_MENU:  
  252.                 contentLayoutParams.leftMargin = moveDistanceX;  
  253.                 checkRightMenuBorder();  
  254.                 contentLayout.setLayoutParams(contentLayoutParams);  
  255.                 break;  
  256.             case HIDE_RIGHT_MENU:  
  257.                 contentLayoutParams.leftMargin = -rightMenuLayoutParams.width + moveDistanceX;  
  258.                 checkRightMenuBorder();  
  259.                 contentLayout.setLayoutParams(contentLayoutParams);  
  260.             default:  
  261.                 break;  
  262.             }  
  263.             break;  
  264.         case MotionEvent.ACTION_UP:  
  265.             xUp = event.getRawX();  
  266.             int upDistanceX = (int) (xUp - xDown);  
  267.             if (isSliding) {  
  268.                 // 手指抬起时,进行判断当前手势的意图  
  269.                 switch (slideState) {  
  270.                 case SHOW_LEFT_MENU:  
  271.                     if (shouldScrollToLeftMenu()) {  
  272.                         scrollToLeftMenu();  
  273.                     } else {  
  274.                         scrollToContentFromLeftMenu();  
  275.                     }  
  276.                     break;  
  277.                 case HIDE_LEFT_MENU:  
  278.                     if (shouldScrollToContentFromLeftMenu()) {  
  279.                         scrollToContentFromLeftMenu();  
  280.                     } else {  
  281.                         scrollToLeftMenu();  
  282.                     }  
  283.                     break;  
  284.                 case SHOW_RIGHT_MENU:  
  285.                     if (shouldScrollToRightMenu()) {  
  286.                         scrollToRightMenu();  
  287.                     } else {  
  288.                         scrollToContentFromRightMenu();  
  289.                     }  
  290.                     break;  
  291.                 case HIDE_RIGHT_MENU:  
  292.                     if (shouldScrollToContentFromRightMenu()) {  
  293.                         scrollToContentFromRightMenu();  
  294.                     } else {  
  295.                         scrollToRightMenu();  
  296.                     }  
  297.                     break;  
  298.                 default:  
  299.                     break;  
  300.                 }  
  301.             } else if (upDistanceX < touchSlop && isLeftMenuVisible) {  
  302.                 // 当左侧菜单显示时,如果用户点击一下内容部分,则直接滚动到内容界面  
  303.                 scrollToContentFromLeftMenu();  
  304.             } else if (upDistanceX < touchSlop && isRightMenuVisible) {  
  305.                 // 当右侧菜单显示时,如果用户点击一下内容部分,则直接滚动到内容界面  
  306.                 scrollToContentFromRightMenu();  
  307.             }  
  308.             recycleVelocityTracker();  
  309.             break;  
  310.         }  
  311.         if (v.isEnabled()) {  
  312.             if (isSliding) {  
  313.                 // 正在滑动时让控件得不到焦点  
  314.                 unFocusBindView();  
  315.                 return true;  
  316.             }  
  317.             if (isLeftMenuVisible || isRightMenuVisible) {  
  318.                 // 当左侧或右侧布局显示时,将绑定控件的事件屏蔽掉  
  319.                 return true;  
  320.             }  
  321.             return false;  
  322.         }  
  323.         return true;  
  324.     }  
  325.   
  326.     /** 
  327.      * 根据手指移动的距离,判断当前用户的滑动意图,然后给slideState赋值成相应的滑动状态值。 
  328.      *  
  329.      * @param moveDistanceX 
  330.      *            横向移动的距离 
  331.      * @param moveDistanceY 
  332.      *            纵向移动的距离 
  333.      */  
  334.     private void checkSlideState(int moveDistanceX, int moveDistanceY) {  
  335.         if (isLeftMenuVisible) {  
  336.             if (!isSliding && Math.abs(moveDistanceX) >= touchSlop && moveDistanceX < 0) {  
  337.                 isSliding = true;  
  338.                 slideState = HIDE_LEFT_MENU;  
  339.             }  
  340.         } else if (isRightMenuVisible) {  
  341.             if (!isSliding && Math.abs(moveDistanceX) >= touchSlop && moveDistanceX > 0) {  
  342.                 isSliding = true;  
  343.                 slideState = HIDE_RIGHT_MENU;  
  344.             }  
  345.         } else {  
  346.             if (!isSliding && Math.abs(moveDistanceX) >= touchSlop && moveDistanceX > 0  
  347.                     && Math.abs(moveDistanceY) < touchSlop) {  
  348.                 isSliding = true;  
  349.                 slideState = SHOW_LEFT_MENU;  
  350.                 contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);  
  351.                 contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);  
  352.                 contentLayout.setLayoutParams(contentLayoutParams);  
  353.                 // 如果用户想要滑动左侧菜单,将左侧菜单显示,右侧菜单隐藏  
  354.                 leftMenuLayout.setVisibility(View.VISIBLE);  
  355.                 rightMenuLayout.setVisibility(View.GONE);  
  356.             } else if (!isSliding && Math.abs(moveDistanceX) >= touchSlop && moveDistanceX < 0  
  357.                     && Math.abs(moveDistanceY) < touchSlop) {  
  358.                 isSliding = true;  
  359.                 slideState = SHOW_RIGHT_MENU;  
  360.                 contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);  
  361.                 contentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);  
  362.                 contentLayout.setLayoutParams(contentLayoutParams);  
  363.                 // 如果用户想要滑动右侧菜单,将右侧菜单显示,左侧菜单隐藏  
  364.                 rightMenuLayout.setVisibility(View.VISIBLE);  
  365.                 leftMenuLayout.setVisibility(View.GONE);  
  366.             }  
  367.         }  
  368.     }  
  369.   
  370.     /** 
  371.      * 在滑动过程中检查左侧菜单的边界值,防止绑定布局滑出屏幕。 
  372.      */  
  373.     private void checkLeftMenuBorder() {  
  374.         if (contentLayoutParams.rightMargin > 0) {  
  375.             contentLayoutParams.rightMargin = 0;  
  376.         } else if (contentLayoutParams.rightMargin < -leftMenuLayoutParams.width) {  
  377.             contentLayoutParams.rightMargin = -leftMenuLayoutParams.width;  
  378.         }  
  379.     }  
  380.   
  381.     /** 
  382.      * 在滑动过程中检查右侧菜单的边界值,防止绑定布局滑出屏幕。 
  383.      */  
  384.     private void checkRightMenuBorder() {  
  385.         if (contentLayoutParams.leftMargin > 0) {  
  386.             contentLayoutParams.leftMargin = 0;  
  387.         } else if (contentLayoutParams.leftMargin < -rightMenuLayoutParams.width) {  
  388.             contentLayoutParams.leftMargin = -rightMenuLayoutParams.width;  
  389.         }  
  390.     }  
  391.   
  392.     /** 
  393.      * 判断是否应该滚动将左侧菜单展示出来。如果手指移动距离大于左侧菜单宽度的1/2,或者手指移动速度大于SNAP_VELOCITY, 
  394.      * 就认为应该滚动将左侧菜单展示出来。 
  395.      *  
  396.      * @return 如果应该将左侧菜单展示出来返回true,否则返回false。 
  397.      */  
  398.     private boolean shouldScrollToLeftMenu() {  
  399.         return xUp - xDown > leftMenuLayoutParams.width / 2 || getScrollVelocity() > SNAP_VELOCITY;  
  400.     }  
  401.   
  402.     /** 
  403.      * 判断是否应该滚动将右侧菜单展示出来。如果手指移动距离大于右侧菜单宽度的1/2,或者手指移动速度大于SNAP_VELOCITY, 
  404.      * 就认为应该滚动将右侧菜单展示出来。 
  405.      *  
  406.      * @return 如果应该将右侧菜单展示出来返回true,否则返回false。 
  407.      */  
  408.     private boolean shouldScrollToRightMenu() {  
  409.         return xDown - xUp > rightMenuLayoutParams.width / 2 || getScrollVelocity() > SNAP_VELOCITY;  
  410.     }  
  411.   
  412.     /** 
  413.      * 判断是否应该从左侧菜单滚动到内容布局,如果手指移动距离大于左侧菜单宽度的1/2,或者手指移动速度大于SNAP_VELOCITY, 
  414.      * 就认为应该从左侧菜单滚动到内容布局。 
  415.      *  
  416.      * @return 如果应该从左侧菜单滚动到内容布局返回true,否则返回false。 
  417.      */  
  418.     private boolean shouldScrollToContentFromLeftMenu() {  
  419.         return xDown - xUp > leftMenuLayoutParams.width / 2 || getScrollVelocity() > SNAP_VELOCITY;  
  420.     }  
  421.   
  422.     /** 
  423.      * 判断是否应该从右侧菜单滚动到内容布局,如果手指移动距离大于右侧菜单宽度的1/2,或者手指移动速度大于SNAP_VELOCITY, 
  424.      * 就认为应该从右侧菜单滚动到内容布局。 
  425.      *  
  426.      * @return 如果应该从右侧菜单滚动到内容布局返回true,否则返回false。 
  427.      */  
  428.     private boolean shouldScrollToContentFromRightMenu() {  
  429.         return xUp - xDown > rightMenuLayoutParams.width / 2 || getScrollVelocity() > SNAP_VELOCITY;  
  430.     }  
  431.   
  432.     /** 
  433.      * 创建VelocityTracker对象,并将触摸事件加入到VelocityTracker当中。 
  434.      *  
  435.      * @param event 
  436.      *            右侧布局监听控件的滑动事件 
  437.      */  
  438.     private void createVelocityTracker(MotionEvent event) {  
  439.         if (mVelocityTracker == null) {  
  440.             mVelocityTracker = VelocityTracker.obtain();  
  441.         }  
  442.         mVelocityTracker.addMovement(event);  
  443.     }  
  444.   
  445.     /** 
  446.      * 获取手指在绑定布局上的滑动速度。 
  447.      *  
  448.      * @return 滑动速度,以每秒钟移动了多少像素值为单位。 
  449.      */  
  450.     private int getScrollVelocity() {  
  451.         mVelocityTracker.computeCurrentVelocity(1000);  
  452.         int velocity = (int) mVelocityTracker.getXVelocity();  
  453.         return Math.abs(velocity);  
  454.     }  
  455.   
  456.     /** 
  457.      * 回收VelocityTracker对象。 
  458.      */  
  459.     private void recycleVelocityTracker() {  
  460.         mVelocityTracker.recycle();  
  461.         mVelocityTracker = null;  
  462.     }  
  463.   
  464.     /** 
  465.      * 使用可以获得焦点的控件在滑动的时候失去焦点。 
  466.      */  
  467.     private void unFocusBindView() {  
  468.         if (mBindView != null) {  
  469.             mBindView.setPressed(false);  
  470.             mBindView.setFocusable(false);  
  471.             mBindView.setFocusableInTouchMode(false);  
  472.         }  
  473.     }  
  474.   
  475.     class LeftMenuScrollTask extends AsyncTask<Integer, Integer, Integer> {  
  476.   
  477.         @Override  
  478.         protected Integer doInBackground(Integer... speed) {  
  479.             int rightMargin = contentLayoutParams.rightMargin;  
  480.             // 根据传入的速度来滚动界面,当滚动到达边界值时,跳出循环。  
  481.             while (true) {  
  482.                 rightMargin = rightMargin + speed[0];  
  483.                 if (rightMargin < -leftMenuLayoutParams.width) {  
  484.                     rightMargin = -leftMenuLayoutParams.width;  
  485.                     break;  
  486.                 }  
  487.                 if (rightMargin > 0) {  
  488.                     rightMargin = 0;  
  489.                     break;  
  490.                 }  
  491.                 publishProgress(rightMargin);  
  492.                 // 为了要有滚动效果产生,每次循环使线程睡眠一段时间,这样肉眼才能够看到滚动动画。  
  493.                 sleep(15);  
  494.             }  
  495.             if (speed[0] > 0) {  
  496.                 isLeftMenuVisible = false;  
  497.             } else {  
  498.                 isLeftMenuVisible = true;  
  499.             }  
  500.             isSliding = false;  
  501.             return rightMargin;  
  502.         }  
  503.   
  504.         @Override  
  505.         protected void onProgressUpdate(Integer... rightMargin) {  
  506.             contentLayoutParams.rightMargin = rightMargin[0];  
  507.             contentLayout.setLayoutParams(contentLayoutParams);  
  508.             unFocusBindView();  
  509.         }  
  510.   
  511.         @Override  
  512.         protected void onPostExecute(Integer rightMargin) {  
  513.             contentLayoutParams.rightMargin = rightMargin;  
  514.             contentLayout.setLayoutParams(contentLayoutParams);  
  515.         }  
  516.     }  
  517.   
  518.     class RightMenuScrollTask extends AsyncTask<Integer, Integer, Integer> {  
  519.   
  520.         @Override  
  521.         protected Integer doInBackground(Integer... speed) {  
  522.             int leftMargin = contentLayoutParams.leftMargin;  
  523.             // 根据传入的速度来滚动界面,当滚动到达边界值时,跳出循环。  
  524.             while (true) {  
  525.                 leftMargin = leftMargin + speed[0];  
  526.                 if (leftMargin < -rightMenuLayoutParams.width) {  
  527.                     leftMargin = -rightMenuLayoutParams.width;  
  528.                     break;  
  529.                 }  
  530.                 if (leftMargin > 0) {  
  531.                     leftMargin = 0;  
  532.                     break;  
  533.                 }  
  534.                 publishProgress(leftMargin);  
  535.                 // 为了要有滚动效果产生,每次循环使线程睡眠一段时间,这样肉眼才能够看到滚动动画。  
  536.                 sleep(15);  
  537.             }  
  538.             if (speed[0] > 0) {  
  539.                 isRightMenuVisible = false;  
  540.             } else {  
  541.                 isRightMenuVisible = true;  
  542.             }  
  543.             isSliding = false;  
  544.             return leftMargin;  
  545.         }  
  546.   
  547.         @Override  
  548.         protected void onProgressUpdate(Integer... leftMargin) {  
  549.             contentLayoutParams.leftMargin = leftMargin[0];  
  550.             contentLayout.setLayoutParams(contentLayoutParams);  
  551.             unFocusBindView();  
  552.         }  
  553.   
  554.         @Override  
  555.         protected void onPostExecute(Integer leftMargin) {  
  556.             contentLayoutParams.leftMargin = leftMargin;  
  557.             contentLayout.setLayoutParams(contentLayoutParams);  
  558.         }  
  559.     }  
  560.   
  561.     /** 
  562.      * 使当前线程睡眠指定的毫秒数。 
  563.      *  
  564.      * @param millis 
  565.      *            指定当前线程睡眠多久,以毫秒为单位 
  566.      */  
  567.     private void sleep(long millis) {  
  568.         try {  
  569.             Thread.sleep(millis);  
  570.         } catch (InterruptedException e) {  
  571.             e.printStackTrace();  
  572.         }  
  573.     }  
  574. }  
  575. 复制代码  
  576. 1  
  577. 2  
  578. 3  
  579. 4  
  580. 5  
  581. 6  
  582. 7  
  583. 8  
  584. 9  
  585. 10  
  586. 11  
  587. 12  
  588. 13  
  589. 14  
  590. 15  
  591. 16  
  592. 17  
  593. 18  
  594. 19  
  595. 20  
  596. 21  
  597. 22  
  598. 23  
  599. 24  
  600. 25  
  601. 26  
  602. 27  
  603. 28  
  604. 29  
  605. 30  
  606. 31  
  607. 32  
  608. 33  
  609. 34  
  610. 35  
  611. 36  
  612. 37  
  613. 38  
  614. 39  
  615. 40  
  616. 41  
  617. 42  
  618. 43  
  619. 44  
  620. 45  
  621. 46  
  622. 47  
  623. 48  
  624. 49  
  625. 50  
  626. 51  
  627. 52  
  628. 53  
  629. 54  
  630. 55  
  631. 56  
  632. 57  
  633. <com.example.slidermenu.SliderMenu   
  634.     xmlns:android="http://schemas.android.com/apk/res/android"  
  635.     xmlns:tools="http://schemas.android.com/tools"  
  636.     android:id="@+id/bidir_sliding_layout"  
  637.     android:layout_width="fill_parent"  
  638.     android:layout_height="fill_parent" >  
  639.    
  640.     <RelativeLayout  
  641.         android:id="@+id/left_menu"  
  642.         android:layout_width="270dip"  
  643.         android:layout_height="fill_parent"  
  644.         android:layout_alignParentLeft="true"  
  645.         android:background="#00ccff"  
  646.         android:visibility="invisible" >  
  647.    
  648.         <TextView  
  649.             android:layout_width="wrap_content"  
  650.             android:layout_height="wrap_content"  
  651.             android:layout_centerInParent="true"  
  652.             android:text="This is left menu"  
  653.             android:textColor="#000000"  
  654.             android:textSize="28sp" />  
  655.     </RelativeLayout>  
  656.    
  657.     <RelativeLayout  
  658.         android:id="@+id/right_menu"  
  659.         android:layout_width="270dip"  
  660.         android:layout_height="fill_parent"  
  661.         android:layout_alignParentRight="true"  
  662.         android:background="#00ffcc"  
  663.         android:visibility="invisible" >  
  664.    
  665.         <TextView  
  666.             android:layout_width="wrap_content"  
  667.             android:layout_height="wrap_content"  
  668.             android:layout_centerInParent="true"  
  669.             android:text="This is right menu"  
  670.             android:textColor="#000000"  
  671.             android:textSize="28sp" />  
  672.     </RelativeLayout>  
  673.    
  674.     <LinearLayout  
  675.         android:id="@+id/content"  
  676.         android:layout_width="320dip"  
  677.         android:layout_height="fill_parent"  
  678.         android:background="#e9e9e9" >  
  679.    
  680.         <ListView  
  681.             android:id="@+id/contentList"  
  682.             android:layout_width="fill_parent"  
  683.             android:layout_height="fill_parent"  
  684.             android:scrollbars="none"  
  685.             android:cacheColorHint="#00000000" >  
  686.         </ListView>  
  687.     </LinearLayout>  
  688.    
  689. </com.example.slidermenu.SliderMenu>  


可以看到,我们使用了自定义的SliderMenu作为根布局,然后依次加入了三个子布局分别作为左侧菜单、右侧菜单和内容的布局。左侧菜单和右侧菜单中都只是简单地放入了一个TextView用于显示一段文字,内容布局中放入了一个ListView。注意要让左侧菜单和父布局左边缘对齐,右侧菜单和父布局右边缘对齐。

上一篇: 用两种方法验证邮箱的合法性(最新) 下一篇: 没有下一篇了!
发表评论
用户名: 匿名