iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用Android itemDecoration接口实现吸顶悬浮标题
  • 117
分享到

怎么使用Android itemDecoration接口实现吸顶悬浮标题

2023-07-04 15:07:47 117人浏览 泡泡鱼
摘要

这篇“怎么使用Android itemDecoration接口实现吸顶悬浮标题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来

这篇“怎么使用Android itemDecoration接口实现吸顶悬浮标题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Android itemDecoration接口实现吸顶悬浮标题”文章吧。

方案

设置一个悬浮的视图挂在recycleView顶部,随着item的移动位置,悬浮标题自动跟随移动或者是保持原地不动。

使用recyclerView的ItemDecoration,给指定的item设置不同的itemDecoration,并且跟随item的移动而移动或者保持不变。

本文采用第二种方式实现,效果图:

怎么使用Android itemDecoration接口实现吸顶悬浮标题

了解ItemDecoration

这是个接口,一共有六个方法:

public static abstract class ItemDecoration {                public void onDraw(canvas c, RecyclerView parent, State state) {            onDraw(c, parent);        }                public void onDrawOver(Canvas c, RecyclerView parent, State state) {            onDrawOver(c, parent);        }                public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {            getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),                    parent);        }                @Deprecated        public void onDrawOver(Canvas c, RecyclerView parent) {        }                @Deprecated        public void onDraw(Canvas c, RecyclerView parent) {        }                @Deprecated        public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {            outRect.set(0, 0, 0, 0);        }    }

其中有三个方法是@deprecated的,那么我们只需要看以下三个方法:

public void onDraw(Canvas c, RecyclerView parent, State state) {onDraw(c, parent);}public void onDrawOver(Canvas c, RecyclerView parent, State state) {    onDrawOver(c, parent);    }public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),                parent);}

第一个方法的意思是绘制分割线本身;

第二个方法是在item项目绘制完成之后进行的绘制操作(这个会覆盖在item上面);

第三个方法是设置分割线的左间距,上间距,右间距,下间距,保存在outRect中。

如图所示:

怎么使用Android itemDecoration接口实现吸顶悬浮标题

其中最底层黄色部分大小是getItemOffsets方法返回的itemDecoration的矩阵设置边距宽度,onDraw方法根据设置的间距宽度来进行绘制黄色区域,其中棕红色部分是onDrawOver方法覆盖绘制在item上层的部分。

利用ItemDecoration来绘制悬浮标题栏

我们给每个需要title的item设置rect.top = titleHeight(标题栏高度);其他的间距可以先不考虑,不重要;

重写onDraw方法,绘制我们的itemDecoration标题栏;

我们需要重写onDrawOver方法,在滑动的时候去判断,

1)如果顶部标题区域是在该标题的items范围之内的滑动的话,那么我们需要覆盖绘制一个处于recyclerView.getpaddingTop位置的title,这样的话这个范围内滑动就有一个悬停的标题栏;

2)如果顶部的标题栏区域恰好下面紧跟着下一个标题栏,那么继续向上滑动的时候,需要下面的标题栏把上面的标题栏顶出界面之外。那么绘制的顶部标题栏的起始位置就是所处的item.bottom - titleHeight的位置。

使用以上三个步骤就可以做出一个流畅并且定制化很高的悬浮标题栏功能了。

代码

class MyDecoration(context: Context): RecyclerView.ItemDecoration() {        var mPaint:Paint? = null        var mPaint2:Paint? = null        var mTextPaint:Paint? = null        var mTitleHeight:Int? = null        var mTitleHeight2:Int? = null        var mTitleTextSize:Float? = null        init {            mTitleHeight =                TypedValue.applyDimension(                    TypedValue.COMPLEX_UNIT_DIP,                    30f,                    context.getResources().getDisplayMetrics()                ).toInt()            mTitleHeight2 =                TypedValue.applyDimension(                    TypedValue.COMPLEX_UNIT_DIP,                    3f,                    context.getResources().getDisplayMetrics()                ).toInt()            mTitleTextSize =                TypedValue.applyDimension(                    TypedValue.COMPLEX_UNIT_SP,                    16f,                    context.getResources().getDisplayMetrics()                )            mTextPaint = Paint()            mTextPaint?.let {                it.setTextSize(mTitleTextSize!!)                it.setAntiAlias(true)                it.setColor(Color.WHITE)            }            mPaint = Paint()            mPaint?.let {                it.setAntiAlias(true)                it.setColor(Color.RED)            }            mPaint2 = Paint()            mPaint2?.let {                it.setAntiAlias(true)                it.setColor(Color.BLUE)            }        }                override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {            for (index in 0 until parent.childCount) {                val childView = parent.getChildAt(index)                childView?.let {                    val rect = Rect()                    val position = parent.getChildAdapterPosition(it)                    if (isTitleItem(position)) {                        rect.top = childView.top - mTitleHeight!!                        rect.bottom = childView.top                    } else {                        rect.top = childView.top - mTitleHeight2!!                        rect.bottom = childView.top                    }                    rect.left = parent.paddingLeft                    rect.right = parent.width - parent.paddingRight                    if (isTitleItem(position)) {                        mPaint?.let { it1 -> c.drawRect(rect, it1) }                        mTextPaint?.let { it3 ->                            c.drawText(                                getTitleStr(position),                                0f,                                rect.top.toFloat() + (mTitleHeight?.div(2.00f)?:0f),                                it3)}                    } else {                        mPaint2?.let { it1 -> c.drawRect(rect, it1) }                    }                }            }        }                override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {            val childView = parent.getChildAt(0)            var nextView:View? = null;            if (1 < parent.childCount) {                nextView = parent.getChildAt(1)            }            childView?.let {                val rect = Rect()                val position = parent.getChildAdapterPosition(it)                mTitleHeight?.let { height ->                    if (nextView != null                        && it.bottom - height < parent.paddingTop                        && isTitleItem(parent.getChildAdapterPosition(nextView))                        && !isSameTitle(parent.getChildAdapterPosition(nextView),position)) {                        rect.top = it.bottom - height                        rect.bottom = it.bottom                    } else {                        rect.top = parent.paddingTop                        rect.bottom = rect.top + height                    }                }                rect.left = parent.paddingLeft                rect.right = parent.width - parent.paddingRight                mPaint?.let { it1 -> c.drawRect(rect, it1) }                mTextPaint?.let { it3 ->                    c.drawText(                        getTitleStr(position),                        0f,                        rect.top + (mTitleHeight?.div(2.00f)?:0f),                        it3)}            }        }                override fun getItemOffsets(            outRect: Rect,            view: View,            parent: RecyclerView,            state: RecyclerView.State        ) {            val position:Int = parent.getChildAdapterPosition(view)            if (position % 4 == 0) {                outRect.top = mTitleHeight!!            } else{                outRect.top = mTitleHeight2!!            }        }        fun isTitleItem(position: Int):Boolean {            return position % 4 == 0        }        fun getTitleStr(position: Int):String {            return "标题:${position / 4}"        }        fun isSameTitle(position1: Int,position2: Int):Boolean {            return (position1 / 4) == (position2 / 4)        }    }

以上就是关于“怎么使用Android itemDecoration接口实现吸顶悬浮标题”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用Android itemDecoration接口实现吸顶悬浮标题

本文链接: https://www.lsjlt.com/news/345961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用Android itemDecoration接口实现吸顶悬浮标题
    这篇“怎么使用Android itemDecoration接口实现吸顶悬浮标题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2023-07-04
  • 怎么在android应用中实现一个RecyclerView悬浮吸顶效果
    本篇文章为大家展示了怎么在android应用中实现一个RecyclerView悬浮吸顶效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MultiType-Adapter打造悬浮吸顶效果注:当前版本...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么使用Vue实现鼠标悬浮更换图片功能
    今天小编给大家分享一下怎么使用Vue实现鼠标悬浮更换图片功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先将所有的选中后...
    99+
    2023-07-04
  • 怎么使用electron实现百度网盘悬浮窗口功能
    这篇文章将为大家详细讲解有关怎么使用electron实现百度网盘悬浮窗口功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。相关依赖里面使用了vuex vue vue-ro...
    99+
    2024-04-02
  • 使用jquery怎么实现图片悬浮效果
    使用jquery怎么实现图片悬浮效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码部分<!DOCTYPE html><html&...
    99+
    2023-06-14
  • 怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果
    今天就跟大家聊聊有关怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是这个最小的Tag:这个T...
    99+
    2023-05-31
    android floatingbutton roi
  • 使用vue怎么实现一个可移动的悬浮按钮
    使用vue怎么实现一个可移动的悬浮按钮?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟...
    99+
    2023-06-06
  • Android怎么使用Retrofit实现自定义Converter解析接口
    本篇内容介绍了“Android怎么使用Retrofit实现自定义Converter解析接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知...
    99+
    2023-07-05
  • CSS3怎么使用transition实现的鼠标悬停淡入淡出
    这篇文章主要讲解了“CSS3怎么使用transition实现的鼠标悬停淡入淡出”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3怎么使用transiti...
    99+
    2024-04-02
  • 怎么使用PHP实现转发接口
    今天小编给大家分享一下怎么使用PHP实现转发接口的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、什么是转发接口?转发接口是...
    99+
    2023-07-05
  • 怎么用css实现热点链接当鼠标悬停时出现白色的框
    这篇文章主要介绍“怎么用css实现热点链接当鼠标悬停时出现白色的框”,在日常操作中,相信很多人在怎么用css实现热点链接当鼠标悬停时出现白色的框问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • 不使用外部CSS样式怎么实现hover鼠标悬停改变
    这篇文章主要介绍了不使用外部CSS样式怎么实现hover鼠标悬停改变的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇不使用外部CSS样式怎么实现hover鼠标悬停改变文章都会有所...
    99+
    2024-04-02
  • CSS3怎么使用transition实现的鼠标悬停淡入淡出的效果
    小编给大家分享一下CSS3怎么使用transition实现的鼠标悬停淡入淡出的效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!代码:<!DOCTYPE html><ht...
    99+
    2024-04-02
  • 怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形
    这篇文章主要介绍“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”文章能帮助大...
    99+
    2023-07-02
  • Android应用中的标题滚动效果怎么利用Support Library 实现
    这篇文章给大家介绍Android应用中的标题滚动效果怎么利用Support Library 实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。布局文件代码在布局文件中,CoordinatorLayout作为布局文件根节...
    99+
    2023-05-31
    android support library
  • 不使用hover外部CSS样式怎么实现hover鼠标悬停改变样式
    本篇内容介绍了“不使用hover外部CSS样式怎么实现hover鼠标悬停改变样式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细...
    99+
    2024-04-02
  • 怎么在Android应用中利用CoordinatorLayout实现一个标题滚动效果
    本篇文章为大家展示了怎么在Android应用中利用CoordinatorLayout实现一个标题滚动效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在Material Design里,Coordi...
    99+
    2023-05-31
    coordinatorlayout android roi
  • C#中怎么实现并使用接口隔离原则
    在C#中实现接口隔离原则,可以通过定义多个小而精简的接口,而不是一个大而臃肿的接口。这样可以让每个接口只包含一个特定功能或行为,使得...
    99+
    2024-04-03
    C#
  • 怎么使用Spring特性实现接口多类的动态调用
    今天小编给大家分享一下怎么使用Spring特性实现接口多类的动态调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正好用到。...
    99+
    2023-06-29
  • 使用注解怎么实现一个SpringBoot 接口防刷功能
    这篇文章将为大家详细讲解有关使用注解怎么实现一个SpringBoot 接口防刷功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。项目结构如下:一、编写注解类 AccessLimitpacka...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作