android 滑动侧边栏 SlideMenu 源码分析 以及使用手册

我们先看使用方案:

首先

public class MainActivity extends SlidingFragmentActivity

继承SlidingFragmentActivity ,这里面在创建时有创建需要的slidemenu等相关数据。

在Oncreate里面添加

private void init_sm() {

sm = getSlidingMenu();   // 获取menu

sm.setMode(SlidingMenu.LEFT_RIGHT);// 设置为左右都有

sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 设置为右边全屏模式

sm.setTouchModeBehind(SlidingMenu.TOUCHMODE_MARGIN);// 设置为左边边框模式

setBehindContentView(R.layout.slidingmenu_left);//左边布局

sm.setSecondaryMenu(R.layout.slidingmeun_right);//右边布局

sm.setRightBehindWidth(((MyApplication) getApplication())

.GetScreenWidth());// 使用这个将右侧布局到全屏

}

这里我们要详细说明的为TOUCHMODE_FULLSCREEN这个参数,设置为这个参数后,右侧的布局就没法响应滑动消息,因为全屏消息都被slidemenu处理掉了。

因此我们需要修改如下:

sm.addIgnoredView(mPager);

使用此方法忽略点击到mPager view的消息。

设置忽略后这时你就需要使用 setOnTouchListener 来自己接收响应触屏消息

mPager.setOnTouchListener(new OnTouchListener() {

private float startx = -1, starty = -1, OffsetWidth;

private boolean hasdown = false;

@Override

public boolean onTouch(View v, MotionEvent event) {

int action = event.getAction();

boolean returns = false;

if (action == MotionEvent.ACTION_DOWN) {

startx = event.getX();

starty = event.getY();

hasdown = true;

} else if (action == MotionEvent.ACTION_UP

|| action == MotionEvent.ACTION_CANCEL

|| action == MotionEvent.ACTION_MASK) {

float x = event.getX();

float y = event.getY();

float xdiff = Math.abs(x - startx);

float ydiff = Math.abs(y - starty);

if (!(-1 == startx && -1 == starty)) {

if (OffsetWidth < 1)

OffsetWidth = (float) (MyApplication

.getApplication().GetScreenWidth() * 0.15);

if (hasdown && xdiff > ydiff * 2.2

&& xdiff > OffsetWidth) {

if (x > startx)//

{

if (currIndex == 0) {

sm.toggle();

}

returns = false;

}// else if (startx > x)//

// {

// if (currIndex == length - 1

// && !sm.isSecondaryMenuShowing())

// sm.showSecondaryMenu();

// }

}

}

hasdown = false;

startx = starty = -1;

}

return returns;

}

});

当前做法是

if (currIndex == 0) {

sm.toggle();

}

使用这个退出侧边栏。左边是一个menu,简单布局,右边是个viewpage,所以滑动到最左侧时,再滑动退出viewpage,进入主界面。

showMenu 和showSecondaryMenu 来操作显示左右两侧的菜单栏

使用上就这些注意点即可。

mainactivity的xml文件为:

<FrameLayout 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="com.example.atemp.MainActivity"

tools:ignore="MergeRootFrame" >

<FrameLayout

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</FrameLayout>

</FrameLayout>

代码将container加入布局为:

FragmentTransaction t = this.getSupportFragmentManager()

.beginTransaction();

centerFragment = new SampleListFragment();

centerFragment.setcontext(MainActivity.this);

t.add(R.id.container, centerFragment);

t.commit();

-------------------------

下面来进行剖析源码:

首先,因为我们继承public class MainActivity extends SlidingFragmentActivity 所以先研究这个SlidingFragmentActivity

查看oncreate 函数

mHelper = new SlidingActivityHelper(this);

mHelper.onCreate(savedInstanceState);

这个为关键属性,后续很多接口都是透过它处理的。比如

public SlidingMenu getSlidingMenu() {

return mHelper.getSlidingMenu();

}

所以我们要去看SlidingActivityHelper这个类

看mHelper.onCreate(savedInstanceState);这个函数

public void onCreate(Bundle savedInstanceState) {

mSlidingMenu = (SlidingMenu) LayoutInflater.from(mActivity).inflate(R.layout.slidingmenumain, null);

}

创建了关键属性对象

R.layout.slidingmenumain 内容为:

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

<com.jeremyfeinstein.slidingmenu.lib.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/slidingmenumain"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

如此slidingMenu则出现了。

关键第二个函数:

onPostCreate

里面的方法:

mSlidingMenu.attachToActivity(mActivity,

mEnableSlide ? SlidingMenu.SLIDING_WINDOW : SlidingMenu.SLIDING_CONTENT);

将自己挂到activity的根view上去

看这一段:

case SLIDING_CONTENT:

mActionbarOverlay = actionbarOverlay;

// take the above view out of

ViewGroup contentParent = (ViewGroup) activity.findViewById(android.R.id.content);

View content = contentParent.getChildAt(0);

contentParent.removeView(content);

contentParent.addView(this);

setContent(content);

// save people from having transparent backgrounds

if (content.getBackground() == null)

content.setBackgroundResource(background);

break;

这里处理逻辑为:

contentParent.addView(this);

将slidemenu加入到这个contentview里面,将contentview作为当前activity的上下文使用 setContent(content);设置进来。

如此一来,此时slidemenu则会加进主界面。

随后消息则会先传给CustomViewAbove.java 和 CustomViewBehind.java 两个都是继承了viewgroup,所以可以多添加几个view。

因为slideingMenu把mViewAbove添加在后面,所以有优先响应消息权利。然后再依据setContent(content);把有slidemenu的布局设置进来,如此一来,

顶部消息则会传给它

在 CustomViewAbove 的  onInterceptTouchEvent 和 onTouchEvent 会处理各类消息,如此搭配起来,则最终实现左右侧边栏的功能。

主界面的container 触屏流程为:都不响应才会传给Touch up dispatch to com.jeremyfeinstein.slidingmenu.lib.CustomViewAbove

时间: 2024-11-06 20:38:54

android 滑动侧边栏 SlideMenu 源码分析 以及使用手册的相关文章

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

Android消息处理机制(源码分析)

前言 虽然一直在做应用层开发,但是我们组是核心系统BSP,了解底层了解Android的运行机制还是很有必要的.就应用程序而言,Android系统中的Java应用程序和其他系统上相同,都是靠消息驱动来工作的,它们大致的工作原理如下: 1. 有一个消息队列,可以往这个消息队列中投递消息. 2. 有一个消息循环,不断从消息队列中取出消息,然后处理 . 为了更深入的理解Android的消息处理机制,这几天空闲时间,我结合<深入理解Android系统>看了Handler.Looper.Message这几

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

Android异步消息传递机制源码分析&amp;&amp;相关知识常被问的面试题

1.Android异步消息传递机制有以下两个方式:(异步消息传递来解决线程通信问题) handler 和 AsyncTask 2.handler官方解释的用途: 1).定时任务:通过handler.postDelay(Runnable r, time)来在指定时间执行msg. 2).线程间通信:在执行较为耗时操作的时候,在子线程中执行耗时任务,然后handler(主线程的)把执行的结果通过sendmessage的方式发送给UI线程去执行用于更新UI. 3.handler源码分析 一.在Activ

Android之Volley框架源码分析

临近毕业,各种事情各种忙.我也没有认真专注写过博客,最近仔细看了Volley框架的使用及其源码,思前想后,想挑战一下自己,还是写一篇博客来分享,如有错误,欢迎吐槽. Volley简介 网络请求是一个App很重要的一部分,android系统只是提供了一个平台,而android应用则是基于这个平台上进行展示数据,起到与用户进行交互的作用,数据来源于服务端,而二者之间必须通过互联网进行传输数据,在Android系统发布初期,很多开发者都是在Apache协会的Http协议的基础上进行网络请求方法的封装,

Android 热修复 Tinker 源码分析之DexDiff / DexPatch

在上一篇文章中,我们介绍了Android 热修复 Tinker接入及源码浅析,里面包含了热修的一些背景知识,从tinker对dex文件的处理来看,源码大体上可以分为3部分阅读: 在应用中对patch的合并与加载,已经在上篇文章中详细介绍过了Android 热修复 Tinker接入及源码浅析 详细的dex patch,dex diff算法 tinker gradle plugin相关知识 tinker有个非常大的亮点就是自研发了一套dex diff.patch相关算法.本篇文章主要目的就是分析该算

MonkeyRunner和Android设备通讯方式源码分析

如前文<谁动了我的截图?--Monkeyrunner takeSnapshot方法源码跟踪分析>所述,本文主要会尝试描述android的自动化测试框架MonkeyRunner究竟是如何和目标设备进行通信的. 在上一篇文章中我们其实已经描述了其中一个方法,就是通过adb协议发送adb服务器请求的方式驱动android设备的adbd守护进程去获取FrameBuffer的数据生成屏幕截图.那么MonkeyRunner还会用其他方式和目标设备进行通信吗?答案是肯定的,且看我们一步步分析道来. 1.概述

Android事件分发机制源码分析

小小感慨一下,做android有一段时间了,一直以来都是习惯整理笔记存到有道笔记上,没有写博客的习惯.以后逐步分类整理出来,也算"复习"一遍了 - _ - . android的事件分发相关的方法有三个: 1.public booleandispatchTouchEvent(MotionEvent ev) 2.public boolean onInterceptTouchEvent(MotionEvent ev) 3.public booleanonTouchEvent(MotionEv

拨云见日---android异步消息机制源码分析

做过windows GUI的同学应该清楚,一般的GUI操作都是基于消息机制的,应用程序维护一个消息队列,开发人员编写对应事件的回调函数就能实现我们想要的操作 其实android系统也和windows GUI一样,也是基于消息机制,今天让我们通过源码来揭开android消息机制的神秘面纱 谈起异步消息,就不能不提及Handler,在安卓中,由于主线程中不能做耗时操作,所以耗时操作必须让子线程执行,而且只能在主线程(即UI线程)中执行UI更新操作,通过Handler发送异步消息,我们就能更新UI,一