仿QQ6,程序员必学之一

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)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值