c. getY()和getRawY()
- getRawX()、getRawY()返回的是触摸点相对于屏幕的位置,
- getX()、getY()返回的则是触摸点相对于View的位置。
3. 思路
- 弯路1: 想着设置layoutparams.marginTop来改变位置,但是视图刷新效果不行
- 弯路2: 使用ValueAnimation来修改translateY,但发现有deraution。
- 瞎猫碰到死耗子: 直接使用setTranslateY方法,改变view的位置,在down的时候记录按下的点位,move的时候判断是否移除位置超过上限和下限,up的时候判断手势方向,并自动setTranslateY到指定的下一个位置。
4. 源码
/**
- @authoer create by markfrain
- @github https://github.com/furuiCQ
- 高怀见物理 和气得天真
- 时间: 5/8/21
- 描述: BaiduRecyclView
*/
public class BaiduRecycleView extends RecyclerView {
float lastY;
float translateY;
float lastDiff = 0f;
float minVerticalY = 20;
int topTranslateY = 10, centerTranslateY = 300, bottomTranslateY = 540;
public BaiduRecycleView(@NonNull Context context) {
super(context);
init();
}
public BaiduRecycleView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public BaiduRecycleView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
translateY = DpUtils.dp2px(getContext(), centerTranslateY);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
lastY = e.getRawY();
return true;
case MotionEvent.ACTION_UP:
float rawY = lastY - e.getRawY();
if (translateY < DpUtils.dp2px(getContext(), centerTranslateY)) {
translateY = DpUtils.dp2px(getContext(), rawY > 0 ? topTranslateY : centerTranslateY);
setTranslationY(translateY);
} else if (translateY < DpUtils.dp2px(getContext(), bottomTranslateY)) {
translateY = DpUtils.dp2px(getContext(), rawY > 0 ? centerTranslateY : bottomTranslateY);
setTranslationY(translateY);
}
return true;
case MotionEvent.ACTION_MOVE:
rawY = lastY - e.getRawY();
float distance = lastDiff == 0f ? lastDiff : rawY - lastDiff;
lastDiff = rawY;
if (rawY > minVerticalY || rawY < -minVerticalY) {
if (translateY - distance < DpUtils.dp2px(getContext(), topTranslateY)) {
translateY = DpUtils.dp2px(getContext(), topTranslateY);
setTranslationY(DpUtils.dp2px(getContext(), topTranslateY));
} else if (translateY - distance > DpUtils.dp2px(getContext(), bottomTranslateY)) {
translateY = DpUtils.dp2px(getContext(), bottomTranslateY);
setTranslationY(DpUtils.dp2px(getContext(), bottomTranslateY));
} else {
translateY -= distance;
setTranslationY(translateY);
}
}
return false;
}
return super.onTouchEvent(e);
}
}
5. 效果展示
6. AnyWay
如果你还有更好,更酷炫,更精简的实现代码,也欢迎你没事的时候实现一下,相信你也能收获一点自己的知识。不止做一个高级的Copy工程师~o( ̄▽ ̄)ゞ,觉得文章有blow your mind,欢迎点赞,收藏,评论,欢迎指出我的问题,感谢感谢Thanks♪(・ω・)ノ。
7.参考文献
- Android源码
- Android 渲染机制——Display List
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-ErwSJczL-1710930578213)]