android绘制高亮区域,实现高亮某行的RecyclerView效果

news2023/12/5 5:53:14

ebdda00da70f

最终效果

全部代码:github

方式有二

组合控件,RecyclerView + View

自定义RecyclerView

1中只需要控制View,但是不好封装。

2中需要重写RecyclerView中一些东西,最终就是一个CustomRecyclerView。

所以采用的是第二种方法。代码100来行。

主要步骤

添加ItemDecoration使第一个和最后一个Item可以滚动到屏幕中央

添加SnapHelper重写方法

重写OnDrawForeGround绘制高亮区域

添加OnScrollListener当滑动停止可以根据当前Item高度重绘高亮区域

1. 添加ItemDecoration使第一个和最后一个Item可以滚动到屏幕中央

很简单

判断是第一个/最后一个Item,顶部/底部添加距离

val decoration = object : RecyclerView.ItemDecoration() {

override fun getItemOffsets(

outRect: Rect,

view: View,

parent: RecyclerView,

state: State

) {

super.getItemOffsets(outRect, view, parent, state)

this@HighLightRecyclerView.adapter?.let {

if (parent.getChildAdapterPosition(view) == 0)

outRect.top = (parent.measuredHeight - view.layoutParams.height).shr(1)

else if (parent.getChildAdapterPosition(view) == it.itemCount - 1)

outRect.bottom = (parent.measuredHeight - view.layoutParams.height).shr(1)

}

}

}

2. RecyclerView添加SnapHelper并重写findSnapView()方法

思路就是,根据停止时各个Item的位置判断RecyclerView应该对齐哪个Item

无非就是一个工具类的两个比较特别的方法

OrientationHelper的getDecoratedStart(v:View)有两种情况,字面意思是“获取Item距离顶部位置”。

Item设置了Margin或Decoration这些偏移量,注意是Start,也就是一般情况下的Left或者Top,视Orientation而定。那么返回值为Item顶部距RecyclerView顶部距离 - 偏移量

没有设置偏移量,返回值为Item高度

相应地,OrientationHelper的getDecoratedMeasurement(v:View)也有两种情况。字面意思是“获取Item所占空间大小”。

有偏移,返回偏移+高度

无偏移,返回高度

高亮Item的需求因为涉及到第一步中偏移的设置,主要有三种情况

顶部 Start为0,Measurement为顶部偏移+高度

中部 Start为顶部距离,Measurement为Item高度

底部 Start为顶部距离,Measurement为底部偏移+高度

这地方不弄情况特别乱,我列出表格大概是这个样子:

位置

getDecoratedStart

getDecoratedMeasurement

顶部

0

OffsetTop + Height

中部

TopDistance

Height

底部

TopDistance

OffsetBottom + Height

我们让Item居中,它应该是 顶部距离+ItemHeight/2 == RecyclerView.height/2

伪代码就是 TopDistance+Height/2 = Parent.Height/2

尝试用一行代码写,发现没办法,只能分情况

也就是

pos为0 helper.getDecoratedStart(it) + helper.getDecoratedMeasurement(it) - it.layoutParams.height

其余情况为 helper.getDecoratedStart(it) + it.layoutParams.height.shr(1)

想明白了也就那么回事。

代码如下:

override fun findSnapView(layoutManager: RecyclerView.LayoutManager?): View? {

return when {

layoutManager == null -> null

layoutManager.childCount == 0 -> null

else -> {

var closestChild: View? = null

var absClosest = Int.MAX_VALUE

val helper = OrientationHelper.createVerticalHelper(layoutManager)

val center = helper.startAfterPadding + helper.totalSpace.shr(1)

var childCenter: Int

var distance: Int

for (i in 0 until layoutManager.childCount) {

layoutManager.getChildAt(i)?.let {

childCenter = if (i == 0)

helper.getDecoratedStart(it) + helper.getDecoratedMeasurement(it) - it.layoutParams.height

else helper.getDecoratedStart(it) + it.layoutParams.height.shr(1)

distance = abs(center - childCenter)

if (distance < absClosest) {

absClosest = distance

closestChild = it

}

}

}

closestChild

}

}

}

3. 重写OnDrawForeGround绘制高亮区域

path.addRect(0f, 0f, width.toFloat(), height.toFloat(), Path.Direction.CW)

path.addRect(

0f,

(height - highLightHeight).shr(1).toFloat(),

width.toFloat(),

(height + highLightHeight).shr(1).toFloat(),

Path.Direction.CCW

)

没啥好讲的,主要就是Path.Direction要讲讲

这个高亮区域,有两个矩形组成,第一个是画全屏的遮罩,第二个是从第一个矩形中抠出这个区域,反方向与Android绘制定义有关,记住它能抠出形状就行。就不用涉及PorterDuff类的相关概念了。

4. 添加OnScrollListener当滑动停止可以根据当前Item高度重绘高亮区域

啊,其实这个如果不要动画,就很简单,一行代码

highLightHeight = height

但是,要动画也是一行代码

if (newState == SCROLL_STATE_IDLE) {

snapHelper.findSnapView(layoutManager)?.let {

animator = ValueAnimator.ofInt(highLightHeight, it.layoutParams.height)

.setDuration(300)

animator.removeAllUpdateListeners()

animator.addUpdateListener { va ->

highLightHeight = va.animatedValue as Int

}

animator.start()

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://nwjs.net/news/300087.html

如若内容造成侵权/违法违规/事实不符,请联系七分地网进行投诉反馈,一经查实,立即删除!

相关文章

Android App监听软键盘按键的三种方式

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候&#xff0c;例如&#xff1a;我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面&#xff1b;在点击搜索框的时候&#xff0c;点击右下角的search符号键可以进行搜索&#xff1b;或者在全…

常用元素位置与大小总结

偏移量 offsetHeight: 元素在垂直方向占据的空间大小 > 内容高度 上下padding 上下boderoffsetWidth: 元素在水平方向占据的空间大小 > 内容宽度 左右padding 左右boderoffsetTop: 元素外边框距离offsetParent的上内边框的距离offsetLeft: 元素外边框距离offsetParen…

android将被代替的控件,Android 控件被忽略的属性

作者&#xff1a;ivm参考了 http://www.cnblogs.com/jisheng/archive/2013/01/10/2854088.html导航栏&#xff1a;1.TextView autoLinkHtml.fromHtml()2.Typeface &#xff1a;设置字体3.Switch 及 togglebutton4.AnalogClock DigitalClock 两个时钟的控件5.5.秒表控件Chronic…

AngularJS 、Backbone.js 和 Ember.js 的比较

2019独角兽企业重金招聘Python工程师标准>>> 译文: http://www.oschina.net/translate/javascript-framework-comparison 原文: http://www.airpair.com/js/javascript-framework-comparison 转载于:https://my.oschina.net/ilivebox/blog/307816

linux “大脏牛”漏洞分析(CVE-2017-1000405)

一、背景简介 脏牛漏洞(CVE-2016–5195)是公开后影响范围最广和最深的漏洞之一&#xff0c;这十年来的每一个Linux版本&#xff0c;包括Android、桌面版和服务器版都受到其影响。恶意攻击者通过该漏洞可以轻易地绕过常用的漏洞防御方法&#xff0c;对几百万的用户进行攻击。尽…

安卓音乐播放器开发实例

本文将引导大家做一个音乐播放器&#xff0c;在做这个Android开发实例的过程中&#xff0c;能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件。为了有更好的学习效果&#xff0c;其中很多功能我们手动实现&#xff0c;例如音乐播放的快进快退等。 先欣赏下本实例完成…

云计算&大数据 “下一幕”智能变革之力

2019独角兽企业重金招聘Python工程师标准>>> 2016年的互联网科技领域&#xff0c;云计算、大数据、人工智能成为最热词汇。阿里云“为了无法估算的价值”将中国的计算触角伸向海外&#xff0c;百度首次向外界展示“百度大脑”的科技成果&#xff0c;移动互联网利用人…

html和css有序列表,HTMLCSS基础学习笔记14—有序列表及列表嵌套

我们上篇讲到了无序列表&#xff0c;那么今天就来看看有序列表和他们的组合嵌套使用吧。有序列表现在我们要做那堆杂事了&#xff0c;但是发现这么多杂事&#xff0c;先做哪个好呢&#xff1f;于是我们给这堆杂事弄个优先级排序&#xff0c;让我们能够按照顺序做下去。HTML里用…

华硕笔记本BIOS设置详解

BIOS是英文Basic Input/Output System的缩写&#xff0c;即基本输入输出系统&#xff0c;合理的BIOS设置可以让我们的电脑更好的为我们服务&#xff0c;但由于大部分笔记本的BIOS界面是英文&#xff0c;并且BIOS里面的某些关键选项稍有差池就会导致各种各样的问题&#xff0c;导…

发表论文不用愁,十大技巧治秃头

鱼羊 编译整理 量子位 报道 | 公众号 QbitAI做研究跟发文章&#xff0c;完全是两码事。实验一时爽&#xff0c;落笔火葬场。好不容易憋出了初稿&#xff0c;又有多少研究僧跪在了反复修改的漫漫长路上。对于很多科研党来说&#xff0c;比起嗑盐的过程&#xff0c;恐怕写文章更让…

Ext4 MVC CRUD操作

项目目录结构如下&#xff1a; &#xff08;1&#xff09;index.html <!DOCTYPE html> <html><head><title>用户管理</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

手机拍视频,实时换背景,继马卡龙玩图后,Versa又出了一款更厉害的App

郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI在前不久荣耀9X的发布会上&#xff0c;一个名叫绿幕侠的App亮相了。现场的展示中&#xff0c;这个App能让手机拍摄的视频&#xff0c;产生电影绿幕一般的效果&#xff0c;实时从视频中去掉背景&#xff0c;只保留主角人物&#…

html中多边形图形怎么制作,CSS制作图形速查表

前面在《纯CSS制作的图形效果》一文中介绍了十六种CSS画各种不同图形的方法。今天花了点时间将这方面的制作成一份清单&#xff0c;方便大家急用时有地方可查。别的不多说了&#xff0c;直接看代码。为了节省时间&#xff0c;下面图形都采用的一个标签&#xff0c;可以是块元素…

unity学习

2019独角兽企业重金招聘Python工程师标准>>> 1.发布ios应用的时候会生成一个xcode工程。已经发布过ios&#xff0c;再次发布的时候可以选择replace 或者是append原xcode工程。如果ios工程是不同unity版本创建的&#xff0c;那么不能append。但是如果我们修改过ios的…

腾讯AI击败王者荣耀职业队,全靠自学、策略清奇,一天训练量为人类440年

问耕 发自 麦蒿寺量子位 出品 | 公众号 QbitAI王者峡谷&#xff0c;风云突变。一场激烈的对战正在进行&#xff0c;左侧是五位人类职业电竞高手组成的赛区联队&#xff0c;另一方是……嗯&#xff1f;他们的对手没有出场&#xff1f;五个座椅空空荡荡&#xff1f;不。他们的对手…

mfc 内嵌 本地html,MFC程序中内嵌网页,附示例工程

最近在课程设计&#xff0c;因为小悠太懒了&#xff0c;是在不想用C完成一些简单的文件上传下载操作&#xff0c;于是就想着将网页内嵌到程序中&#xff0c;上传下载神马的就直接使用网页Web来完成就好了&#xff0c;本示例中将演示在MFC程序中内嵌一个html网页介绍一下原理首先…

最高5000倍加速模拟物理世界,育碧在修复bug上又进一步

晓查 发自 凹非寺量子位 出品 | 公众号 QbitAI“买bug送游戏”对育碧游戏的玩家来说简直是常态。即使是育碧的当家游戏《刺客信条》、《孤岛惊魂》系列也是bug也是多到令人发指。比如《刺客信条&#xff1a;大革命》中&#xff0c;主角的脸部建模突然失控&#xff0c;变成一张“…

AI帮你靠“想象”打字:手机电脑软键盘也能盲打了,准确率能达到95%

铜灵 发自 凹非寺量子位 出品 | 公众号 QbitAI有了机器学习&#xff0c;没有软键盘还能照样打字。凭啥&#xff1f;凭想象。来自韩国科学技术高级研究院在一项最新研究中&#xff0c;提出了一种完全靠想象的键盘&#xff1a;I-Keyboard&#xff0c;这个界面上看不到软键盘上的字…

php curl 内容采集

2019独角兽企业重金招聘Python工程师标准>>> function contentCollection($url){$data array(list>null,status>0);if(!$url){$data[info] 请传入采集地址;return $data;}if(!preg_match("/^http/", $url)){$url http://.$url;}preg_match("…

文科生如何入门机器学习:先看看这篇零基础教程,再多算几遍吧

晓查 发自 凹非寺量子位 出品 | 公众号 QbitAIAI技术变得越来越热门&#xff0c;很多人开始转行进入这一领域&#xff0c;其中当然也不乏文科生。他们在普遍缺乏大学数学知识的情况下&#xff0c;就不能入门机器学习了吗&#xff1f;最近有位Reddit网友David Code&#xff0c;他…