android的左右侧滑菜单实现
最近看了很多app应用都采用的是左右侧滑,比如网易新闻、凡客等
这里也试着写一下侧滑
首先看一下效果
然后给出xml布局代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <LinearLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <LinearLayout android:id="@+id/leftMenu" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/left_text" /> </LinearLayout> <LinearLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="fill_parent" android:id="@+id/layout01" android:layout_height="wrap_content" android:background="@drawable/bg_title" android:layout_alignParentTop="true" android:gravity="center" android:orientation="horizontal"> <ImageView android:id="@+id/leftBtn" android:layout_alignParentLeft="true" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="10dp" android:src="@drawable/home_category"/> <ImageView android:id="@+id/leftIcon" android:layout_toRightOf="@+id/leftBtn" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/title_icon_line"/> <TextView android:id="@+id/home_resource" android:text="@string/app_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="@dimen/title_size" android:textStyle="bold" android:padding="10dp" android:gravity="center"/> <ImageView android:id="@+id/rightIcon" android:layout_toLeftOf="@+id/rightBtn" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/title_icon_line"/> <ImageView android:id="@+id/rightBtn" android:padding="10dp" android:layout_alignParentRight="true" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/home_myvancl" /> </RelativeLayout> </LinearLayout> <LinearLayout android:id="@+id/rightMenu" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/right_text" /> </LinearLayout> </LinearLayout> </RelativeLayout>
接着写Activity
package com.example.viewdemo; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; /** * * TODO * @author cuiran * @version 1.0.0 */ public class MainActivity extends Activity implements OnClickListener{ private static final String TAG="MainActivity"; private LinearLayout leftMenu; private LinearLayout content; private LinearLayout rightMenu; private LayoutParams leftMenuParams; private LayoutParams contentParams; private LayoutParams rightMenuParams; // menu完全显示时,留给content的宽度值。 private static final int menuPadding = 120; private ImageView leftBtn,rightBtn; // 分辨率 private int disPlayWidth; private boolean mIsShow = false; private boolean mIsRightShow = false; private static final int speed = 50; public boolean isMenu=false; public boolean isRightMenu=false; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } /**初始化视图 * TODO */ private void initView() { // TODO Auto-generated method stub disPlayWidth = getWindowManager().getDefaultDisplay().getWidth(); leftMenu = (LinearLayout) findViewById(R.id.leftMenu); leftMenu.setOnClickListener(this); content = (LinearLayout) findViewById(R.id.content); content.setOnClickListener(this); rightMenu = (LinearLayout) findViewById(R.id.rightMenu); rightMenu.setOnClickListener(this); leftMenuParams = (LayoutParams) leftMenu.getLayoutParams(); contentParams = (LayoutParams) content.getLayoutParams(); rightMenuParams= (LayoutParams) rightMenu.getLayoutParams(); leftMenuParams.width = disPlayWidth - menuPadding; contentParams.width = disPlayWidth; rightMenuParams.width = disPlayWidth - menuPadding; leftBtn=(ImageView)findViewById(R.id.leftBtn); rightBtn=(ImageView)findViewById(R.id.rightBtn); leftBtn.setOnClickListener(this); rightBtn.setOnClickListener(this); showMenu(mIsShow); showRightMenu(mIsRightShow); } /** * 显示界面 * TODO * @param isShow */ private void showMenu(boolean isShow) { if (isShow) { mIsShow = true; leftMenuParams.leftMargin = 0; } else { mIsShow = false; leftMenuParams.leftMargin = 0 - leftMenuParams.width; } leftMenu.setLayoutParams(leftMenuParams); } private void showRightMenu(boolean isShow) { if (isShow) { mIsRightShow = true; contentParams.leftMargin = 0 ; } else { mIsRightShow = false; contentParams.leftMargin = 0; } content.setLayoutParams(contentParams); } /** * * TODO 控制左侧View * @author cuiran * @version 1.0.0 */ class showMenuAsyncTask extends AsyncTask<Integer, Integer, Integer> { @Override protected Integer doInBackground(Integer... params) { int leftMargin =leftMenuParams.leftMargin; Log.i(TAG, "leftMargin="+leftMargin); while (true) { leftMargin += params[0]; if (params[0] > 0 && leftMargin >= 0) { break; } else if (params[0] < 0 && leftMargin <= -leftMenuParams.width) { break; } Log.i(TAG, "doInBackground:leftMargin"+leftMargin); publishProgress(leftMargin); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } return leftMargin; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); leftMenuParams.leftMargin = values[0]; leftMenu.setLayoutParams(leftMenuParams); } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); leftMenuParams.leftMargin = result; leftMenu.setLayoutParams(leftMenuParams); } } /** * * TODO 控制右侧View * @author cuiran * @version 1.0.0 */ class showRightMenuAsyncTask extends AsyncTask<Integer, Integer, Integer> { @Override protected Integer doInBackground(Integer... params) { int leftMargin =contentParams.leftMargin; while (true) { leftMargin += params[0]; if (params[0] > 0 && leftMargin >= 0) { break; } else if (params[0] < 0 && leftMargin <= -contentParams.width+menuPadding) { break; } publishProgress(leftMargin); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } return leftMargin; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); contentParams.leftMargin = values[0]; content.setLayoutParams(contentParams); } @Override protected void onPostExecute(Integer result) { Log.i(TAG, "onPostExecute"); super.onPostExecute(result); contentParams.leftMargin = result; content.setLayoutParams(contentParams); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /* (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */ @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.leftMenu: isMenu=false; new showMenuAsyncTask().execute(-speed); break; case R.id.leftBtn: if(isMenu){ isMenu=false; new showMenuAsyncTask().execute(-speed); }else{ isMenu=true; new showMenuAsyncTask().execute(speed); } break; case R.id.rightBtn: Log.i(TAG, "点击rightBtn"); if(isRightMenu){ isRightMenu=false; new showRightMenuAsyncTask().execute(speed); }else{ isRightMenu=true; new showRightMenuAsyncTask().execute(-speed); } break; case R.id.content: break; } } }
源码下载地址为:https://github.com/cayden/viewdemo
android的左右侧滑菜单实现的更多相关文章
- Android之自定义侧滑菜单
先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...
- Android 高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问题
DrawerLayout预览 DrawerLayout主要功能就是 实现侧滑菜单效果的功能,并且可以通过增加一些设置来实现高大上的效果,那么就请看动态图: 注意左上角那个图标,有木有很好玩,哈哈. ...
- android文章学习 侧滑菜单实现
http://blog.csdn.net/jj120522/article/details/8075249 http://blog.csdn.net/lilybaobei/article/detail ...
- Android带侧滑菜单和ToolBar的BaseActivity
写Android的时候,可能有多个界面.在风格统一的软件中,写Activity时会有很多重复.例如我所在软工课程小组的项目:Github链接 ,里面的TaskListActivity和TeacherL ...
- 第三方侧滑菜单SlidingMenu在android studio中的使用
南尘:每天进步一点点! 前面讲了官方的侧滑菜单DrawerLayout的使用,其实早在官方没有推出这个之前,就有很多第三方的jar包如SlidingMenu等,感谢开源的力量. SlidingMenu ...
- Android侧滑菜单代码实现
前两天学习了hyman老师讲的Android侧滑菜单的实现,经过自己的整理分享出来给大家学习一下 现在很多APP都有菜单侧滑的功能,本篇文章主要讲解使用自定义的HorizontalScrollView ...
- Xamarin.Android中使用ResideMenu实现侧滑菜单
上次使用Xamarin.Android实现了一个比较常用的功能PullToRefresh,详情见:Xamarin. Android实现下拉刷新功能 这次将实现另外一个手机App中比较常用的功能:侧滑菜 ...
- Android DrawerLayout 高仿QQ5.2双向侧滑菜单
1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...
- android 应用架构随笔五(ActionBar与侧滑菜单DrawerLayout)
ActionBar(V7)的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,在Androi ...
随机推荐
- [sed]命令笔记
sed是linux下经常用到的工具,英文全名为stream editor. sed 在windows上的实现可以在这里找到 http://gnuwin32.sourceforge.net/packag ...
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- Hive-ORC文件存储格式
ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...
- Android 字体设置-Typeface讲解
控件的字体设置的两种方式 常用的字体类型名称还有: Typeface.DEFAULT //常规字体类型 Typeface.DEFAULT_BOLD //黑体字体类型 Typeface.MONOSPAC ...
- 【Netty源码分析】数据读取过程
首先客户端连接到服务端时服务端会开启一个线程,不断的监听客户端的操作.
- 14 fragment 创建
静态展示 注意 静态的开始进入界面的生命周期和动态的不同 详情:14 fragment注意点 步骤一:创建一个类继承 Fragment 代码类型一: package com.fmy.demo1; im ...
- 1086. Tree Traversals Again (25)
题目如下: An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For e ...
- bash与ksh数组使用
区别: bash与ksh在数组的使用中,最大的不同在于数组的定义. bash: declare -a arrayname ksh:set -A arrayname 其实,数组不用非要定义,在赋值的时候 ...
- Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题
以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257 IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后, ...
- Android初级教程:shape的基本用法
转载本文请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203347 点击打开链接 在自定义进度条之前,先来学习一下shape的用 ...