欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android_UI 仿QQ侧滑菜单效果的实现

程序员文章站 2022-05-07 11:30:56
相信大家对qq侧滑菜单的效果已经不陌生了吧,侧滑进入个人头像一侧,进行对头像的更改,我的收藏,qq钱包,我的文件等一系列的操作,今天呢,主要是实现进入侧滑菜单的这一效果原理...

相信大家对qq侧滑菜单的效果已经不陌生了吧,侧滑进入个人头像一侧,进行对头像的更改,我的收藏,qq钱包,我的文件等一系列的操作,今天呢,主要是实现进入侧滑菜单的这一效果原理进行分析.

Android_UI 仿QQ侧滑菜单效果的实现 

主要思路分析

1.首先写一个slidemenu 继承一个帧布局framelayout ,因为如果继承自viewgroup的话,需要我们自己来实现onmeasure方法,而该方法的实现一般比较麻烦且没有必要,所以选择继承系统的已有的控件framelayout,不用其他控件是因为framelayout最轻量级

2.在布局文件中给slidemenu添加2个子布局,分别是菜单的布局和主界面的布局

3.移动view的方法总结

通过改变view的scroll的坐标来移动:
scrollto(x,y);//滚动到指定位置
scrollby(xoffset,yoffset);//滚动多少距离
通过改变view在父view中的布局的位置:
offsetleftandright(offset);//同时更改view的left和right
offsettopandbottom(offset);//同时更改view的top和bottom
layout(l,t,r,b);

4.viewdraghelper 类的介绍

谷歌在2013年i/o开发者大会上提出;

专门用于在viewgroup中对子view进行拖拽处理;

在19(android4.4)以及以上的v4包中;

本质是封装了对触摸事件的解析,包括触摸位置,触摸速度以及scroller的封装,只需要我们在回调方法中指定是否移动,移动多少等等,但是需要注意的是:它只是一个触摸事件的解析类(如gesturedecetor),所以需要我们传递给它触摸事件,它才能工作;

开始创建viewdraghelper对象

viewdraghelper viewdraghelper = viewdraghelper.create(this, callback);

draghelper 只是触摸事件的解析类,需要将触摸事件传递给它才能工作

1)_触摸事件: 将触摸事件传递给viewdraghelper 来解析

Android_UI 仿QQ侧滑菜单效果的实现

2)_判断是否需要拦截触摸事件

Android_UI 仿QQ侧滑菜单效果的实现

3)_初始化子view的引用

Android_UI 仿QQ侧滑菜单效果的实现

4)_初始化宽高.在onsizechanged方法中初始化宽高,因为该方法在onmeasure之后执行

Android_UI 仿QQ侧滑菜单效果的实现

其中这里调用getmeasurewidth() 方法与分别获取左侧菜单的宽,主页面的宽的作用是一样的.

实现viewdraghelper.callback 的监听事件

监视view的触摸事件,这里需要考虑到,当进行滑动的时候,可能会触碰到listview的滑动事件,所以这里通过了getviewhorizontaldragrange()方法进行强制横向滑动,当返回值大于0 的时候,即让它强制横向滑动,否则在某些情况下不能水平滑动

Android_UI 仿QQ侧滑菜单效果的实现

Android_UI 仿QQ侧滑菜单效果的实现 

控制垂直方向的移动

Android_UI 仿QQ侧滑菜单效果的实现

在onviewpositionchanged()方法中实现一些伴随移动的效果

此方法可以获取view移动的距离

如果当前移动的是main ,那么就让menu 进行伴随移动

移动main ,并限制main的移动

根据滑动的百分比的值,去执行伴随的动画 executeanim()

Android_UI 仿QQ侧滑菜单效果的实现

松开手指进行回调,该方法会处理手指拾起的缓慢移动

Android_UI 仿QQ侧滑菜单效果的实现 

执行动画

这里考虑到了给整个slidemenu的背景添加阴影遮罩效果,通过getbackground对是否为空时进行添加阴影遮罩效果

Android_UI 仿QQ侧滑菜单效果的实现

//对main的移动进行限制了
 private int fixleft(int newleft) {
    if (newleft > maxleft) {
      newleft = maxleft;
    } else if (newleft < 0) {
      newleft = 0;
    }
    return newleft;

需要定义接口回调,将slidemenu 打开,让滑动和关闭的事件方法暴露

//定义接口回调,将slidemenu 打开,,滑动和关闭的事件暴露给外界
  public interface onswipelistener {
    void onopen();
    void onclose();
    void ondragging(float fraction); //拖拽过程中的回调
  }

以上所述是小编给大家介绍的android_ui 仿qq侧滑菜单效果的实现,希望对大家有所帮助