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

5、扩展
嗯,就下来,我们完善下程序,我准备首先把菜单布局里面改成ListView来证明我们是没有冲突的;然后添加一个属性让用户配置菜单距离右边的边距的值;再对外公布一个方法,点击自动打开菜单,供用户点击某个按钮,菜单慢慢滑出来~

1、添加自定义属性
a、首先在values文件夹下新建一个attr.xml,写入以下内容:

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

<attr format="dimension" />

<declare-styleable>
        <attr />
    </declare-styleable>

</resources>

b、在布局中声明命名空间和使用属性

定义完了,肯定要使用么。

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

可以看到我们的命名空间:xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu" 是加上我们的包名;

我们的属性:zhy:rightPadding="100dp"这里我设置了100dp;

注:很多人问我,没有提示咋办,这样,你clean下项目,如果你运气好,就有提示了,嗯,运气好~

c、在我们自定义类中获得属性

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

TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
    R.styleable.SlidingMenu, defStyle, 0);
  int n = a.getIndexCount();
  for (int i = 0; i < n; i++)
  {
   int attr = a.getIndex(i);
   switch (attr)
   {
   case R.styleable.SlidingMenu_rightPadding:
    // 默认50
    mMenuRightPadding = a.getDimensionPixelSize(attr,
      (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 50f,
        getResources().getDisplayMetrics()));// 默认为10DP
    break;
   }
  }
  a.recycle();
 }

在三个参数的构造方法中,通过TypeArray获取就行了~

好了,这样就行了~如果你又很多自定义属性,按照上面的步骤来就行了~~

2、对外公布一个打开菜单的方法
首先定义一个boolean isOpen变量,用来标识我们当前菜单的状态~~然后记得在ACTION_UP的时候改变下状态:

case MotionEvent.ACTION_UP:
   int scrollX = getScrollX();
   if (scrollX > mHalfMenuWidth)
   {
    this.smoothScrollTo(mMenuWidth, 0);
    isOpen = false;
   } else
   {
    this.smoothScrollTo(0, 0);
    isOpen = true;
   }
   return true;
  }

下面开始添加方法:

/**
  * 打开菜单
  */
 public void openMenu()
 {
  if (isOpen)
   return;
  this.smoothScrollTo(0, 0);
  isOpen = true;
 }

/**
  * 关闭菜单
  */
 public void closeMenu()
 {
  if (isOpen)
  {
   this.smoothScrollTo(mMenuWidth, 0);
   isOpen = false;
  }
 }

/**
  * 切换菜单状态
  */
 public void toggle()
 {
  if (isOpen)
  {
   closeMenu();
  } else
  {
   openMenu();
  }
 }

顺手多添加了两个。。。

下面,我们挑一个进行测试:

主布局多添加一个按钮,用于触发toggleMenu()方法

主Activity

public class MainActivity extends Activity
{
 private SlidingMenu mMenu ;

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

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