Android侧滑菜单(最简)
来源:互联网 发布:淘宝店铺首页的作用 编辑:程序博客网 时间:2024/06/10 21:27
作为新手,对于侧滑菜单的使用,当然也是用最简单的实现方式。
一样的,首先来讲一下侧滑菜单的原理,其实很简单,就是关于屏幕的触碰事件,监听手指的移动来判断是显示菜单栏还是显示主页面,所以只需要在主页面横着放两个布局(一个菜单布局和一个主页面布局)即可,然后进行判断!
好了多的就不说了,上代码首先是主页面的布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <LinearLayout android:id="@+id/main_linear_menu" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView style="@style/text" android:text="右边菜单"/> </LinearLayout> <LinearLayout android:id="@+id/main_linear_content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView style="@style/text" android:text="主页面"/> </LinearLayout></LinearLayout>关于上面的style="@style/text"也贴出来供大家参考吧,其实大家完全可以自己写的,这个大家应该会的
<style name="text"> <item name="android:layout_height">wrap_content</item> <item name="android:layout_width">wrap_content</item> <item name="android:textColor">@color/red</item> <item name="android:textSize">18dp</item></style>最后便是重点了,主页面的滑动监听是显示主页面还是菜单页面,代码注释写的还算比较清楚就不多咯嗦了,大家看代码,有什么不懂的可以留言,有我时间会为大家解决的
public class MainActivity extends BaseActivity { public int screenWidth;//屏幕的宽度 public int leftEdge;//左边菜单的左边距 /** * menu布局的参数,通过此参数来更改leftMargin的值。 */ private LinearLayout.LayoutParams menuParams; public float xDown;//手指按下的横坐标 public float xMove;//手指移动的横坐标 public float xup;//手指抬起的横坐标 private boolean isMenuVisible; /** * 用于计算手指滑动的速度。 */ private VelocityTracker mVelocityTracker; /** * 滚动显示和隐藏menu时,手指滑动需要达到的速度。 */ public static final int SNAP_VELOCITY = 200; @InjectView(R.id.main_linear_menu) LinearLayout mainLinearMenu; @InjectView(R.id.main_linear_content) LinearLayout mainLinearContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); initValues(); /** * 监听主页面的滑动页面 */ mainLinearContent.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: xDown = event.getRawX(); break; case MotionEvent.ACTION_MOVE: xMove = event.getRawX(); if (isMenuVisible){ menuParams.leftMargin = (int)(xMove-xDown); }else{ menuParams.leftMargin = leftEdge+(int)(xMove-xDown); } if(menuParams.leftMargin<leftEdge){ menuParams.leftMargin=leftEdge; }else if(menuParams.leftMargin>0){ menuParams.leftMargin = 0; } mainLinearMenu.setLayoutParams(menuParams); break; case MotionEvent.ACTION_UP: xup = event.getRawX(); if(wantToShowMenu()){ if(shouldShowMenu()){ scrollToMenu(); }else{ scrollToContent(); } }else if(wantToShowContent()){ if(shouldShowContent()){ scrollToContent(); }else{ scrollToMenu(); } } recycleVelocityTracker(); break; } return true; } }); } //是否想去显示左边菜单 public boolean wantToShowMenu(){ return xup-xDown>0&&!isMenuVisible; } //是否能够显示左边菜单 public boolean shouldShowMenu(){ return xup-xDown>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY; } //滑动显示左边菜单 public void scrollToMenu(){ new ScrollTask().execute(30); } //是否想去显示主页面 public boolean wantToShowContent(){ return xup-xDown<0&&isMenuVisible; } //是否能够显示主页面 public boolean shouldShowContent(){ return xDown-xup+80>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY; } //滑动显示主页面 public void scrollToContent(){ new ScrollTask().execute(-30); } //滑动的速度 public int getScrollVelocity(){ mVelocityTracker.computeCurrentVelocity(1000); return Math.abs((int)mVelocityTracker.getXVelocity()); } /** * 回收VelocityTracker对象。 */ private void recycleVelocityTracker() { mVelocityTracker.recycle(); mVelocityTracker = null; } class ScrollTask extends AsyncTask<Integer,Integer,Integer>{ @Override protected Integer doInBackground(Integer... params) { int leftMargin = menuParams.leftMargin; while (true){ leftMargin+=params[0]; if(leftMargin>0){ leftMargin = 0; break; } if(leftMargin<leftEdge){ leftMargin = leftEdge; break; } publishProgress(leftMargin); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } if (params[0] > 0) { isMenuVisible = true; } else { isMenuVisible = false; } return leftMargin; } @Override protected void onProgressUpdate(Integer... leftMargin) { menuParams.leftMargin = leftMargin[0]; mainLinearMenu.setLayoutParams(menuParams); } @Override protected void onPostExecute(Integer leftMargin) { menuParams.leftMargin = leftMargin; mainLinearMenu.setLayoutParams(menuParams); } } /** * 初始化一些关键性数据。包括获取屏幕的宽度,给content布局重新设置宽度,给menu布局重新设置宽度和偏移距离等。 */ private void initValues() { screenWidth = getWindowManager().getDefaultDisplay().getWidth();//获取屏幕宽度 menuParams = (LinearLayout.LayoutParams)mainLinearMenu.getLayoutParams();//获取左边菜单的父容器 menuParams.width = screenWidth-80; leftEdge = -menuParams.width; menuParams.leftMargin = leftEdge; mainLinearContent.getLayoutParams().width = screenWidth; }这样侧滑菜单就实现了,如果有什么不懂的可以留言,我有时间会一一为大家做出解释的,如果对你有所帮助,请点个赞,谢谢!
2 0
- Android侧滑菜单(最简)
- Android最简单的引导页(基于Android侧滑菜单的改造)
- Android 侧滑菜单最简单的模板
- Android右菜单回弹效果(最简)
- android最简单菜单
- 最简单DrawerLayout侧滑菜单
- Android侧滑菜单
- Android 侧滑菜单
- Android侧滑菜单
- 【Android】侧滑菜单
- Android 侧滑菜单
- android侧滑菜单
- android 侧滑菜单
- android 侧滑菜单
- Android侧滑菜单
- android侧滑菜单
- Android 侧滑菜单实现(SlidingMenu)
- android侧滑菜单整理(一)
- TransformerFactory(示例,出错代码)
- 《笨办法学Python》 第39课手记
- Android Studio 小技巧合集
- IOS开发之常见bug
- Redis学习到实战(一)基础与入门
- Android侧滑菜单(最简)
- Filter过滤器的强大功能
- 算法学习--图论
- AOP的基本概念理解
- CF544C&51nod1086【限定个数的完全背包】
- block传值的简单实现
- Ant自动编译打包&发布 android项目
- 数据结构: 树
- Kerberos认证流程详解