侧滑菜单的实现
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>
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>
相关文章推荐
- 随堂笔记
- 数据存储和界面展现
- CTF之路2——calilinux安装教程
- python统计某一个进程名所占用的内存
- oracle client与ODAC的字符集
- 二叉搜索树的实现
- Google Map API V3开发(3)
- 编写一个进制转换器
- QT下使用MapX控件的问题以及Activex技术
- poj3947最长回文串
- 代码适配Masonry使用的详细介绍
- android MVC 框架的详解
- Node.js + MongoDB + AngularJS - 1
- inputView与inputAccessoryView的使用,即自定义控件的响应视图
- NodeJS、NPM安装配置步骤
- Eclipse常用快捷键,个人总结
- 产品经理技能之BRD的笔记之菜鸟入门
- Google Map API V3开发(2)
- Google Map API V3开发(1)
- php基于jquery的ajax技术传递json数据简单实例