最新要闻
- 天天快资讯:金属机身、独立语音助手!小米Sound Move便携智能音箱图赏
- 温和去油不刺激:水密码氨基酸洗面奶9.9元大促
- 小米看了要报警!用iPhone换新买小米13 Ultra可立省400元
- 继续领先韩国、日本 我国造船业三大指标均保持世界第一
- 焦点简讯:VR冒险游戏《苍穹乾坤》:没有32GB内存就别玩了
- 【焦点热闻】天风证券赵晓光:未来芯片领域将是汽车竞争的主要部分
- 世界微头条丨上海嘉定电子社保卡如何申请,申请方法如下
- 每日短讯:今日亚盘外汇技术分析(2023年4月19日)
- 资讯推荐:Nuada机械仿生手套:内置多种传感器可用于辅助诊疗
- 小米汽车明年量产!雷军现身上海车展参观众车企:蔚来李斌亲自接待
- 全球信息:科学家在快餐包装中发现PFAS永久化学品:强酸/碱、高温都无法降解
- “变性”、打针都改不了的“坏毛病”:人类还要被折磨多久?
- 全球消息!“发哥”再次雄起!天玑9200+跑分首曝近137万 冠绝安卓
- 不止封杀老头乐!北京将试点在外卖快递车上加装芯片:实时检测轨迹
- 天天即时:2023WTT澳门冠军赛:马龙晋级十六强
- 每日焦点!黄玉强出任中国平安审计责任人
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日动态!欢迎页轮播动画
如图,引导开始,球从上落下,同时淡入文字,然后文字开始轮播,最后一页时停止,点击进入首页。
在来看看效果图。
重力球先不讲,主要欢迎轮播简单实现
(相关资料图)
首先新建一个类TextTranslationXGuideView,用于动画展示
文本是类似的,最后会有个图片箭头动画,布局很简单,就是一个 TextView 跟 ImageView,直接写 xml 布局里方便了
所以TextTranslationXGuideView 直接继承 FrameLayout,然后动态添加布局,控制动画
val root = LayoutInflater.from(context) .inflate(R.layout.login_layout_text_translation_x_guide, this, false) root.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) addView(root) mBinding = LoginLayoutTextTranslationXGuideBinding.bind(root)
login_layout_text_translation_x_guide
文字颜色换行等通过 span 设置,所以需要一个类去配置
data class TextTranslationXGuideBean( val content: String, //内容 val bright: String?, //高亮文本 val brightColor: Int = R.color.bl_black //高亮字体颜色 )
轮播配置成动态的,所以这里使用一个集合去存储
private val guideList = mutableListOf()
/** * 添加单个引导文本 * @param content 内容 * @param bright 高亮文本 * @param brightColor 高亮字体颜色 * */ fun addTextGuide( content: String, bright: String? = null, brightColor: Int? = null ): TextTranslationXGuideView { guideList.add(TextTranslationXGuideBean(content, bright, brightColor ?: R.color.bl_black)) return this }
然后在动态设置内容跟图片
/** 设置引导内容 */ private fun setGuideContent(bean: TextTranslationXGuideBean) { mBinding?.tvContent?.text = bean.content val span = SpanUtils.with(mBinding?.tvContent) .append(bean.content) .setForegroundColor(resources.getColor(R.color.bl_black, null)) bean.bright?.let { span.append("\n${bean.bright}") .setForegroundColor(resources.getColor(bean.brightColor, null)) } span.create() }
接下来需要两个动画,一个淡入,一个平移(TextView 自带的跑马灯不好控制,后期如果更换方案改动也大)
private var mTranslationAnimator: ValueAnimator? = nullprivate var mFlickerAnimator: ValueAnimator? = nullinit { initView() initTranslationAnimation() initGuideRightAnimate() }
平移动画重复执行,轮播显示,通过下标控制,显示 guideList 中的数据,如果轮播到最后一条,展示箭头闪烁动画
private fun initTranslationAnimation() { val point = -ScreenUtils.getScreenWidth().toFloat() mTranslationAnimator = ValueAnimator.ofFloat(0f, point) mTranslationAnimator?.duration = 300 mTranslationAnimator?.interpolator = LinearInterpolator() mTranslationAnimator?.addUpdateListener { animation -> val scrollX = animation.animatedValue as Float translationX = scrollX if (scrollX <= point) { mTranslationAnimator?.cancel() alpha = 0f translationX = 0f nextGuide() } } }private fun initTranslationAnimation() { val point = -ScreenUtils.getScreenWidth().toFloat() mTranslationAnimator = ValueAnimator.ofFloat(0f, point) mTranslationAnimator?.duration = 300 mTranslationAnimator?.interpolator = LinearInterpolator() mTranslationAnimator?.addUpdateListener { animation -> val scrollX = animation.animatedValue as Float translationX = scrollX if (scrollX <= point) { mTranslationAnimator?.cancel() alpha = 0f translationX = 0f nextGuide() } } }/** 开始时调用 */ fun initGuide() { position = 0 if (guideList.size > 0) { guideList.getOrNull(position)?.let { setGuideContent(it) } //渐入 alpha = 0f startAlphaAnimation(1500) { startTranslationAnimator() } } }
结束时清楚缓存跳转首页
fun clear() { guideList.clear() mTranslationAnimator?.cancel() mTranslationAnimator = null mFlickerAnimator?.cancel() mFlickerAnimator = null }
全部实现
/** 登录引导动画 */class TextTranslationXGuideView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { private var mBinding: LoginLayoutTextTranslationXGuideBinding? = null private var mTranslationAnimator: ValueAnimator? = null private var mFlickerAnimator: ValueAnimator? = null private val guideList = mutableListOfTextTranslationXGuideView() private var position = 0//当前显示的引导索引 var clickRight: (() -> Unit)? = null init { initView() initTranslationAnimation() initGuideRightAnimate() } private fun initView() { val root = LayoutInflater.from(context) .inflate(R.layout.login_layout_text_translation_x_guide, this, false) root.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) addView(root) mBinding = LoginLayoutTextTranslationXGuideBinding.bind(root) mBinding?.ivGuide1?.setOnThrottledClickListener { clickRight?.invoke() } mBinding?.ivGuide2?.setOnThrottledClickListener { clickRight?.invoke() } } private fun initTranslationAnimation() { val point = -ScreenUtils.getScreenWidth().toFloat() mTranslationAnimator = ValueAnimator.ofFloat(0f, point) mTranslationAnimator?.duration = 300 mTranslationAnimator?.interpolator = LinearInterpolator() mTranslationAnimator?.addUpdateListener { animation -> val scrollX = animation.animatedValue as Float translationX = scrollX if (scrollX <= point) { mTranslationAnimator?.cancel() alpha = 0f translationX = 0f nextGuide() } } } private fun startTranslationAnimator() { mTranslationAnimator?.start() } private fun initGuideRightAnimate() { mFlickerAnimator = ValueAnimator.ofFloat(0f, 1f) mFlickerAnimator?.duration = 600 mFlickerAnimator?.interpolator = LinearInterpolator() mFlickerAnimator?.repeatMode = ValueAnimator.REVERSE mFlickerAnimator?.repeatCount = ValueAnimator.INFINITE mFlickerAnimator?.addUpdateListener { animation -> val alpha = animation.animatedValue as Float mBinding?.ivGuide2?.alpha = alpha } } private fun startGuideRightAnimator() { mBinding?.ivGuide2?.visibility = View.VISIBLE mBinding?.ivGuide2?.alpha = 0f mFlickerAnimator?.start() } /** 开始时调用 */ fun initGuide() { position = 0 if (guideList.size > 0) { guideList.getOrNull(position)?.let { setGuideContent(it) } //渐入 alpha = 0f startAlphaAnimation(1500) { startTranslationAnimator() } } } /** 下一个引导 */ private fun nextGuide() { position += 1 //是否为最后一条数据 val isEndGuide = position == guideList.size - 1 //第一个图标需要先展示 mBinding?.ivGuide1?.visibility = if (isEndGuide) View.VISIBLE else View.GONE guideList.getOrNull(position)?.let { setGuideContent(it) startAlphaAnimation { if (position < guideList.size - 1) { //如果有,循环执行下一个引导 startTranslationAnimator() } else { //最后一个,执行渐变闪烁动画 startGuideRightAnimator() } } } } private fun startAlphaAnimation(duration: Long = 1000L, endListener: (() -> Unit)) { animate().setDuration(duration).alpha(1f) .setListener(object : Animator.AnimatorListener { override fun onAnimationStart(p0: Animator?) {} override fun onAnimationEnd(p0: Animator?) { endListener.invoke() } override fun onAnimationCancel(p0: Animator?) {} override fun onAnimationRepeat(p0: Animator?) {} }) } /** 设置引导内容 */ private fun setGuideContent(bean: TextTranslationXGuideBean) { mBinding?.tvContent?.text = bean.content val span = SpanUtils.with(mBinding?.tvContent) .append(bean.content) .setForegroundColor(resources.getColor(R.color.bl_black, null)) bean.bright?.let { span.append("\n${bean.bright}") .setForegroundColor(resources.getColor(bean.brightColor, null)) } span.create() } /** * 添加单个引导文本 * @param content 内容 * @param bright 高亮文本 * @param brightColor 高亮字体颜色 * */ fun addTextGuide( content: String, bright: String? = null, brightColor: Int? = null ): TextTranslationXGuideView { guideList.add(TextTranslationXGuideBean(content, bright, brightColor ?: R.color.bl_black)) return this } fun clear() { guideList.clear() mTranslationAnimator?.cancel() mTranslationAnimator = null mFlickerAnimator?.cancel() mFlickerAnimator = null } data class TextTranslationXGuideBean( val content: String, //内容 val bright: String?, //高亮文本 val brightColor: Int = R.color.bl_black //高亮字体颜色 )}
关键词:
【Jmeter】基础介绍-详细
每日动态!欢迎页轮播动画
天天快资讯:金属机身、独立语音助手!小米Sound Move便携智能音箱图赏
温和去油不刺激:水密码氨基酸洗面奶9.9元大促
小米看了要报警!用iPhone换新买小米13 Ultra可立省400元
继续领先韩国、日本 我国造船业三大指标均保持世界第一
焦点简讯:VR冒险游戏《苍穹乾坤》:没有32GB内存就别玩了
【焦点热闻】天风证券赵晓光:未来芯片领域将是汽车竞争的主要部分
世界微头条丨上海嘉定电子社保卡如何申请,申请方法如下
全球微速讯:终于把 Spring Boot 3.0 写成书了!
天天热文:CANN开发实践:4个DVPP内存问题的典型案例解读
全球微资讯!vulstack2 靶场做题笔记
每日短讯:今日亚盘外汇技术分析(2023年4月19日)
微速讯:科创板收盘播报:科创50指数涨0.41% 医药医疗股普遍调整
资讯推荐:Nuada机械仿生手套:内置多种传感器可用于辅助诊疗
小米汽车明年量产!雷军现身上海车展参观众车企:蔚来李斌亲自接待
全球信息:科学家在快餐包装中发现PFAS永久化学品:强酸/碱、高温都无法降解
“变性”、打针都改不了的“坏毛病”:人类还要被折磨多久?
全球消息!“发哥”再次雄起!天玑9200+跑分首曝近137万 冠绝安卓
不止封杀老头乐!北京将试点在外卖快递车上加装芯片:实时检测轨迹
天天即时:2023WTT澳门冠军赛:马龙晋级十六强
每日视点!SPSS安装及破解教程
天天微资讯!从申请到调用:全国快递物流查询 API 使用教程
小鹿线怎么样?
全球速读:ESXi主机报错:其他主机硬件对象的状态(System Management Software 1 SEL Fullness)
顶象uni-app版设备指纹上线,满足企业多平台服务需求
每日焦点!黄玉强出任中国平安审计责任人
天天看点:旷视科技联合中盾安信:AI赋能新时代,营造安全可信的数字环境
女子上班6天工资仅发41元:老板以各种理由克扣
【世界独家】工人在线向马斯克求助讨薪:首起特斯拉上海工厂致命生产事故意外曝光
当前观察:iQOO Neo8系列下月发:标准版骁龙8+ Pro版天玑9200+
今日热讯:腾讯发布五一假期未成年人限玩通知:打游戏也要调休
【环球播资讯】认同吗?魅族前高管称5千到1万安卓机不值得冲 网友吵翻就苹果值?
全球消息!在 Linux 上配置一个 syslog 服务器
焦点短讯!一千个需求如何快速排序?MoSCoW排序法用上了!【No.2】
环球观天下!张轩昊丨操作思路分享【4月19日】今日黄金原油操作建议,实盘交易干货分享!
日本政府考虑取消重要人物街头演讲 改为在室内进行
环球观点:机器一样会“过劳死”!一机器人展览会上连续工作20小时后倒下
要完全停用中国造芯片、PC等绝非虚言!戴尔:正专注从中国以外采购零部件
今日热搜:滴滴自动驾驶卡车KargoBot亮相:一位司机同时“开”多辆卡车
全球快报:为什么终面往往是HR面,核心考察候选人的什么能力?
企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器
每日快看:C#12预览版释出,新功能一览
俄乌总统先后到访冲突前线,俄媒:战事胶着,普京此访释放重要信号
绿茵生态:子公司休闲旅游项目一期已建成落地
天天速递!外卖员身绑树枝挂吊瓶送外卖 网友:致敬每一位努力的人
焦点快报!这看的是电影?北影节一影片票价炒到8000元
世界报道:今年内上市 比亚迪B级纯电猎装SUV宋L获好评:成熟大厂作品
全球报道:2元/支起速囤!小米/usmile/舒客等电动牙刷刷头狂促
天天热推荐:对标小米13 Ultra!真我11 Pro+外观首曝:圆环镜组、绿色素皮后盖
民生直通车|相对生存率提高 监测系统覆盖全国——我国持续完善癌症防治体系
北斗GPS卫星授时系统介绍(时间同步服务器)
python 多线程详解
天天看热讯:云时代,MySQL到ClickHouse数据同步产品对比推荐
全球焦点!MySQL事务实现原理
“格物致知 叩问苍穹”2023年中国航天踏上新征程
世界热头条丨海南房子合适买吗?《滨江商业广场》优势不足全面解读~
世界今头条!小米13 Ultra被抢购一空!雷军:备货非常困难
全球热点!发改委:下大力气稳定汽车消费 鼓励车企开发乡村“专车”
32.88万起售 全新林肯航海家上市:环绕大屏加持如开星际飞船
环球实时:暗光长焦加持!OPPO Reno10 Pro+来了:堪称“小Find X6”
每日快看:误入“小人国”!华为P60 Pro长焦微距效果惊艳
三星7652机身内存是多少?三星7652参数配置
小米2sc是哪一年上市的?小米2sc参数配置
活性水是什么意思?活性水和直饮水的区别是什么?
红眼病是怎么引起的?红眼病的症状有哪些?
三星笔记本NC10显卡怎么下载?三星笔记本nc10显卡配置
天天观察:香港金管局再承接69.16亿港元沽盘?
打不过啊!本赛季老鹰对绿军0胜5负 场均净负13.2分
国家发展改革委:正在抓紧研究起草关于恢复和扩大消费政策文件
快看点丨极端高温出现 印度一颁奖礼热死11人:每人获赔4.1万
热门:开卷!微软拟自研AI芯片“戴安娜”:降低机器学习成本
黑入iPhone仅需一条iMessage消息!多起NSO“零点击”攻击曝光
米粉首发入手小米13 Ultra:实在太香了 小米11 Pro终于退休了
一体成型无拼接:康巴赫整竹双面砧板69元新低(90元券)
环球热消息:安卓微信暗黑模式怎么设置_设置暗黑模式的方法
环球报道:魏牌全面做强大六/七座市场,“蓝山/高山双旗舰组合”闪耀上海车展
天天热议:软件安全之CRC检测
世界新资讯:六(二)、springMVC数据转换 jacson配置,json中的date由Date格式化输出
[nacos]JAR启动并加载/解析Nacos yml格式的配置文件时,报“java.nio.charset.MalformedInputException:
天天看热讯:山西省政府存量债券柜台市场交易流通业务上线
全国股份转让系统:北京长峰医院因发生重大风险事件,今日起股票停牌
世界快资讯:性能看齐RTX 3060 硬件发烧友打造无风扇显卡
世界热讯:被称为“冰箱杀手”的李斯特菌 到底有多恐怖?
【环球播资讯】小米13 Ultra拆解出炉:后摄几乎占满了主板
全球即时:小米13 Ultra预售秒罄!卢伟冰预言成真:1TB版被抢爆了
79元 小米米家多功能充电台灯开启众筹:一灯多用 秒变手电筒
热头条丨相扑标准动作详解
焦点短讯!4月19日盘前重要公司新闻
天天观速讯丨2023年“泼水节” 西双版纳旅游总收入超21亿元
孔乙己如何再造一个“孔乙己”?
SSD数据不能恢复?或许还有的救
环球视点!最完美的徕卡镜头!小米13 Ultra摄影套装版图赏
新华时评·首季经济形势|巩固企稳回升态势 推动经济运行持续整体好转
观察:实例讲解Playwright(二)
Mysql中的数据类型注意事项
观察:新华时评·首季经济形势|巩固企稳回升态势 推动经济运行持续整体好转
播报:美股异动 | 爱立信(ERIC.US)跌超7% 警告成熟市场5G支出将继续缩减
天天观焦点:哈尔滨还要往北300公里 我国在建最北高铁站取得新进展
五一假期返程火车票今日开抢:千万别忘记