当前位置: 首页 > news >正文

Android之流式显示内容

文章目录

  • 前言
  • 一、什么是流式读取?
  • 二、实现步骤
  • 总结


前言

相信很多新童鞋刚接触AI产品或者小说产品会遇到一个要求,就是返回的内容需要流式读取,比如生成小说,不会一次性给你返回结果的,你会定时请求接口或者websocket,每次给你返回一些文字,你要把每次的文字给组装起来并流式读取,来看看吧。


一、什么是流式读取?

流式读取,顾名思义像流水似得,慢慢读取,比如给你一篇文章,正常一下就有展示完了,但是有些地方需要流式效果,就需要一个字一个字慢慢读取达到效果。

二、实现步骤

代码如下(示例):

//定义变量
private var currentLength = 0 // 记录已显示的字符位置
private var animator: ValueAnimator? = null // 用于取消之前的动画
//每次调接口累加文本
for (i in listsj.indices) {context += listsj[i]}
//调用
animateTextFlow(context)
//实例化
val rotationAnimator = ObjectAnimator.ofFloat(imag_zq, "rotation", 0f, 360f)rotationAnimator.setDuration(2000) // 单次旋转时长(毫秒)rotationAnimator.repeatCount = ObjectAnimator.INFINITE // 无限循环rotationAnimator.interpolator = LinearInterpolator() // 线性匀速旋转rotationAnimator.start()
//流式读取方法
private fun animateTextFlow(fullText: String) {// 取消之前的动画并立即更新 currentLengthanimator?.cancel()animator = nullcurrentLength = text_context.text.length // 关键修复点val newText = fullText.substring(currentLength)if (newText.isEmpty()) returnval snapshotFullText = fullTextval snapshotCurrentLength = currentLengthanimator = ValueAnimator.ofInt(0, newText.length).apply {duration = newText.length * 50LaddUpdateListener { animation ->val index = animation.animatedValue as Inttext_context.text = snapshotFullText.substring(0, snapshotCurrentLength + index)scrollview.post { scrollview.fullScroll(View.FOCUS_DOWN) }}addListener(object : AnimatorListenerAdapter() {override fun onAnimationEnd(animation: Animator) {currentLength = snapshotCurrentLength + newText.length // 确保更新为实际长度}override fun onAnimationCancel(animation: Animator) {// 动画取消时,更新 currentLength 为当前已显示的字符数currentLength = text_context.text.length}})start()}}override fun onDestroy() {super.onDestroy()animator?.cancel() // 防止内存泄漏}

总结

其实流式读取很简单,需要注意的点就是记录每次读取的位置,不然会读取重复。

http://www.dtcms.com/a/352081.html

相关文章:

  • IjkPlayer 播放 MP4 视频时快进导致进度回退的问题
  • 【LeetCode】动态规划——542.01 矩阵
  • GitHub Copilot Pro + 模型深度解析:Java 开发者场景适配指南
  • CSS 常见选择器
  • 【硬件-笔试面试题-62】硬件/电子工程师,笔试面试题(知识点:BUCK电源电路,输出纹波影响因素)
  • 代码架构升级方案
  • Docker中如何记录非交互式连接ssh用户操作的所有命令记录?
  • 2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
  • docker compose小技巧
  • from中烟科技翼支付 面试题1
  • 红黑树下探玄机:C++ mapmultimap 的幕后之旅
  • deer-flow自定义DeepResearch流程实践经历
  • 《信息检索与论文写作》实验报告二 引文索引数据库检索
  • [pilot智驾系统] 纵向规划器(LongitudinalPlanner) | 模型预测控制(MPC)
  • jdk9安装步骤及下载(附小白详细教程)
  • 在Linux系统文件上次及下载
  • 《2025年最新IDE激活码永久破解教程 – 支持JetBrain全家桶2099年授权》
  • UE5安全架构审视:创造者的伊甸园与黑客的游乐场
  • pytorch入门4:cnn卷积神经网络
  • 《UE5_C++多人TPS完整教程》学习笔记44 ——《P45 倾斜与侧向移动(Leaning And Strafing)》
  • MoonBit Pearls Vol.06: MoonBit C-FFI 开发指南
  • 【新启航】现场逆向抄数实战:手持 3D 扫描仪 + 移动建模 APP 的轻量化工具组合与快速响应能力
  • 三款音乐生成工具,你更喜欢哪一个?
  • 如何在pixel上验证webview的功能
  • 服务初始化
  • 基于单张图像的深度估计方法研究:利用 Hugging Face 与 FiftyOne 实现单目深度估计模型的运行与评估
  • 从零开始学MCP(7) | 实战:用 MCP 构建论文分析智能体
  • 零基础从头教学Linux(Day 20)
  • javascript 基础知识- 字面量/内置对象
  • LVGL学习