您的位置:首页 > 其它

侧滑菜单的实现

2016-04-15 11:34 274 查看
一般的侧滑的实现

ViewGroup Menu +Content

onTouchEvent

MOVE:ViewGroup的leftMargin

UP:根据现实菜单的宽度,决定将其隐藏或者现实:

1、Scroller

2、LeftMargin + Thread

今天,继承HorizontalScrollView

自定义ViewGroup

1、onMeasure

决定内部view(子view)的宽和高,以及呢,自己的宽和高

2、onLayout

决定view的 放置的位置

3、onTouchEvent

先简单的建立一个XML文件就是menu菜单的布局

然后创建一个slidingmenu继承自HorizontalScrollView

实现两个参数的构造方法

重写上面三个方法

public class SliddingMenu extends HorizontalScrollView {

private static final String WindowManager = null;

private LinearLayout mWapper;

private ViewGroup mMenu;

private ViewGroup mContent;

private int mScreenWidth;

private int mMenuWidth;

//dp

private int mMenuRightPadding = 50;

private boolean once;

/**

* 未使用自定义属性时,调用

* @param context

* @param attrs

*/

public SliddingMenu(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

WindowManager wm = (android.view.WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics outMetrics = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(outMetrics);

//获得屏幕的宽度

mScreenWidth = outMetrics.widthPixels;

//把dp转化为px

mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());

}

/**

* 设置子view的宽和高,设置自己的宽和高

*/

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

if (!once) {

mWapper = (LinearLayout) getChildAt(0);

mMenu = (ViewGroup) mWapper.getChildAt(0);

mContent = (ViewGroup) mWapper.getChildAt(1);

mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;

mContent.getLayoutParams().width = mScreenWidth;

once = true;

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

/**

* 通过设置偏移量,讲menu隐藏

*/

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

// TODO Auto-generated method stub

if (!changed) {

this.smoothScrollTo(mMenuWidth, 0);

}

super.onLayout(changed, l, t, r, b);

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

// TODO Auto-generated method stub

int action = ev.getAction();

switch (action) {

case MotionEvent.ACTION_UP:

int scrollX = getScrollX();

if (scrollX>=mMenuWidth/2) {

this.smoothScrollTo(mMenuWidth, 0);

}else {

this.smoothScrollTo(0, 0);

}

return true;

}

return super.onTouchEvent(ev);

}

}

布局文件

<com.example.sliddingmenudemo.view.SliddingMenu

android:layout_width="match_parent"

android:layout_height="match_parent" >

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:orientation="horizontal" >

<include layout="@layout/left_menu" >

</include>

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/qq" >

</LinearLayout>

</LinearLayout>

</com.example.sliddingmenudemo.view.SliddingMenu>





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: