实现侧滑菜单, 自定义HorizontalScrollView,重写OnMeasure(),OnLayout();OnTouchEvent(); OnScrollChanged()这四个方法就能很简单的实现,代码如下:
public class SlidingMenu extends HorizontalScrollView {
private int applyDimension;
private LinearLayout mWapper;
private ViewGroup mMenu;
private ViewGroup mContent;
private int mScreenWidth;
private int mMenuWidth;
private boolean isSlideOut = false;
public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs);
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics Metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(Metrics);
mScreenWidth = Metrics.widthPixels;
applyDimension = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, context.getResources().getDisplayMetrics());
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWapper = (LinearLayout) getChildAt(0);
mMenu = (ViewGroup) mWapper.getChildAt(0);
mContent = (ViewGroup) mWapper.getChildAt(1);
mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth
- applyDimension;
mContent.getLayoutParams().width = mScreenWidth;
}
@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);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
float moveX = getScrollX();
// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
if (moveX > mScreenWidth / 2) {
this.smoothScrollTo(mMenuWidth, 0);
isSlideOut = false;
} else {
smoothScrollTo(0, 0);
isSlideOut = true;
}
return true;
}
return super.onTouchEvent(ev);
}
/**
* 向右滑出菜单
*/
public void slideinMenu() {
if (isSlideOut) {
this.smoothScrollTo(mMenuWidth, 0);
isSlideOut = false;
} else {
return;
}
}
/**
* 向左滑进菜单
*/
public void slideoutMenu() {
if (!isSlideOut) {
smoothScrollTo(0, 0);
isSlideOut = true;
} else {
return;
}
}
//对外暴露一个打开或缩放的方法
public void switchMenu() {
if (isSlideOut) {
slideinMenu();
} else {
slideoutMenu();
}
}
/*
发生滚动事件时调用,实现动画效果
*/
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
float scale = l * 1.0f / mMenuWidth;
float menuScale = 1.0f - scale * 0.3f;
float menuAlpha = 0.0f + 1.0f * (1 - scale);
float contentScale = 0.8f + 0.2f * scale;
// 调用属性动画,设置TranslationX
ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.8f);
// 左侧菜单的缩放
ViewHelper.setScaleX(mMenu, menuScale);
ViewHelper.setScaleY(mMenu, menuScale);
// 左侧菜单的透明度缩放
ViewHelper.setAlpha(mMenu, menuAlpha);
// 右侧内容的缩放
ViewHelper.setPivotX(mContent, 0);
ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);
ViewHelper.setScaleY(mContent, contentScale);
ViewHelper.setScaleX(mContent, contentScale);
}
}
自定义view代码如上,添加了侧滑时的动画效果,其他布局代码就不贴了.
Demo地址 :http://download.csdn.net/detail/qq_35578940/9801587
也可以看看HongYang大神的博客:
http://blog.csdn.net/lmj623565791/article/details/39185641