自定义控件
文章平均质量分 79
锐湃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
一种简单的方式来实现弹幕效果
本文介绍了一种轻量级弹幕效果的实现方案。针对项目中需要简单弹幕功能但又不愿引入复杂第三方库的需求,作者创新性地采用RecyclerView结合StaggeredGridLayoutManager实现。该方案通过自定义DanMuView控件,利用scrollBy方法控制滚动速度,实现了多行弹幕的无限循环滚动效果。文章详细展示了核心代码实现,包括布局文件、适配器逻辑和Activity调用方式,并提供了控制弹幕启停的交互按钮。该方案适用于简单场景,具有代码简洁、易于集成的特点,为需要轻量级弹幕功能的开发者提供了实转载 2025-08-13 17:26:15 · 253 阅读 · 0 评论 -
弹幕的两种实现及性能对比 | 自定义 LayoutManager
本文探讨了使用RecyclerView实现高性能弹幕效果的方案。作者通过自定义LayoutManager,解决了传统动画方案因预加载所有弹幕视图导致的性能问题。文章详细介绍了实现过程:1)自定义LayoutManager布局参数;2)初次填充弹幕的泳道算法;3)实现自动滚动逻辑;4)持续填充和回收弹幕的优化处理。通过复用RecyclerView的缓存机制,该方案显著提升了性能,GPU呈现模式下的表现更加流畅。文章强调深入理解源码对解决实际问题的重要性,并提供了完整代码链接。转载 2025-08-12 17:31:12 · 94 阅读 · 0 评论 -
弹幕的两种实现及性能对比 | 自定义控件
本文介绍了两种Android弹幕实现方案中的第一种——基于自定义ViewGroup的动画方案。该方案通过LaneView控件管理弹幕视图,采用泳道(Lane)概念随机分布弹幕位置,使用ValueAnimator实现从右向左的平移动画。文章详细阐述了弹幕控件的实现细节,包括视图缓存池(Pool)、测量布局、动画控制、点击事件处理等优化手段。同时指出了该方案的性能瓶颈:当大量弹幕视图同时构建时,会导致measure/layout耗时过高,影响列表流畅度。文章最后预告将介绍另一种性能更优的实现方案。转载 2025-08-12 17:13:37 · 83 阅读 · 0 评论 -
recyclerview GridLayoutManager 间隔线实现ItemDecoration
RecyclerView中使用GridLayoutManager时,可以通过自定义GridSpacingItemDecoration类实现网格间隔线。该类支持设置列数、水平/垂直间距及是否包含边缘间隔。通过重写getItemOffsets方法,根据item位置动态计算间隔值。使用时需先设置GridLayoutManager,再添加间隔线装饰器,并可选择边缘是否留白。该方法灵活适配不同UI需求,但需注意水平/垂直方向调整和spanSize特殊情况处理。辅助提供了dp转px工具方法确保多设备适配。转载 2025-08-06 18:04:05 · 204 阅读 · 0 评论 -
自定义圆形进度条
摘要:本文介绍了一个高度可定制的圆形进度条控件实现方案。该控件基于Android自定义View开发,支持设置圆环背景颜色、宽度,进度条颜色、宽度,进度百分比,起始角度以及动画执行时间等参数。通过TypedArray获取XML属性配置,使用Paint绘制圆环和进度弧线,结合Animation实现平滑的进度变化动画效果。开发者可通过声明式布局或代码动态设置各项参数,满足不同场景下的UI需求。控件源码参考了开源项目circleProgress的实现思路。转载 2025-07-31 11:49:52 · 41 阅读 · 0 评论 -
自定义span绘制ReplacementSpan,背景 图形 图片
ReplacementSpan是Android用于自定义文本显示的抽象类,继承自CharacterStyle,可实现文本替换为图片、动态效果等。主要子类包括ImageSpan、BackgroundColorSpan等。自定义需实现getSize()测量尺寸和draw()绘制内容,示例演示了如何创建圆角背景文本。使用时需注意性能、尺寸一致性和兼容性问题,适用于实现复杂文本效果如图文混排和动态文字。转载 2025-07-08 18:28:08 · 172 阅读 · 0 评论 -
Dialog 支持 lifecycleScope 和 viewmodel 生命周期
文章介绍了如何为Dialog添加生命周期管理功能,使其支持lifecycleScope和ViewModel自动销毁。通过自定义BaseLifecycleDialog基类,实现LifecycleOwner和ViewModelStoreOwner接口,并在show/dismiss时更新生命周期状态。使用时只需继承该基类,即可像Activity/Fragment一样使用lifecycleScope和by viewModels(),同时自动管理资源释放。该方案适用于需要Dialog独立管理生命周期的特殊业务场景。转载 2025-05-30 19:16:53 · 205 阅读 · 0 评论 -
级联地址选择器级联地址选择器
JDAddressSelector是一款仿京东(V5.0.1)风格的Android级联地址选择组件。主要特性包括:1)通过JitPack快速集成;2)支持两种使用方式 - 直接获取视图或通过底部弹窗展示;3)提供灵活的数据源配置,可自定义省市区街道数据获取逻辑;4)支持多线程和RxJava异步加载数据。转载 2025-05-30 11:00:39 · 71 阅读 · 0 评论 -
AndroidPicker 使用指南文档
AndroidPicker是一个功能丰富的安卓选择器类库,提供多种选择器组件,包括日期/时间选择器、单项选择器、多级联动选择器、城市地址选择器、数字选择器、文件选择器等。虽然原作者已不再维护该项目,但仍欢迎开发者通过GitHub提交Pull Request共同维护。该库支持灵活配置和自定义样式,提供Java和XML两种使用方式,并支持与DialogFragment结合使用。开发者可根据需求选择不同模块进行集成,最新版本采用重构优化后的API,与旧版本不兼容,升级需谨慎。项目提供完整文档和Demo演示转载 2025-05-28 19:33:30 · 214 阅读 · 0 评论 -
让 Android View 不拦截事件
在Android开发中,若需让某个视图不拦截点击事件,确保事件能传递给下方的视图,可以通过自定义View并重写onTouchEvent和onInterceptTouchEvent方法实现。首先,创建一个继承自View的自定义类NonInterceptingView,并实现其构造函数。接着,重写onTouchEvent方法并返回false,使事件继续传递给子视图。同时,重写onInterceptTouchEvent方法并返回false,确保父容器转载 2025-05-20 17:03:49 · 123 阅读 · 0 评论 -
RecyclerView跨行跨列的LayoutManager:Spannedgridlayoutmanager
RecyclerView可以使用GridLayoutManager实现跨行,但是不能跨列;瀑布流布局可以跨列但是又不能跨行。原生自带的各个LayoutManager中并没有可以又跨行又能跨列的。网上搜寻了一番,找到了一个亲测可行好用的三方库:spannedgridlayoutmanager。转载 2024-11-20 15:52:53 · 306 阅读 · 0 评论 -
Android设计模式实战 ,实现一个弹窗引擎封装dialog
最近项目使用的一个第三方库很多线上 Bug 所以考虑换一个第三方库了,结果去除依赖之后导致基本每个页面都要修改,项目全部爆红,人都麻了,悔不该当初图方便没有使用引擎类啊。第三方库提供基本的各种功能,引擎类封装一层给自己的项目预定特定的效果,上层应用只需要调用引擎即可实现效果,不需要关心底层的实现,不需要引用第三方的依赖和类库。当我们第三方库升级或替换的时候,只需要修改引擎类即可。下面我以弹窗库的封装为例,封装一个弹窗引擎库,下来就一起来看看吧。转载 2024-09-24 10:14:55 · 444 阅读 · 0 评论 -
以一种简单的方式来实现弹幕效果
弹幕的无限滚动:确保弹幕能够连续地滚动,而不是在到达末尾时重新开始。弹幕的多行显示:能够在屏幕上同时显示多行弹幕,并且每行弹幕独立滚动。滚动速度的控制:能够控制弹幕的滚动速度,以实现流畅的视觉效果。本文将通过一个示例项目来展示如何实现上述功能。gif图有点卡,可以自行运行一下看效果。通过本文的介绍,我们实现了一种简单的弹幕效果。使用和,不仅实现了多行弹幕的效果,还可以通过控制scrollBy方法的速度,实现弹幕的平滑滚动。这种方式非常适合在需要显示大量动态文本信息的场景中使用,例如商品评论等。转载 2024-09-20 13:46:57 · 456 阅读 · 0 评论 -
为什么View的 onDetachedFromWindow 方法不一定执行
其实 setView 是在 onResume 方法之后,内部流程是通过 PhoneWindow 获取 WindowManagerImpl 来调用 addView 方法,其内部会调用 WindowManagerGlobal.addView 方法,最后调到 ViewRootImpl 的 setView 方法。从源码中可以看到,View 的 onDetachedFromWindow 方法其内部是由 View 的 dispatchDetachedFromWindow 调用的。转载 2024-09-10 14:46:48 · 376 阅读 · 0 评论 -
5年了,ViewPager2 终于支持 overScrollMode,没错,我干的。
这个 bug 被扔进了 backlog 将近5年,现在这个坑总算被填上了,我自己很开心,开发者后面更新版本后发现这个属性能用了肯定也会很开心,可能这就是开源的乐趣所在吧。androidx 从最开始提出到现在,其实一直都是开源,并且鼓励开发者贡献的。希望各位小伙伴平时发现问题,分析问题,解决问题之后,都可以慷慨将自己的方案提交给 Google,这除了能帮到全球数以万计的开发者之外,自己也能获得一份满满的成就感,何乐而不为呢?作者:Mr_万能胶。转载 2024-08-19 16:10:45 · 453 阅读 · 0 评论 -
Drag Select Compose:实现多平台图片多选功能的利器
Drag Select Compose库使我们能够轻松实现复杂的图片多选功能,同时支持多种平台。通过该库,我们不仅可以简化开发流程,还可以为用户提供流畅的交互体验。希望通过这篇博客,您能更好地理解和应用这一强大的工具。了解更多信息,请访问DragSelectCompose文档Drag Select Compose:实现多平台图片多选功能的利器。转载 2024-07-08 10:48:20 · 176 阅读 · 0 评论 -
Android自定义ViewGroup的滚动与惯性滚动效果实现的不同组合方式
使用 GestureDetector 可以帮助我们快速实现检测手势,比如单击、双击、长按、滑动,惯性等。它是谷歌给我们的快速实现类,缺点是不方便自定义。使用 VelocityTracker 可以帮助我们计算触摸事件的速度和方向,比如滑动的速度和方向。它是用于惯性和滑动方向判断的底层类,可以方便自定义。使用 Scroller 可以在视图中实现平滑滚动效果。虽然 Scroller 自身不直接使视图滚动,它通过内部跟踪和计算滚动的位置,确保滚动操作看起来平滑连贯。转载 2024-07-03 10:15:26 · 252 阅读 · 0 评论 -
The specified child already has a parent. You must call removeView() on the child‘s parent first问题
在我们添加视图的时候(此时我添加的是ImageView),通过视图去获取其parent。然后通过判断parent中是否含有这个视图,如果有就删除掉,没有。将parent中的控件删除后就保证添加到的父容器中不会重复添加,此时就不会报错了。这种一般是出现在viewpager无限轮播的时候需要不断的添加,这时候这么写已经不能解决了。这样就在销毁的时候将view移出,下次添加的时候就不会出现已经有parent的情况。这时候就需要将destroyItem中的代码注释。这只是一种方案,如果有更好的可以评论告诉我。转载 2024-06-07 11:08:38 · 421 阅读 · 0 评论 -
自定义View:手撸一个带FAB凹槽的底部导航栏
底部导航栏相信大部分的Androider都不陌生,毕竟对于绝大多数的应用来说底部导航栏是首页的标配,也不缺各种花里胡哨不按常理出牌的底部导航栏。例如在我某天路过看到同事搞了个下面这样的:我:咦?这种中间的FAB直接凹陷下去的效果你是怎么实现的,之前还没搞过这样的还真有点新奇hhh同事:UI提供的切图呗,图片原本就是中间凹下去的,直接设成background不就行了,这有多难?我:......?如果你的FAB移动了,导航栏怎么跟着变化?同事:没得怎么变化,反正需求没有说要加动画。转载 2024-06-05 11:17:30 · 787 阅读 · 0 评论 -
ViewPager 无限循环
使用这种方式启动的时候,需要将 2 号图片,设置为第一张,当向前滑动的时候,因为前面的 1号图片 是和 4 号图片一样,那么,给人的错觉就像是无线循环的一样,当选中一号图片后,立即将当前选中的图片设置为 4 号图片,4号图片向5号图片滑动也是同理。将 ViewPager 的Count 的数量设置的尽可能的大,然后就造成了无限循环的假象。第二种,方式是,假如三个图片无限循环,那么就需要用5张图片,如下图所示。基本的需求已经实现,如果还有更多的需求,还可以根据上面的扩展。测试我们的Adapter。转载 2024-05-30 20:23:24 · 491 阅读 · 0 评论 -
RecyclerView宫格拖拽效果实现
本篇到这里就结束了,我们利用RecyclerView实现了宫格图片的拖拽效果,主要是借助ItemTouchHelper实现,从ItemTouchHelper中我们能看到很多巧妙的的设计,里面有很多值得我们学习的技巧,特别是对事件的处理、绘制顺序调整的方式,如果做吸顶,未尝不是一种方案。作者:时光少年链接:https://juejin.cn/post/7348707728921853971来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2024-04-16 17:02:26 · 499 阅读 · 0 评论 -
Kotlin自定义View
说说Kotlin和Java感觉差异比较大的地方。首先是变量的生命,Kotlin声明时必须赋值或者初始化,java则不用,开始有点不习惯。Kotlin不需要分号结尾,Kotlin的循环用起来简直爽YY。首先是这次自定义View的效果图,是一张饼图。如果是用java写的话也就几十行,觉得换成Kotlin的话可能会更少。主要的功能是可以任设定数据的个数,我这里是4个数据,可以任意设定每个数据的颜色。#####首先上Kotlin代码##########相同功能Java代码#####转载 2024-04-15 15:19:47 · 689 阅读 · 0 评论 -
优雅地实现 Dialog 弹窗
可能早就有人已经发现了,我们现在对话框的调用方式跟 Compose,React 很相似,也就是最近很流行的声明式 UI,为什么说它流行,比我们传统的命令式UI好用,主要的差别就在于声明式UI调用方只需要在乎视图的描述就可以,而真正视图如何渲染,如何测量,调用方不需要关心。转载 2024-04-15 14:38:30 · 1057 阅读 · 0 评论 -
自定义控件之自定义属性
上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参考Android自定义控件之基本原理(一)这篇文章。Android自定义控件之基本原理Android自定义控件之自定义属性Android自定义控件之自定义组合控件Android自定义控件之自定义ViewGroup实现标签云。转载 2024-04-15 14:22:49 · 169 阅读 · 0 评论 -
自定义控件之基本原理
在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理。Android自定义控件之基本原理Android自定义控件之自定义属性Android自定义控件之自定义组合控件Android自定义控件之自定义ViewGroup实现标签云1. 应当遵守Android标准的规范(命名,可配置,事件处理等)。2. 在XML布局中可配置控件的属性。转载 2024-04-15 14:11:49 · 121 阅读 · 0 评论 -
Android自定义控件之自定义组合控件
前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一)、自定义属性Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。Android自定义控件之基本原理Android自定义控件之自定义属性Android自定义控件之自定义组合控件Android自定义控件之自定义ViewGroup实现标签云。转载 2024-03-26 20:16:02 · 124 阅读 · 0 评论 -
自定义View学习——三种实现方式
由此学习是一个我认为比较愉快的学习方向。首先说说自定义View的种类,分为三种:转载 2024-03-26 20:10:01 · 150 阅读 · 0 评论 -
自定义View的图片绘制与交互实战,用户新功能指引控件实现
剩下的完善细节,例如可以把蒙层前景的颜色值,是否启动外部触摸,是否展示箭头等变量设置到自定义属性中。如果你们的产品还需要更加的细分的话,例如提示的图片 View 与下一步的图片 View 要分开,那么就需要你自己拆分,再定义一个对应的 NextView,与对应的图片绘制,相信各位看完此篇对你们来说不算难事了。通过本文我们其实可以更加的理解绘制坐标系,图片的绘制无非就是top left的确定,限制矩阵也无非就是上下左右的赋值,理解了这些对于其他方式的绘制,如线条,圆形,文本等都能驾轻就熟了。转载 2024-01-03 13:25:13 · 144 阅读 · 0 评论 -
12个自定义View的高级问题
了解面试者对自定义View核心概念的理解,以及其在实际开发中的应用能力。参考简答:View与ViewGroup:View是Android界面的基本构建块,而ViewGroup是一种特殊的View,用于包含和管理其他View。自定义View的必备步骤:继承View或其子类,实现构造函数、测量、布局和绘制方法。重写onDraw方法:在该方法中进行绘制操作,实现自定义的外观和交互。测试面试者对于View绘制流程的全面理解。onDraw方法:在onDraw中进行实际的绘制操作,包括绘制图形、文本等。转载 2023-12-25 16:17:33 · 221 阅读 · 0 评论 -
一个实现跳转到更多页面的黏性交互的通用组件
RecylerView 向左滑到了最右边且是向右滑动(dx小于0)时,此时 HorStickNavLayout 内容向左滚动了有一段距离,即 scrollX 是大于0的,那么让 HorStickNavLayout 中的内容向右滚动,提示文案逐渐消失,最多滚动到 scrollX 等于0,然后,无论是触摸引起的还是 fling 引起的多余滑动距离, HorStickNavLayout 不再处理,交由 RecyclerView 继续处理,这样实现了嵌套滑动的连贯性。至此,本技术方案使用到的原理及步骤介绍完毕。转载 2023-09-26 11:26:30 · 214 阅读 · 0 评论 -
使用RecyclerView实现三种阅读器翻页样式
为何直接对进行扩展而不使用?转载 2023-09-04 10:32:40 · 1507 阅读 · 0 评论 -
实战经验:打造仿微信聊天键盘,解决常见问题
仿照微信聊天键盘的方法,实现了一个包含表情等功能的键盘区域,并解决了一些常见的问题。通过实践和调查,解决了切换键盘的问题,并实现了Emoji的Unicode显示和自定义删除时向前探索字符边界完成表情删除等操作。在过程中,以为很简单的一个东西花了大量的时间调查原因,发现键盘这一块水很深,当我看到ResultReceiver时,看到了AIDL通信,所以再Android这个体系中,Binder的机制需要了然于胸的,刚好我最近在学习Binder得各种知识,不久后会发布对应的博客,关注我,哈哈。此系列属于我的一个。转载 2023-05-06 14:41:38 · 1411 阅读 · 0 评论 -
App 添加自定义表情
上一篇文章介绍了 Span 的原理。这一篇文章将介绍 Span 的应用,使用 Span 来给 App 添加自定义表情。转载 2023-03-24 16:03:24 · 281 阅读 · 0 评论 -
自定义ViewGroup嵌套与交互实战,幕布全屏滚动效果
事情是这个样子的,前几天产品丢给我一个视频,你觉得这个效果怎么样?我们的 App 也做一个这个效果吧!到底怎么做呢?相信跟着我一起复习的小伙伴们心里都有了一点雏形。自定义ViewGroup。下面跟着我一起再次巩固一次 ViewGroup 的测量与布局,加上事件的处理,就能完成对应的功能。话不多说,Let's go我们先前都是使用的成员变量来控制一些间距与逻辑的触发,这就跟业务耦合了,如果想做到通用的一个效果,肯定还是要抽取自定义属性,做到对应的配置开关,就可以适应更多的场景使用,也是开源项目的必备技能。转载 2023-03-07 10:17:28 · 358 阅读 · 0 评论 -
CoordinatorLayout协调者布局原理分析并实现吸顶效果
首先我们先从源码中能够看到,CoordinatorLayout只实现了parent接口(这里如果不清楚parent接口是干什么的,建议看看前面的文章,不然根本不清楚我讲的是什么),说明CoordinatorLayout只能作为父容器来使用。复制代码所以对于CoordinatorLayout来说,它的主要作用就是用来管理子View或者子View之间的联动交互。所以在上一篇文章中,我们介绍的NestScroll嵌套滑动机制,它其实能够实现child与parent的嵌套滑动,但是是1对1的;转载 2023-03-06 11:07:18 · 1349 阅读 · 0 评论 -
MPAndroidChart显示No data available
网络请求返回数据后设置到chart中,但是一直显示no data available。跳转到其它页面再返回显示正常。在设置数据后需要手动调用view的invalidate方法刷新chart。转载 2022-12-14 20:57:59 · 1173 阅读 · 0 评论 -
子线程 UI 操作真的不可以?
至此,我们可以得出第一个结论:一个未被attach的View的实例化及其中属性的操作,由于其顶层parent是不存在viewRootImpl对象的,无论调用什么方法,都不会触发到checkThread,因此是完全可以放在子线程中进行的。其实通过上面TextView#setText方法调用链的信息,我们已经知道,所有的成功执行的view#invalidate方法,最终都会走到ViewRootImpl中的方法,并在ViewRootImpl中检查尝试更新UI的线程。——《Android开发艺术探索》转载 2022-12-14 10:48:48 · 331 阅读 · 0 评论 -
自定义View的绘制,往往都是从圆环开始
作为一个自定义View,我们需要配置一些属性,那么必不可少的就需要一些自定义属性,比如我们的圆环View,从效果图上看的话,我们需要定义如下的元素:一个内环,一个外环,外环阴影,一个百分比的文本,一个提示文本。从而我们就需要指定一下内环的宽度、背景颜色、外环的宽度、颜色、阴影的大小、阴影的颜色、百分比文字的大小颜色、提示文本的大小颜色,由于我们还需要做动画展示圆环,所以我们还需要配置是否开启动画。总的来说一些自定义的属性定义位置如下:复制代码。转载 2022-12-13 10:33:21 · 250 阅读 · 0 评论 -
Android ImageView到底怎么设置圆角图片?背景圆角?控件圆角?图片圆角?占位图圆角?
我早几年前做项目就遇到这样的场景,设置背景之后,在上面加载圆角的图片,但是背景会漏出来,好不容易让UI切图解决之后,占位图又出问题,占位图不是圆角的就把整个布局盖住了,不符合UI的美学,哎,我要吐了。第一种思路:对背景和占位图有需求,最好是找UI切图,对应的比例的圆角背景图和圆角占位图,如果一个项目有多个不同的比例的,不同圆角的设计图,那么可以想象项目中需要导入多少图片,Apk会变大。我们顺便加上圆形图片的绘制,圆角的图片绘制,各自圆角的绘制,和对应的背景的圆角,图片背景与颜色背景设置等一系列功能。转载 2022-09-28 10:22:41 · 3349 阅读 · 0 评论 -
自定义一个随意拖拽可吸边的悬浮View
先定义一个FloatView类,继承自FrameLayout,实现构造方法。创建一个ShapeableImageView,并添加到这个FloatView中。}}}复制代码。转载 2022-08-31 10:35:22 · 1405 阅读 · 0 评论
分享