import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
public class mySlidingMenu extends ViewGroup {
private View mMenu;
private View mContent;
private int mScreenWidth;
private int mScreenHeight;
private int menuWidth;
private int contentWidth;
public mySlidingMenu(Context context) {
this(context,null);
}
public mySlidingMenu(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public mySlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//获取屏幕的宽高
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//定义一下自己的宽高
int width = 0;
int height = 0;
//获取菜单栏,我这里是以 TextView 为例进行讲解
mMenu = getChildAt(0);
//获取内容栏
mContent = getChildAt(1);
//测量两个子代的宽高 只有测量了才能获取子代的宽高
measureChild(mMenu,widthMeasureSpec,heightMeasureSpec);
measureChild(mContent,widthMeasureSpec,heightMeasureSpec);
//设置菜单栏 内容栏的宽度,一般菜单栏要窄一点,所以要减去一个 400
menuWidth = mMenu.getLayoutParams().width = mScreenWidth - 400;
contentWidth = mContent.getLayoutParams().width = mScreenWidth;
//设置自定义ViewGroup的宽高 这里得首先获取 屏幕的宽高
width = menuWidth + contentWidth;
height = mScreenHeight;
setMeasuredDimension(width,height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mMenu.layout(-menuWidth,0,0,mScreenHeight);
mContent.layout(0,0,contentWidth,mScreenHeight);
}
}
做到这一步,我们的基础布局差不多可以出来了
实质图解
第四步:处理人机交互
谈到人机交互,必可少的 重写 onTouch() 事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//处理手指按下事件,主要是获取一下 按下时的位置,其实我们只用关心 X 方向
mStartX = (int) event.getX();
mStartY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) event.getX();
//获取手指移动了多少像素
int dx = endX - mStartX;
if (dx > 0){
//手指往右滑动了,其实这里大家并不用刻意去记,写的时候自己试一下,不行就反过来呗
if (getScrollX()-dx < -menuWidth){
//如果发现滑动距离超过了 菜单栏的宽度,直接滚动到 菜单栏边界
scrollTo(-menuWidth,0);
}else {
scrollBy(-dx,0);
}
}else {
//手指往左滑了
if (getScrollX()-dx > 0){
//如果发现滑动距离超过了 内容的宽度,直接滚动到 (0,0)
scrollTo(0,0);
}else {
scrollBy(-dx,0);
}
}
break;
}
return true;
}
写到这里,你的屏幕是可以滑动了的
第五步:优化,让体验感更好
优化一:判断手指抬起时页面是否划过 二分之一,然后决定页面的关闭
简单是实现,没有用scroller
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
、、、
case MotionEvent.ACTION_UP:
{
if (getScrollX() < -menuWidth/2){
scrollTo(-menuWidth,0);
}else {
scrollTo(0,0);
}
}
break;
}
return true;
}
使用scroller来实现
public mySlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
、、、
//创建一个 scroller
mScroller = new Scroller(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
、、、
写在最后
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~
如果你熟练掌握GitHub中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以在我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
(https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)阅读下载**,最后觉得有帮助、有需要的朋友可以点个赞
[外链图片转存中…(img-k3auXYlL-1646483813775)]
[外链图片转存中…(img-CqVO6bf4-1646483813776)]