在这里实现了两个滑动菜单效果,的拖放内容的第一部分,菜单拖出像这样的效果感觉,另一种是拖动内容。后面的内容固定菜单。我感觉有层次感的效果,如下面

第一种效果的代码实现例如以下:

package com.tenghu.customsideslip.menu.view;

import android.content.Context;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout; /**
* Created by Arvin_Li on 2014/11/19.
*/
public class ScrollSideslipMenu extends LinearLayout{ private static final int SNAP_VELOCITY=200;//速度阈值
private View mMenu;//菜单布局
private View mContent;//内容布局 private int screenWidth;//屏幕宽度
private int menuWidth;//菜单宽度 private int leftEdge;//左边界
private int rightEdge=0;//右边界。值恒为0 private float xUp;//手指抬起时记录横坐标
private float xDown;//手指按下时记录横坐标
private float xMove;//手指移动时记录横坐标 private int toRightPaddingWidth=50;//菜单全然显示时,留给内容的宽度
private LayoutParams menuParams;//菜单布局參数 private boolean once=false;//初始化数据仅仅载入一次
private boolean isShowMenu;//是否显示菜单 private VelocityTracker velocityTracker;//速度跟踪器 public ScrollSideslipMenu(Context context) {
super(context);
initWindowWidth(context);
} public ScrollSideslipMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initWindowWidth(context);
} /**
* 初始化获取屏幕宽度
*/
private void initWindowWidth(Context context){
WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics=new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
//获取屏幕宽度
screenWidth=displayMetrics.widthPixels;
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!once){
mMenu=this.getChildAt(0);//获取菜单布局
mContent=this.getChildAt(1);//获取内容布局
menuParams= (LayoutParams) mMenu.getLayoutParams();//获取菜单布局參数
menuWidth=menuParams.width=screenWidth-toRightPaddingWidth;//设置菜单宽度
mContent.getLayoutParams().width=screenWidth;//设置内容宽度
leftEdge=-menuWidth;//左边界
menuParams.leftMargin=leftEdge;//默认菜单不显示
once=true;
}
} @Override
public boolean onTouchEvent(MotionEvent event) {
createVelocityTracker(event);
switch (event.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
xDown=event.getRawX();//记录按下时的横坐标
break;
//移动
case MotionEvent.ACTION_MOVE:
//记录移动时的横坐标
xMove=event.getRawX();
//计算移动时与按下时的距离
int moveDistanceX= (int) (xMove-xDown);
if(isShowMenu){
menuParams.leftMargin=moveDistanceX;
}else{
menuParams.leftMargin=leftEdge+moveDistanceX;
} if(menuParams.leftMargin<leftEdge){
menuParams.leftMargin=leftEdge;
} if(menuParams.leftMargin>rightEdge){
menuParams.leftMargin=rightEdge;
} mMenu.setLayoutParams(menuParams);//设置參数
break;
//抬起
case MotionEvent.ACTION_UP:
//记录抬起时的横坐标
xUp=event.getRawX();
//计算抬起时与按下时的距离
int upDistanceX= (int) (xUp-xDown);
if(upDistanceX>0&&!isShowMenu){
if(upDistanceX>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){
scrollToMenu(); }else{
scrollToContent();
}
}else if(upDistanceX<0&&isShowMenu){
if(Math.abs(upDistanceX)>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){
scrollToContent();
}else{
scrollToMenu();
}
}
mMenu.setLayoutParams(menuParams);
break;
}
return true;
} /**
* 滚动内容部分
*/
private void scrollToContent(){
new ScrollTask().execute(-30);
} /**
* 滚动菜单部分
*/
private void scrollToMenu(){
new ScrollTask().execute(30);
} /**
* 创建速度阈值
*/
private void createVelocityTracker(MotionEvent event){
if(null==velocityTracker){
velocityTracker=VelocityTracker.obtain();
}
velocityTracker.addMovement(event);
} /**
* 获取滚动时的速度
* @return
*/
private int getScrollVelocity(){
velocityTracker.computeCurrentVelocity(1000);
int velocity= (int) velocityTracker.getXVelocity();//获取横向速度
return Math.abs(velocity);
} /**
* 创建一个异步滚动任务
*/
class ScrollTask extends AsyncTask<Integer,Integer,Integer>{ @Override
protected Integer doInBackground(Integer... params) {
int leftMargin=menuParams.leftMargin;
while(true){
leftMargin=leftMargin+params[0];
if(leftMargin<leftEdge){
leftMargin=leftEdge;
break;
}
if(leftMargin>rightEdge){
leftMargin=rightEdge;
break;
}
publishProgress(leftMargin);
sleep(20);
} if(params[0]>0){
isShowMenu=true;
}else{
isShowMenu=false;
}
return leftMargin; } /**
* 运行结束
* @param integer
*/
@Override
protected void onPostExecute(Integer integer) {
menuParams.leftMargin=integer;
mMenu.setLayoutParams(menuParams);
} /**
* 运行doInBackground中的publishProgress调用该方法
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
menuParams.leftMargin=values[0];
mMenu.setLayoutParams(menuParams);
}
} /**
* 当前线程睡眠多少毫秒
* @param millis
*/
private void sleep(long millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?

>
<com.tenghu.customsideslip.menu.view.ScrollSideslipMenu xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@drawable/bg_01">
<!--引用菜单布局文件-->
<include layout="@layout/left_menu"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_02"></LinearLayout>
</com.tenghu.customsideslip.menu.view.ScrollSideslipMenu>

另外一种效果实现:

package com.tenghu.customsideslip.menu.view;

import android.content.Context;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout; /**
* Created by Arvin_Li on 2014/11/19.
*/
public class CustomSideslipMenu extends RelativeLayout {
private static final int SNAP_VELOCITY=200;//手势滑动的速度
//屏幕宽度
private int mScreenWidth;
//菜单布局
private View mMenu;
//主体内容部分
private View mContent;
//声明菜单宽度
private int menuWidth;
//菜单全然显示时。留给内容部分的宽度
private int toRightPaddingWidth=50;
//主体内容布局參数
private LayoutParams contentParams;
//主体内容滑动到左边缘,由菜单宽度来决定
private int leftEdge;
//菜单显示时。主体内容到右边界,值恒为0
private int rightEdge=0;
private VelocityTracker velocityTracker;//声明速度跟踪器
private float xDown;//记录手指按下的横坐标
private float xUp;//记录手指抬起时的横坐标
private float xMove;//记录手指移动时的横坐标
private boolean once=false;//仅仅运行一次
private boolean isShowMenu=true;//是否显示菜单
public CustomSideslipMenu(Context context) {
super(context);
init(context);
} public CustomSideslipMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
} /**
* 初始化
*/
private void init(Context context){
//获取窗体管理类
WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//创建DisplayMetrics
DisplayMetrics displayMetrics=new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
//获取屏幕宽度
mScreenWidth=displayMetrics.widthPixels;
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!once){
//获取菜单布局
mMenu=this.getChildAt(0);
//获取主体内容布局
mContent=this.getChildAt(1);
contentParams= (LayoutParams) mContent.getLayoutParams();//获取主体菜单參数
//菜单宽度
menuWidth=mMenu.getLayoutParams().width=mScreenWidth-toRightPaddingWidth;
//设置主体内容的宽度
mContent.getLayoutParams().width=mScreenWidth;
leftEdge=menuWidth;//设置左边界
once=true;
}
} @Override
public boolean onTouchEvent(MotionEvent event) {
//调用创建速度跟踪器
createVelocityTracker(event);
switch (event.getAction()){
//手指按下
case MotionEvent.ACTION_DOWN:
xDown=event.getRawX();
break;
//手指移动
case MotionEvent.ACTION_MOVE:
xMove=event.getRawX();
//计算移动距离
int distanceX= (int) (xMove-xDown);
if(isShowMenu){
contentParams.leftMargin=distanceX;
contentParams.rightMargin=-distanceX;
}else{
contentParams.leftMargin=leftEdge+distanceX;
} if(contentParams.leftMargin>leftEdge){
contentParams.leftMargin=leftEdge;
contentParams.rightMargin=-leftEdge;
} if(contentParams.leftMargin<rightEdge){
contentParams.leftMargin=rightEdge;
contentParams.rightMargin=rightEdge;
}
mContent.setLayoutParams(contentParams);//測试參数
break;
//手指抬起
case MotionEvent.ACTION_UP:
xUp=event.getRawX();//手指抬起时横坐标
//计算抬起时与按下时的距离
int upDistanceX=(int) (xDown-xUp);
if(upDistanceX>0&&!isShowMenu){
if(upDistanceX>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){
scrollToMenu();
}else{
scrollToContent();
}
}else if(upDistanceX<0&&isShowMenu){
if(Math.abs(upDistanceX)>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){
scrollToContent();
}else{
scrollToMenu();
}
//手指抬起时销毁
recycleVelocityTracker();
}
break;
}
return true;
} /**
* 滚动菜单
*/
private void scrollToMenu(){
new ScrollTask().execute(-30);
} /**
* 滚动内容
*/
private void scrollToContent(){
new ScrollTask().execute(30);
} /**
* 获取速度
* @return
*/
private int getScrollVelocity(){
velocityTracker.computeCurrentVelocity(1000);
int velocity= (int) velocityTracker.getXVelocity();
return Math.abs(velocity);
} /**
* 销毁速度跟踪器
*/
private void recycleVelocityTracker(){
if (null != velocityTracker) {
velocityTracker.recycle();
velocityTracker = null;
}
} /**
* 创建速度跟踪器
*/
private void createVelocityTracker(MotionEvent event){
if(null==velocityTracker){
velocityTracker=velocityTracker.obtain();
}
velocityTracker.addMovement(event);
} /**
* 创建异步滚动任务类
*/
class ScrollTask extends AsyncTask<Integer,Integer,Integer>{ @Override
protected Integer doInBackground(Integer... params) {
int leftMargin=contentParams.leftMargin;
while(true){
leftMargin=leftMargin+params[0];
if(leftMargin>leftEdge){
leftMargin=leftEdge;
break;
} if(leftMargin<rightEdge){
leftMargin=rightEdge;
break;
}
if(params[0]<0){
isShowMenu=true;
// leftMargin=rightEdge;
}else{
isShowMenu=false;
}
publishProgress(leftMargin);
sleep(20);
}
return leftMargin;
} @Override
protected void onProgressUpdate(Integer... values) {
contentParams.leftMargin=values[0];
contentParams.rightMargin=-values[0];
mContent.setLayoutParams(contentParams);
} @Override
protected void onPostExecute(Integer integer) {
contentParams.leftMargin=integer;
contentParams.rightMargin=-integer;
mContent.setLayoutParams(contentParams);
}
} /**
* 当前线程睡眠多少毫秒
* @param millis
*/
private void sleep(long millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

布局文件:

<com.tenghu.customsideslip.menu.view.CustomSideslipMenu 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"
android:background="@drawable/bg_01"
tools:context=".MainActivity"> <include layout="@layout/left_menu" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_02"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="testScrollMenu"
android:text="測试另外一种側滑菜单"/>
</LinearLayout>
</LinearLayout>
</com.tenghu.customsideslip.menu.view.CustomSideslipMenu>

菜单布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:orientation="vertical"> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginBottom="10dp"> <ImageView
android:id="@+id/iv_img_01"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@drawable/app_01" /> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_img_01"
android:gravity="center_vertical"
android:text="第一个Item" />
</RelativeLayout> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginBottom="10dp"> <ImageView
android:id="@+id/iv_img_02"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@drawable/app_02" /> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_img_02"
android:gravity="center_vertical"
android:text="第二个Item" />
</RelativeLayout> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginBottom="10dp"> <ImageView
android:id="@+id/iv_img_03"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@drawable/app_03" /> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_img_03"
android:gravity="center_vertical"
android:text="第三个Item" />
</RelativeLayout> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginBottom="10dp"> <ImageView
android:id="@+id/iv_img_04"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@drawable/app_04" /> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_img_04"
android:gravity="center_vertical"
android:text="第四个Item" />
</RelativeLayout> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginBottom="10dp"> <ImageView
android:id="@+id/iv_img_05"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@drawable/app_05" /> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_img_05"
android:gravity="center_vertical"
android:text="第五个Item" />
</RelativeLayout> </LinearLayout>
</RelativeLayout>

这里的菜单,能够是用ListView来布局,做測试就没有那样做了。所有代码所有在这里了。能够看出。两种效果仅仅是继承了不通的布局,感觉另外一种效果在设置背景时有点问题,就是在这里

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_02"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="testScrollMenu"
android:text="測试另外一种側滑菜单"/>
</LinearLayout>
</LinearLayout>

假设将背景设置到第一层的LinearLayout上,那么自己定义側滑菜单那里设置背景就显示不出来,设置到第二层就能够,我不知道是怎么回事肿。假设我们掌握发现,麻烦告诉小弟。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

它们的定义android滑动菜单的更多相关文章

  1. Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744400 之前我向大家介绍了史上最简单的滑动菜单的实现方式,相信大家都还记得.如 ...

  2. Android 滑动菜单SlidingMenu

    首先我们看下面视图: 这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对GestureDetect ...

  3. Android 滑动菜单框架--SwipeMenuListView框架完全解析

    SwipeMenuListView(滑动菜单) A swipe menu for ListView.--一个非常好的滑动菜单开源项目. Demo 一.简介 看了挺长时间的自定义View和事件分发,想找 ...

  4. android ——滑动菜单

    一.DrawerLayout是一个拥有两个子控件的布局,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容: <android.support.v4.widget.Drawer ...

  5. android 滑动菜单SlidingMenu的实现

    首先我们看下面视图:       这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对Gesture ...

  6. Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现

    http://blog.csdn.net/guolin_blog/article/details/8714621 http://blog.csdn.net/lmj623565791/article/d ...

  7. Android滑动菜单使用(MenuDrawer和SlidingMenu)

    项目地址: https://github.com/gokhanakkurt/android-menudrawer   https://github.com/jfeinstein10/SlidingMe ...

  8. Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个 ...

  9. Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

    PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Gith ...

随机推荐

  1. andriod 在windows配置环境

    andriod开发环境配置 个人信息:就读于燕大本科软件project专业 眼下大四; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将 ...

  2. cocos2dx 3.x Value、Vector和Map意识

    1. Value cocos2d::Value 这包括一个非常大的数字原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外 加s ...

  3. 远程访问mysql(转)

    GRANT ALL PRIVILEGES ON *.* TO '<username>'@'<remote addr or %(for all ip addr)>'IDENTIF ...

  4. TCP/IP 网络编程(六)

    流程模型: 线程模型: 线程的创建和运行流程 #include <pthread.h> int pthread_create(pthread_t * restrict thread, co ...

  5. KMP算法(转)

    KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个 ...

  6. Oracle经常使用函数

    Oracle经常使用函数 --TRUNC,TO_DATE,TO_CHAR,TO_NUMBER, SUBSTR,REPLACE.NVL .TRIM,wm_concat,upper, lower,leng ...

  7. Jquery 分页插件 Jquery Pagination

    Jquery 分页插件 Jquery Pagination 分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也 ...

  8. 写你自己 android 多通道打包工具 可以包libs和.so文件

    android上传应用程序,需要区分各个信道. 通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率. 在这个课堂上分享一个打包工具.也可在网上类似 ...

  9. windows平台下载android源代码

    最近观看<android核心分析>,所以很多细节都没有详细看代码很难理解.请记住,印象不深.感觉是最好再一起去的源代码,返回下载android源代码,遇到了许多问题,最后开始下载.合并流程 ...

  10. DevExpress XtraReports 入门一 创建 Hello World 报表

    原文:DevExpress XtraReports 入门一 创建 Hello World 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更 ...