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

侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现;多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~

1、原理分析

既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android提供的HorizontalScrollView呢~

如果使用HorizontalScrollView,还需要在ACTION_DOWN , ACTION_MOVE里面去监听,判断,不断改变控件位置了么? NO!!!HorizontalScrollView本身就带了滑动的功能~~

还需要自己的手动处理各种冲突么?NO!!!当然了,还是需要了解下事件分发机制的~~~

2、效果图

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

嗯,主界面搞了QQ一张图片,左边盗用了一兄弟的布局文件~~罪过~~ 谁有好看的布局、图片、图标神马的,可以给我发点,感激~

3、布局文件

<com.example.zhy_slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:scrollbars="none" >

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

<include layout="@layout/layout_menu" />

<LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@drawable/qq" >
        </LinearLayout>
    </LinearLayout>

</com.example.zhy_slidingmenu.SlidingMenu>

首先是我们的自定义View,里面一个方向水平的LinearLayout,然后就是一个是菜单的布局,一个是主布局了~

4、自定义SlidingMenu

接下来就是我们最核心的代码了~

package com.example.zhy_slidingmenu;

import android.content.Context;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

import com.zhy.utils.ScreenUtils;

public class SlidingMenu extends HorizontalScrollView
{
 /**
  * 屏幕宽度
  */
 private int mScreenWidth;
 /**
  * dp
  */
 private int mMenuRightPadding = 50;
 /**
  * 菜单的宽度
  */
 private int mMenuWidth;
 private int mHalfMenuWidth;

private boolean once;

public SlidingMenu(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  mScreenWidth = ScreenUtils.getScreenWidth(context);
 }

@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
 {
  /**
  * 显示的设置一个宽度
  */
  if (!once)
  {
   LinearLayout wrapper = (LinearLayout) getChildAt(0);
   ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);
   ViewGroup content = (ViewGroup) wrapper.getChildAt(1);
   // dp to px
   mMenuRightPadding = (int) TypedValue.applyDimension(
     TypedValue.COMPLEX_UNIT_DIP, mMenuRightPadding, content
       .getResources().getDisplayMetrics());

mMenuWidth = mScreenWidth - mMenuRightPadding;
   mHalfMenuWidth = mMenuWidth / 2;
   menu.getLayoutParams().width = mMenuWidth;
   content.getLayoutParams().width = mScreenWidth;

}
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override
 protected void onLayout(boolean changed, int l, int t, int r, int b)
 {
  super.onLayout(changed, l, t, r, b);
  if (changed)
  {
   // 将菜单隐藏
   this.scrollTo(mMenuWidth, 0);
   once = true;
  }
 }

@Override
 public boolean onTouchEvent(MotionEvent ev)
 {
  int action = ev.getAction();
  switch (action)
  {
  // Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
  case MotionEvent.ACTION_UP:
   int scrollX = getScrollX();
   if (scrollX > mHalfMenuWidth)
    this.smoothScrollTo(mMenuWidth, 0);
   else
    this.smoothScrollTo(0, 0);
   return true;
  }
  return super.onTouchEvent(ev);
 }

}

哈哈,完工~上面的演示图,就用到这么点代码~~

代码怎么样,短不短~除了设置宽度这些杂七杂八的代码~正在处理滑动的代码不过10行~~我说史上最简单不为过吧~

嗯,由于代码过于短,就不解释了,大家自己看下注释~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/205a940b619e6764caff7ee684b2d18e.html