android仿微信下拉二楼_仿微信小程序下拉组件

这篇博客详细介绍了如何在Android中实现仿微信小程序的下拉二楼组件,包括自定义组件、内部子View结构、重写dispatchTouchEvent、临界点回弹动画以及手势判断的实现方法,并提供了用例地址。
摘要由CSDN通过智能技术生成

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者: colinWong

链接: https://www.jianshu.com/p/739bb01eee80声明: 本文已获 colinWong

授权发表,转发等请联系原作者授权

4c0f4db6cce9a5da532a384c7f06e4bf.png

1563442819594.gif

@H_404_21@设计思路

1.自定义个组件类似RelativeLayout

2.可以内部放子View,然后就是滑动主体在前,小程序View在后

3.重写dispatchTouchEvent 控制这两个子View的位置

4.加上临界点回弹动画

5.手势判断(惯性效果)

1.继承RelativeLayout

如果要从新写一个GroupView组件需要measure → layout → draw 很多细节要处理也不一定处理的好。所以直接用系统提供的RelativeLayout

public class MoreHeadLayout extends RelativeLayout{

...

}

2.内部子View 结构

就两个,如下图

656a2ced02ebe8ab406c5978eaee1b85.png

image.pngprivate View mHeadView;

private NewNestedScrollView mBodyView;

void init(){

mHeadView = findViewById(R.id.head_layout);//view为head

mBodyView = findViewById(R.id.body_layout);

}

xml中的代码

7d47b4c7581ef31dd3eb1ed8407b40e1.png

image.png

3.重写dispatchTouchEvent

这一步主要是做控制手指滑动跟随,就是bodyView跟随你的手指滑动

先写一个方法,就是控制bodyView纵坐标的位置

private setMarginTop(int offY){

RelativeLayout.LayoutParams paramsBody = (LayoutParams) mBodyView.getLayoutParams();

int marginTop = paramsBody.topMargin - offY;

if (marginTop < 0) {

marginTop = 0;

} else if (marginTop > mHeadView.getHeight()) {

marginTop = mHeadView.getHeight();

}

paramsBody.topMargin = marginTop;

mBodyView.setLayoutParams(paramsBody);

}

再计算滑动距离,然后调用setMarginTop 方法

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

int y = (int) ev.getRawY();

int offY = lastY - y;

lastY = y;

switch (ev.getAction()) {

...

case MotionEvent.ACTION_MOVE:

if (isBodyTop && headViewVisible()) {

setMarginTop((int) (offY * damp));

return true;

}

if (isBodyTop && offY < 0) {

setMarginTop((true;

}

break;

...

}

这样bodyView 就可以跟随手指动了,若需要一些阻尼效果可以添加系数damp,就是bodyView移动的距离等于手指滑动的距离乘以系数damp。

4.临界点与回弹

先写一个动画方法,该动画方法就是bodyView 从开始的高度移动到结束的高度。

private ValueAnimator mAnim;

/**

* 收起或打开动画

*

* @param start 开始高度

* @param end 结束高度

* @param time 动画时间

*/

startAnimator(int start,int end,51); font-weight: 700;">long time) {

if (mAnim != null && mAnim.isRunning()) {

mAnim.cancel();

}

mAnim = ValueAnimator.ofInt(start,end);

mAnim.setDuration(time);

mAnim.setTarget(mBodyView);

mAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

onAnimationUpdate(ValueAnimator animation){

int currentValue = (Integer) animation.getAnimatedValue();

RelativeLayout.LayoutParams params = (LayoutParams) mBodyView.getLayoutParams();

params.topMargin = currentValue;

mBodyView.setLayoutParams(params);

}

});

mAnim.start();

}

然后设置一个触发的临界点

触发时机例如手指抬起事件

case MotionEvent.ACTION_UP:

...

if (mBodyView.getTop() < mHeadView.getHeight() * cloSEOrOpen) {

startAnimator(mBodyView.getTop(),0);//收起动画

} else {

startAnimator(mBodyView.getTop(),mHeadView.getMeasuredHeight());//打开动画

}

5.手势判断(惯性效果)

添加手势判断会有更好的使用体验效果,方法如下

在dispatchTouchEvent 方法里每个事件下面把事件传进去

mGestureDetector.onTouchEvent(ev);//为什么不放在最前面,因为会比关闭/打开动画先触发

其他

大概的雏形就是这样可以扩展其他功能如,三个小点或者震动、headView跟随bodyView 移动等

附上用例地址

https://github.com/collinWong/wx_drawer

总结

以上是编程之家为你收集整理的仿微信小程序下拉组件全部内容,希望文章能够帮你解决仿微信小程序下拉组件所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值