Android实现滑动侧边栏

在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改。实现一个滑动侧边栏思路也很简单:

1.重写一个SlidingMenu类继承ViewGroup,病危该ViewGroup添加两个子布局,分别为菜单和主界面显示;

2.为了得到一个滑动的效果,选择Scroller帮助我们实现,配合ViewGroup下的computeScroll方法实现界面的更新;

3.利用一个boolean来记录菜单是否打开,在菜单打开的状态下向右滑动不会响应,在菜单关闭的情况向左滑动不会响应;

4.为了得到一个良好的交互,我们可以为界面滑动与手指移动的距离定义一个比例,如每次触摸事件发生,界面移动的距离仅为手指移动距离的一半;

下面是两张效果图,界面没怎么布局,大家凑合看

SlidingMenu实现代码:

package com.example.test; 

import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller; 

public class SlidingMenu extends ViewGroup { 

 private static final String TAG = SlidingMenu.class.getName(); 

 private enum Scroll_State {
  Scroll_to_Open, Scroll_to_Close;
 } 

 private Scroll_State state;
 private int mMostRecentX;
 private int downX;
 private boolean isOpen = false; 

 private View menu;
 private View mainView; 

 private Scroller mScroller; 

 private OnSlidingMenuListener onSlidingMenuListener; 

 public SlidingMenu(Context context, View main, View menu) {
  super(context);
  // TODO Auto-generated constructor stub
  setMainView(main);
  setMenu(menu);
  init(context);
 } 

 private void init(Context context) {
  mScroller = new Scroller(context);
 } 

 @Override
 protected void onLayout(boolean arg0, int l, int t, int r, int b) {
  // TODO Auto-generated method stub
  mainView.layout(l, t, r, b);
  menu.layout(-menu.getMeasuredWidth(), t, 0, b);
 } 

 public void setMainView(View view) {
  mainView = view;
  addView(mainView);
 } 

 public void setMenu(View view) {
  menu = view;
  addView(menu);
 } 

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // TODO Auto-generated method stub
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  mainView.measure(widthMeasureSpec, heightMeasureSpec);
  menu.measure(widthMeasureSpec - 150, heightMeasureSpec);
 } 

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   mMostRecentX = (int) event.getX();
   downX = (int) event.getX();
   break;
  case MotionEvent.ACTION_MOVE:
   int moveX = (int) event.getX();
   int deltaX = mMostRecentX - moveX;
   // 如果在菜单打开时向右滑动及菜单关闭时向左滑动不会触发Scroll事件
   if ((!isOpen && (downX - moveX) < 0)
     || (isOpen && (downX - moveX) > 0)) {
    scrollBy(deltaX / 2, 0);
   }
   mMostRecentX = moveX;
   break;
  case MotionEvent.ACTION_UP:
   int upX = (int) event.getX();
   int dx = upX - downX;
   if (!isOpen) {// 菜单关闭时
    // 向右滑动超过menu一半宽度才会打开菜单
    if (dx > menu.getMeasuredWidth() / 3) {
     state = Scroll_State.Scroll_to_Open;
    } else {
     state = Scroll_State.Scroll_to_Close;
    }
   } else {// 菜单打开时
    // 当按下时的触摸点在menu区域时,只有向左滑动超过menu的一半,才会关闭
    // 当按下时的触摸点在main区域时,会立即关闭
    if (downX < menu.getMeasuredWidth()) {
     if (dx < -menu.getMeasuredWidth() / 3) {
      state = Scroll_State.Scroll_to_Close;
     } else {
      state = Scroll_State.Scroll_to_Open;
     }
    } else {
     state = Scroll_State.Scroll_to_Close;
    }
   }
   smoothScrollto();
   break;
  default:
   break;
  }
  return true;
 } 

 private void smoothScrollto() {
  int scrollx = getScrollX();
  switch (state) {
  case Scroll_to_Close:
   mScroller.startScroll(scrollx, 0, -scrollx, 0, 500);
   if (onSlidingMenuListener != null && isOpen) {
    onSlidingMenuListener.close();
   }
   isOpen = false;
   break;
  case Scroll_to_Open:
   mScroller.startScroll(scrollx, 0,
     -scrollx - menu.getMeasuredWidth(), 0, 500);
   if (onSlidingMenuListener != null && !isOpen) {
    onSlidingMenuListener.close();
   }
   isOpen = true;
   break;
  default:
   break;
  }
 } 

 @Override
 public void computeScroll() {
  if (mScroller.computeScrollOffset()) {
   scrollTo(mScroller.getCurrX(), 0);
  }
  invalidate();
 } 

 public void open() {
  state = Scroll_State.Scroll_to_Open;
  smoothScrollto();
 } 

 public void close() {
  state = Scroll_State.Scroll_to_Close;
  smoothScrollto();
 } 

 public boolean isOpen() {
  return isOpen;
 } 

 public void setOnSlidingMenuListener(
   OnSlidingMenuListener onSlidingMenuListener) {
  this.onSlidingMenuListener = onSlidingMenuListener;
 } 

 public interface OnSlidingMenuListener {
  public void open(); 

  public void close();
 } 

} 

在MainActivity中进行调用

package com.example.test; 

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; 

public class MainActivity extends Activity { 

 private Button openButton;
 private Button closeButton;
 private SlidingMenu mSlidingMenu; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mSlidingMenu = new SlidingMenu(this, LayoutInflater
    .from(this).inflate(R.layout.fragment1, null), LayoutInflater
    .from(this).inflate(R.layout.fragment2, null));
  setContentView(mSlidingMenu);//注意setContentView需要换为我们的SlidingMenu
  openButton = (Button) findViewById(R.id.button1);
  closeButton = (Button) findViewById(R.id.button_close);
  openButton.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    mSlidingMenu.open();
   }
  });
  closeButton.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    mSlidingMenu.close();
   }
  });
 } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿360桌面手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我先说几句不相干的话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多高手喜欢把自己的经验写在网上,供大家来学习,我也是从中受惠了很多,在此我深表感谢.可是我发现我却从来没有将自己平时的一些心得拿出来与大家分享,共同学习,太没有奉献精神了.于是我痛定思痛,决定从今天开始写博客,希望可以指点在我后面的开发者,更快地进入Android开发者的行列当中. 好了,废话就说这么

  • Android开源组件SlidingMenu侧滑菜单使用介绍

    现在很多android应用都有侧滑菜单,效果很不错. GitHub上有SlidingMenu的开源库,使用起来很方便. SlidingMenu GitHub地址:https://github.com/jfeinstein10/SlidingMenu.GitHub上说,Sliding结合ActionBarSherlock使用功能可以更丰富,ActionBarSherlock GitHub地址:https://github.com/JakeWharton/ActionBarSherlock 附csd

  • 代码分析Android实现侧滑菜单

    Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单.最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout. 1.实现效果 2.动画类UgcAnimations package com.mmsx.base; import android.content.Context; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; import and

  • Android实现QQ手机管家悬浮小火箭效果

    今天是2013年的最后一天了,这里首先提前祝大家新年快乐!同时,本篇文章也是我今年的最后一篇文章了,因此我想要让它尽量有点特殊性,比起平时的文章要多一些特色.记得在今年年初的时候,我写的第一篇文章是模仿360手机卫士的桌面悬浮窗效果,那么为了能够首尾呼应,今年的最后一篇文章就同样还是来实现桌面悬浮窗的效果吧,当然效果将会更加高级. 相信用过QQ手机管家的朋友们都会知道它有一个小火箭加速的功能,将小火箭拖动到火箭发射台上发射就会出现一个火箭升空的动画,那么今天我们就来模仿着实现一下这个效果吧. 这

  • Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~ 1.原理分析 既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android

  • Android使用自定义PageTransformer实现个性的ViewPager动画切换效果

    1.概述 之前写过一篇博文:Android 自定义 ViewPager 打造千变万化的图片切换效果.有兄弟提出,ViewPager自带了一个setPageTransformer用于设置切换动画~ 本篇博文,将: 1.介绍如何使用setPageTransformer设置切换动画: 2.自定义PageTransformer实现个性的切换动画: 3.该方法在SDK11以下的版本不起作用,我们会对其做一定修改,让其向下兼容. 官方示例地址:http://developer.android.com/tra

  • Android滑动优化高仿QQ6.0侧滑菜单(滑动优化)

     推荐阅读:Android使用ViewDragHelper实现仿QQ6.0侧滑界面(一) 但是之前的实现,只是简单的可以显示和隐藏左侧的菜单,但是特别生硬,而且没有任何平滑的趋势,那么今天就来优化一下吧,加上平滑效果,而且可以根据手势滑动的方向来判断是否是显示和隐藏. 首先先来实现手势判断是否隐藏和显示 这里就要用到了一个方法了,如下: 这个是ViewDradHelper里面的方法: /** * 当view被释放的时候处理的事情(松手) * * @param releasedChild 被释放的

  • Android实现原生侧滑菜单的超简单方式

    先来看看效果图 当你点击菜单可以更改图标,例如点击happy,首页就会变一个笑脸,这个实现的过程超级简单 你需要使用ToolBar与DrawableLayout两个比较新的控件 首先要写三个xml布局文件,我这里的布局文件是使用了include标签嵌入的,代码如下 headbar_toolbar.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar

  • Android仿人人网滑动侧边栏效果

    很多应用为了节省空间而又使界面能够充足的显示信息,大多数应用都采用了侧边栏的方式,如下图: 来说说它的思路,底下是两个或多个视图,分别通过控制它们的宽度.左边距来控制它们的显示,来看看代码 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

  • Android仿人人客户端滑动菜单的侧滑菜单效果

    人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示. 据说人人客户端的这个特效是从facebook客户端模仿来的,至于facebook是不是又从其它地方模仿来的就不得而知了.好,今天我们就一起来实现这个效果,总之我第一次看到这个特效是在人人客户端看到的,我也就主观性地认为我是在模仿人人客户端的特效了. 虽然现在网上类似这种效果的实现也非常多,可是我发现实现方案大都非常复杂,并不容易理解.但其实这种效果并不难

随机推荐