import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
@SuppressLint("ClickableViewAccessibility")
public class LeftHideListView extends HorizontalScrollView {
/**
* 判断是否打开侧边栏
*/
private boolean isOpen;
/**
* 获取控件宽度
*/
private float mWidth;
/**
* 获取控件一半宽度
*/
private float mHalfWidth;
/**
* 屏幕dp,宽度
*/
private float mDp,mScreenWidth;
/**
* 手势
*/
private GestureDetector mGestureDetector;
public LeftHideListView(Context context) {
super(context);
init(context);
}
public LeftHideListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mGestureDetector = new GestureDetector(context, new YScrollDetector());
//获取屏幕数据
WindowManager wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
DisplayMetrics metric = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metric);
mDp = metric.density;
//屏幕宽度
mScreenWidth=metric.widthPixels;
//侧边栏宽度
mWidth = mDp * 120;
mHalfWidth = mWidth / 2;
}
/**
* 获取控件下的子控件,设置其宽度属性
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);
ViewGroup content = (ViewGroup) wrapper.getChildAt(1);
menu.getLayoutParams().width = (int) mWidth;
content.getLayoutParams().width = (int) 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);
this.scrollTo((int) mWidth, 0);
}
/**
* 判断滚动条的坐标,大于侧边栏宽度的一半则将其显示
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
if (scrollX > mHalfWidth) {
this.smoothScrollTo((int) mWidth, 0);
isOpen = false;
} else {
this.smoothScrollTo(0, 0);
isOpen = true;
}
return true;
}
return super.onTouchEvent(ev);
}
/**
* 手势事件
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev)
&&mGestureDetector.onTouchEvent(ev);
}
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
/**
* 如果我们滚动更接近水平方向,返回false,让子视图来处理它
*/
return (Math.abs(distanceX) > Math.abs(distanceY));
}
}
/**
* 关闭菜单
*/
public void closeMenu()
{
if (isOpen)
{
this.smoothScrollTo((int) mWidth, 0);
isOpen = false;
}
}
}
简单的侧边栏
最新推荐文章于 2021-08-02 17:19:21 发布