1.MainActivity

package loveworld.slidingmenu;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 左側视图
View leftViewGroup = createLeftListView(); // 右側视图
View listView = createRightListView(); final SlidingMenu mSlidingMenu = new SlidingMenu(this);
mSlidingMenu.addLeftView(leftViewGroup);
mSlidingMenu.addRightView(listView); setContentView(mSlidingMenu);
} private View createLeftListView() {
LinearLayout linearLayout = new LinearLayout(getBaseContext());
linearLayout.setLayoutParams(new LayoutParams(300, LayoutParams.FILL_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL); TextView textViewOne = createTextView("俺是首页", Color.BLUE);
TextView textViewTwo = createTextView("。。 。 。。 。", Color.GRAY);
TextView textViewThree = createTextView("俺是导航", Color.BLUE);
TextView textViewFour = createTextView("俺有点丑", Color.GRAY);
TextView textViewFive = createTextView("俺是设置", Color.BLUE);
linearLayout.addView(textViewOne);
linearLayout.addView(textViewTwo);
linearLayout.addView(textViewThree);
linearLayout.addView(textViewFour);
linearLayout.addView(textViewFive); return linearLayout;
} private TextView createTextView(final String text, final int color) {
TextView textView = new TextView(getBaseContext());
textView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
textView.setText( text );
textView.setPadding(0, 50, 0, 50);
textView.setGravity(Gravity.CENTER);
textView.setBackgroundColor(color);
textView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
Toast.makeText(getBaseContext(), "click " + text, Toast.LENGTH_SHORT).show();
}
});
return textView;
} private View createRightListView() {
ListView listView = new ListView(this);
ArrayList<String> arrayList = new ArrayList<String>();
for (int i = 0; i < 30; i++) {
arrayList.add("World " + i);
}
CustomBaseAdapter customBaseAdapter = new CustomBaseAdapter(getBaseContext(), arrayList);
listView.setAdapter(customBaseAdapter);
listView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
listView.setDivider( new ColorDrawable(Color.BLACK) );
listView.setDividerHeight(1);
listView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
Toast.makeText(getBaseContext(), "World position = " + position, Toast.LENGTH_SHORT).show();
}
});
return listView;
} }

2.SlidingMenu

package loveworld.slidingmenu;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller; public class SlidingMenu extends ViewGroup { private View mRightView;
private View mLeftView;
private ScrollRunnable mScrollRunnable;
private int mTouchSlop; // 记录按下位置,用于推断当前滚动时向左还是向右
private int mInterceptMotionX = 0; // 记录一次移动位置,用于计算移动偏移量
private int mLastX; public SlidingMenu(Context context) {
super(context);
initSlidingMenu(context);
} public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initSlidingMenu(context);
} public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initSlidingMenu(context);
} public void addLeftView(View leftView) {
mLeftView = leftView;
// 由于Touch分发机制,即使右側视图盖住当前视图
// 仅仅要VISIBLE状态,都会先接收到Touch Event
mLeftView.setVisibility(View.INVISIBLE);
addView(leftView);
} /**
* 提供右側显示视图
*
* @param rightView
*/
public void addRightView(View rightView) {
mRightView = rightView; addView(rightView);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureChildren(widthMeasureSpec, heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthSize, heightSize);
} @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) { if (!changed) {
return;
} int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View childView = getChildAt(i); int measuredWidth = childView.getMeasuredWidth();
int measuredHeight = childView.getMeasuredHeight(); childView.layout(l, 0, l + measuredWidth, measuredHeight);
}
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { final int actioin = ev.getAction();
final int x = (int) ev.getX(); switch (actioin) {
case MotionEvent.ACTION_DOWN:
mInterceptMotionX = x;
break; case MotionEvent.ACTION_MOVE:
final int deltaX = x - mInterceptMotionX;
final int distance = Math.abs(deltaX);
// 点击区域必须在右側视图,由于仅右側视图可移动
// 横向移动超过一定距离,能够自己依据需求修改
if ( canSliding(ev) && distance > mTouchSlop * 2) { // 置为初始值
mLastX = x;
if (mScrollRunnable != null) {
mScrollRunnable.endScroll();
mScrollRunnable = null;
} // 拦截Touch Event 交由当前ViewGruop onTouchEvent处理
return true;
} break; case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mInterceptMotionX = 0;
break;
} return false;
} @Override
public boolean onTouchEvent(MotionEvent event) { final int x = (int) event.getX(); switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: scrollIfNeed(x);
return true; case MotionEvent.ACTION_UP: autoScrollIfNeed(x);
break;
} return false;
} private void initSlidingMenu(Context context) {
final ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = configuration.getScaledTouchSlop();
} /**
* 当前手指点击位置是否在右側视图区域内
*
* @param event
* @return true 能够滚动
*/
private boolean canSliding(MotionEvent event) { final int scrolledXInt = (int) (event.getX() + getScrollX());
final int scrolledYInt = (int) (event.getY() + getScrollY()); Rect frame = new Rect();
mRightView.getHitRect(frame);
if (frame.contains(scrolledXInt, scrolledYInt)) {
return true;
} return false;
} private void scrollIfNeed(final int x) {
// 计算与上次的偏移量
int deltaX = x - mLastX; // 降低移动次数
if (x != mLastX) {
// 显示
if (mLeftView.getVisibility() != View.VISIBLE) {
mLeftView.setVisibility(View.VISIBLE);
} int l = mRightView.getLeft();
int t = mRightView.getTop();
int b = mRightView.getBottom(); // 右側视图的滑动区域。仅仅能在左側视图范围内滑动
int rightViewLeft = Math.max(mLeftView.getLeft(), l + deltaX);
rightViewLeft = Math.min(mLeftView.getRight(), rightViewLeft); // 控制随手指滑动
mRightView.layout(rightViewLeft, t, rightViewLeft + mRightView.getWidth(), b);
} // 滑动到最左側
if (mRightView.getLeft() == mLeftView.getLeft()) {
mLeftView.setVisibility(View.INVISIBLE);
} // 记录当前值供下次计算
mLastX = x;
} private void autoScrollIfNeed(final int x) {
mScrollRunnable = new ScrollRunnable(); // 用于推断滑动方向
final int deltaX = x - mInterceptMotionX;
// x轴向右是依次递增与手指落下点差值,小于0说明是手指向左滑动
boolean moveLeft = deltaX <= 0; // 滑动距离超过左側视图一半,才会沿着手指方向滚动
final int distance = Math.abs(deltaX);
if (distance < mLeftView.getWidth() / 2) {
// 从哪来回哪去
moveLeft = !moveLeft;
} // 启动自己主动滚动
mScrollRunnable.startScroll(moveLeft);
} private class ScrollRunnable implements Runnable {
// 滚动辅助类,提供起始位置,移动偏移。移动总时间。能够获取每次滚动距离
private Scroller mScroller = new Scroller(getContext()); @Override
public void run() {
final Scroller scroller = mScroller;
// 计算滚动偏移,返回能否够接着滚动
boolean more = scroller.computeScrollOffset();
// 计算后获取须要滚动到的位置
final int x = scroller.getCurrX(); if (more) {
// 与手动滚动调用的方法同样
scrollIfNeed(x);
// 当前子线程已经运行完,可是须要接着滚动
// 所以把当前Runnable再次加入到消息队列中
post(this);
} else {
// 不须要滚动
endScroll();
} } private void startScroll(boolean moveLeft) {
// 滚动前设置初始值
mLastX = mRightView.getLeft(); int dx = 0; // 计算移动总距离
if (moveLeft) {
// 当前到左视图左側边界距离
dx = mLeftView.getLeft() - mRightView.getLeft();
} else {
// 到右側边界
dx = mLeftView.getRight() - mRightView.getLeft();
} // 開始滚动
mScroller.startScroll(mRightView.getLeft(), 0, dx, 0, 300);
// 把当前Runnable加入到消息队列中
post(this);
} private void endScroll() {
// 从消息队列中把当前Runnable删除,即停止滚动
removeCallbacks(this);
} }
}

3.CustomBaseAdapter

package loveworld.slidingmenu;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; /**
*
* getView第一个參数position从0開始
*
* date: 2011-11-10
*
*/
public class CustomBaseAdapter extends BaseAdapter
{ private Context mContext;
private ArrayList<String> mArrayList;
private LayoutInflater mLayoutInflater; public CustomBaseAdapter(Context context, ArrayList<String> pData)
{
mContext = context;
mArrayList = pData; mLayoutInflater = LayoutInflater.from(mContext);
} @Override
public View getView(int position, View convertView, ViewGroup parent)
{ // 常见的优化ViewHolder
ViewHolder viewHolder = null;
if (null == convertView)
{
convertView = mLayoutInflater.inflate(R.layout.listview_item, null); viewHolder = new ViewHolder();
viewHolder.content = (TextView) convertView
.findViewById(R.id.content);
viewHolder.contentIcon = (ImageView) convertView
.findViewById(R.id.content_icon); convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
} // 获取数据
viewHolder.content.setText(mArrayList.get(position));
viewHolder.contentIcon.setImageResource(R.drawable.ic_launcher); return convertView;
} @Override
public int getCount()
{
if (null != mArrayList)
{
return mArrayList.size();
}
else
{
return 0;
}
} @Override
public Object getItem(int position)
{
if (null != mArrayList && position < mArrayList.size())
{
return mArrayList.get(position);
}
else
{
return null;
}
} @Override
public long getItemId(int position)
{
return position;
} private class ViewHolder
{
TextView content;
ImageView contentIcon;
} }

4.listview_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/list_item_selector"
android:orientation="horizontal" > <ImageView
android:id="@+id/content_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"/> <TextView
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:layout_marginLeft="10dip"
android:textColor="@color/content_color" /> </LinearLayout>

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

SlidingMenu 左侧滑动菜单的更多相关文章

  1. Android UI(三)SlidingMenu实现滑动菜单(详细 官方)

    Jeff Lee blog:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks ...

  2. html页面添加左侧滑动菜单与内容部分的滚动条

    html + css + jquery 展示地址:https://migloo.gitee.io/front  或 https://www.igloo.xin/front 思路: 1.通过jquery ...

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

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

  4. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  5. Android 滑动菜单SlidingMenu

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

  6. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  7. Android开源库--SlidingMenu左右侧滑菜单

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/jfeinstein10/SlidingMenu   设置: 1.下载之后以依赖项的 ...

  8. wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题

    完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考. WeMall-Client/res/layout/wemall_main_ui.xml </RadioGroup&g ...

  9. bootstrap-简单实用的垂直手风琴滑动菜单列表特效

    前端: <html lang="zh"> <head> <meta charset="UTF-8"> <meta ht ...

随机推荐

  1. ios pop 折叠动画

    今天写了一个很有趣的电影太,我们可以去githoub下载. 这部动画是高级写作,我参考了它.而凝视,我希望你能看的懂. 各种动画.事实上,一些不起眼的开始.我也只是摸索. 我希望有更多的交流.[   ...

  2. 删CentOS / RHEL库和配置文件(Repositories and configuraiton files)

    1 删除库简介 随着root权限执行以下的命令: # cd /etc/yum.repos.d/ 列出全部库(repo) #ls CentOS-Base.repo epel.repo mirrors-r ...

  3. ShareSDK for Android 2.3.8它已发表

    ShareSDK for Android 2.3.8已经公布,本次更新内容包含: 1.一键分享加入"摇一摇截图分享"功能 3.优化一键分享截图分享功能 4.一键分享编辑页界面微调 ...

  4. Windows Phone 8.1 新功能 - 应用栏控件

    2014年4月3日的微软Build 2014 大会上.Windows Phone 8.1 正式公布. 相较于Windows Phone 8.不论从用户还是开发人员的角度,都产生了非常大的变化. 接下来 ...

  5. Oracle基于学习3--Oracle创建用户和授权

    Oracleserver端的操作,如以下一般: 1)       安装Oracleserver软件 2)       创建数据库(安装时自己主动创建) 3)       配置监听(安装时自己主动配置) ...

  6. 【C++探索之旅】第一部分第三课:第一个C++程序

    内容简介 1.第一部分第三课:第一个C++程序 2.第一部分第四课预告:内存的使用 第一个C++程序 经过上两课之后,我们已经知道了什么是编程,编程的语言,编程的必要软件,C++是什么,我们也安装了适 ...

  7. 如何知道 win10 的激活到期时间和期限等

    在“运行”里输入cmd,出来dos对话框后,输入下面的东西后,按Enterslmgr.vbs -dli (显示:操作系统版本.部分产品密钥.许可证状态)slmgr.vbs -dlv (显示:最为详尽的 ...

  8. 【转】java JTable排序和过滤

    JTable排序 在Java SE 6中除了java.awt被更新外,javax.swing同时也有了很大的改进.在C/S程序中我们会经常使 用到"表".如我们可以在查询数据库后将 ...

  9. 大哥可以写KMP该——达到strstr()

    在最后采访,面试官要求实现strstr(),当场就蒙了. 这个题目是模式匹配问题.<算法导论>里列出了几种字符串匹配算法: 朴素算法 |  Rabin-Karp | 有限自己主动机算法 | ...

  10. 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构

    前几天向大家介绍了一种用工具类生成数据表的方法,只是之前的方法须要使用一个跟项目关系不大的工具类.不免让人认为有些多余,所以呢.今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...