• 视图属性更改(alpha、translationXY等)的快速失效。
  • 我们不想设置任何标志或处理默认失效方法处理的所有情况>
  • 相反,我们只想在ViewRootImpl中用适当的dirty rect安排一次遍历。
  • 此方法调用ViewGroup中的快速失效方法,这些方法在层次结构中遍历,并根据需要转换dirty rect。
  • 如果此视图中未使用显示列表属性,则该方法还处理正常的无效逻辑。
  • 该备份方法使用invalidateParent和forceRedraw标志来处理各种属性设置方法中使用的这些情
  • @param invalidateParent 如果此视图中未使用显示列表属性,
  • 则强制调用invalidateParentCaches()
  • @param forceRedraw 如果此视图中未使用显示列表属性,请将视图标记为“已绘制”以强制传播无效
    */
    @UnsupportedAppUsage
    void invalidateViewProperty(boolean invalidateParent, boolean forceRedraw) {
    if (!isHardwareAccelerated()//是否支持硬件加速
    || !mRenderNode.hasDisplayList()//是否有需要绘制的缓冲数据
    || (mPrivateFlags & PFLAG_DRAW_ANIMATION) != 0) {//view是否正在绘制
    if (invalidateParent) {//是否刷新父控件
    invalidateParentCaches();清楚parent view的缓存,不调用父控件的invalidate方法
    }
    if (forceRedraw) {
    mPrivateFlags |= PFLAG_DRAWN; // force another invalidation with the new orientation
    }
    invalidate(false);//invalidate(boolean invalidateCache) 重绘(是否清除绘图缓存)
    } else {
    damageInParent();//告诉父视图破坏此View的边界。

}
}

  • Display List 是一个缓存绘制命令的 Buffer,Display List 的本质是一个缓冲区,它里面记录了即将要执行的绘制命令序列。

  • Display List 是视图的基本绘制元素,包含元素原始属性(位置、尺寸、角度、透明度等),对应 Canvas 的 drawXxx()方法。

  • 视图信息传递流程:Canvas(Java API) —> OpenGL(C/C++ Lib) —> 驱动程序 —> GPU

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)) {
translat
eY = 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);
}

} else {
translateY -= distance;
setTranslationY(translateY);
}
}
return false;
}
return super.onTouchEvent(e);
}

【BYM】Android 仿百度搜索列表滑动效果,又到一年金三银四相关推荐

  1. 【BYM】Android 仿百度搜索列表滑动效果,写的太详细了

    | MotionEvent.ACTION_UP | 手势结束时产生,该动作包含最终位置 | | MotionEvent.ACTION_MOVE | 手势移动时经过的位置 | | MotionEvent ...

  2. 【BYM】Android 仿百度搜索列表滑动效果,flutter环境搭建

    相反,我们只想在ViewRootImpl中用适当的dirty rect安排一次遍历. 此方法调用ViewGroup中的快速失效方法,这些方法在层次结构中遍历,并根据需要转换dirty rect. 如果 ...

  3. android微信列表滑动删除,Android仿微信对话列表滑动删除效果

    微信对话列表滑动删除效果很不错的,借鉴了github上SwipeListView(项目地址:https://github.com/likebamboo/SwipeListView),在其上进行了一些重 ...

  4. android 仿qq好友列表分组效果及联系人分组效果

     历史记录仿QQ好友列表的动态效果 以及联系人的分组效果 QQ朋友分组的功能做的不错,大家都很认可,那么到底他的分组并且滑动的时候,标题能停留在顶部是如何实现的呢?今天从网上搜索了一下资料,自己运行了 ...

  5. Android仿微博实现列表滑动播放/暂停视频

    本文仿照新浪微博/QQ空间实现了滑动自动播放视频的功能. 本文来自个人博客:http://www.zhangliwei.date 如有疑问欢迎讨论,感谢您的关注. 先上效果图 关键代码 1.监听滚动事 ...

  6. 基于android的高仿抖音,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

  7. ajax仿百度搜索效果,利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)...

    实现功能描述: 1.实现搜索框的智能提示 2.第二次浏览器缓存结果 3.实现仿百度搜索 * { margin: 0px; padding: 0px; } #wrapper { height: 100% ...

  8. android仿抖音关注列表,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

  9. Android高仿抖音滚动聊天,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

最新文章

  1. 烂泥:学习Nagios(三): NRPE安装及配置
  2. 机器学习实用指南_机器学习方法:实用指南
  3. jdbc和mysql做游戏排行榜_MySQL数据库与JDBC编程
  4. 算法分析之对问题建模
  5. java多线程代码_java多线程实例代码详解
  6. 【语音播放】基于matlab GUI MP3设计【含Matlab源码 425期】
  7. windows php7怎么配置,PHP7在windows7中的环境配置详解
  8. 站立会议01(冲刺2)
  9. 数据库建表语句的使用及简单实战
  10. PCB设计完检查的项目
  11. 记一次内网SSH后门误报事件
  12. c语言windows头文件包含,不包含windows.h和window.h内的任何头文件,弹框 “Hello, world!”...
  13. 2018个人总结《再见2018,你好2019》
  14. 实现html语句的循环
  15. 酷q插件开发Java,CQ-HTTP-TO-CQ-FOR-JAVA
  16. 京津冀计算机学科大学排名,三大城市群综合排名出炉 京津冀垫底
  17. 特斯拉股价单日暴跌21% “车企市值第一”短期仍难易主
  18. 华为LAB实验室4-朴素贝叶斯
  19. 刷脸支付服务商代理成支付行业香饽饽
  20. 应变式传感器原理与优点

热门文章

  1. BUUCTF 你尽然赶我走
  2. 将123倒转 c语言,中国航信杯C语言程序设计答案解析版.doc
  3. 魏则西事件与百度医疗竞价排名引发的伦理与道德问题
  4. 【MySQL】使用MySQL
  5. swift 自制framework中加载nib
  6. tga怎么转成png格式?
  7. 面试题大全<持续更新>
  8. Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
  9. 影响线型缩聚物分子量的因素_线型缩聚物的分子量与分子量分布.ppt
  10. 2022-2028年中国垃圾处理行业全景调研及投资前景建议报告