自定义View通过继承HorizontalScrollView来实现SlidingMenu的功能
其实这里面有两个布局,通过重写几个方法来回隐藏显示两个布局达到侧滑的效果。
原理是在LinearLayout外嵌套了HorizontalScrollView,而SlidingMenu继承HorizontalScrollView 重写onMeasure(),onLayout(),onTouchEvent()方法来实现最基本的功能。
下面是实现代码
/**
* Created by ylbf_dev on 2016/1/25.
*/
public class SlidingMenu extends HorizontalScrollView {
private int mScreenWidth;//屏幕宽度
private int mMenuRightPaddint = 50;//右边留出的宽度
private ViewGroup mMenu;//左边视图
private ViewGroup mContent;//右边视图
private int mMenuWidth;//左边视图宽度
private int mHalfMenuWidth;//左边视图宽度的一半
private boolean once;//是否已经初始化菜单
private Button button;//渐变菜单按钮
public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs);
mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;//得到屏幕的宽
}
/**
* 重新计算两个视图的宽度 默认显示右边的视图
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!once) {
LinearLayout child =(LinearLayout)getChildAt(0);
mMenu = (ViewGroup) child.getChildAt(0);//获得左边菜单视图
mContent = (ViewGroup) child.getChildAt(1);//获得右边主视图
button = (Button) mContent.getChildAt(0);
mMenuWidth = mScreenWidth - mMenuRightPaddint;//获得菜单宽度
mHalfMenuWidth = mMenuWidth / 2;
mMenu.getLayoutParams().width = mMenuWidth;//设置宽度
mContent.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;
}
}
/**
* 按钮切换的点击事件
*/
public void menuToggle() {
if (getScaleX() == 0) {//展示菜单
smoothScrollTo(mMenuWidth, 0);
} else if (getScaleX() == mMenuWidth) {//展示主界面
smoothScrollTo(0, 0);
}
}
/**
* 处理滑动超过一半
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();//得到水平滑动的距离
if (scrollX > mHalfMenuWidth) {
smoothScrollTo(mMenuWidth, 0);
} else {
smoothScrollTo(0, 0);
}
return true;
}
return super.onTouchEvent(ev);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
float scale = l * 1.0f / mMenuWidth;//原始值的范围
// ViewHelper 在开源动画库nineoldandroids中
ViewHelper.setAlpha(button,scale);
}
}
这篇博客介绍如何通过继承HorizontalScrollView创建自定义View,实现SlidingMenu的侧滑功能。内容包括嵌套布局的设计和重写关键方法以达到隐藏、显示布局的效果。
3719

被折叠的 条评论
为什么被折叠?



