自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 Flutter 生命周期介绍

在 Flutter 应用开发过程中,理解生命周期管理至关重要,它们直接影响应用的性能、用户体验和开发效率。

2025-07-27 22:31:59 904

原创 Flutter 提取图像主色调 ColorScheme.fromImageProvider

从图像中提取主色调,用于动态适配颜色主题或者界面颜色。之前在 Flutter 应用里一直用的插件,可以分析图像颜色,从中提取一系列主要的色调。最近发现这个谷歌官方的插件竟然不维护了,后续没有更新计划了。查找了一系列资料之后,才发现原来在 Material 3 设计规范中有这么一个功能,用于从图像的主色调生成配色方案,这种配色方案可以用于自定义应用的主题,使应用的视觉风格与图像保持一致,从配色方案中再获取主色调primary。

2025-07-26 23:18:19 335

原创 Flutter 布局之 IntrinsicHeight 组件

Flutter中的IntrinsicHeight是一个特殊的布局组件,用于强制子组件在垂直方向上保持相同高度。它通过取子组件中的最大高度值来统一调整所有子组件的高度,适用于Row或Column中子组件高度不一致的场景(如文本与图片混排)。虽然功能实用,但需注意其性能开销,建议优先考虑更简单的布局方案。示例代码展示了如何用IntrinsicHeight实现三列等高的颜色块布局,每列根据内容自动调整至相同高度。该组件在需要高度一致但避免无限扩展的布局中尤为有效。

2025-06-30 21:24:45 448

原创 Flutter TextPainter 计算文本高度和行数

在开发中有的时候需要去计算文本的高度或者行数,从而控制展示的内容,比如进一步设置展示控件的高度,或者根据行数进行不同的内容展示。

2025-01-26 18:37:09 674

原创 LiveData 原理分析

LiveData 是一种可观察的数据存储器类。同时它具备生命周期感知能力,确保只更新处于活跃生命周期状态的观察者组件。

2024-12-31 18:19:55 1505

原创 Kotlin 特性之扩展函数

扩展函数是 Java 不具备的,而 Kotlin 独有的特性,在日常开发中使用频率很高,类似于设计模式中的装饰模式,其作用就是在不改变原有类的情况下,扩展新的功能。在解析扩展函数的本质之前,先来了解一下 Kotlin 的另一个特性 – 顶层函数。在 Java 中有静态方法和静态属性,一般是为了提供全局共享访问的方法和属性,是独立于对象之外的。静态方法和静态属性需要在类中声明,在使用的时候也是通过类名.方法名或者类名.属性名的方式访问。

2024-09-11 18:26:29 1609 1

原创 Android Jetpact Lifecycle 解析

Lifecycle 是 Jetpack 组件库中的一个生命周期感知型组件。

2024-09-07 17:14:03 1108

原创 ViewModel原理分析

ViewModel 是一种用来存储和管理UI相关数据的类。

2024-06-06 17:04:41 1100 1

原创 对比 delay() 和 sleep()

Kotlin 语言中的协程 Coroutine 极大地帮助了开发者更加容易地处理异步编程。就 JVM 的角度而言,协程一定程度上减少了“回调地狱”的问题,切实地改进了异步处理的编码方式。Coroutine 中封装的诸多高效 API,可以确保开发者花费更小的精力去完成并发任务。今天就来对比一下 Coroutine 中的 delay() 和 Java 语言中的 sleep()。

2024-06-04 14:19:16 848

原创 Kotlin 特色 sealed 关键字

sealed 意为密封的,可修饰类 class 和接口 interface,用来表示受限的继承结构。

2024-05-30 16:07:28 1345

原创 Compose 中的 touch 事件

pointerInput 为 Compose 中处理所有手势事件的入口,可以编写自己的手势处理程序来自定义手势。和原生开发中的 touch 事件一样,经由抵达以及实际根 View 的DecorView。经由 ViewGroup 的分发抵达 Compose 最上层的的。将转化为类型并交由处理。处理过程中先调用的记录 touch 事件的分发路径。接着调用执行分发,并按照两个步骤抵达 Compose 的各层 Node:步骤一:首先调用进行Initial和Main策略的事件分发。这其中会调用各。

2024-05-29 18:20:19 2032

原创 Compose滑动删除

在使用原生开发的时候,Android为了仿照iOS的左滑删除菜单,有一些好用的三方库,比如SwipeRevealLayout,可以实现侧滑删除。当转向Compose开发,如何实现滑动删除功能呢?找了一圈,找到了Material3自带方式和另外两个三方库,有各自不同的效果,可以根据需要的效果来选择使用哪种方式。

2024-04-09 15:12:31 1337 1

原创 Compose 中的附带效应

附带效应是指发生在可组合函数作用域之外的应用状态的变化。由于可组合项的生命周期和特性(例如可组合函数可以按任何顺序执行、可组合函数可以并行运行、重组会跳过尽可能多的内容),可组合项在理想情况下应该是无附带效应的。不过,有时附带效应是必要的,例如,触发一次性事件(例如显示信息提示控件),或在满足特定状态条件时进入另一个屏幕。这些操作应从能感知可组合项生命周期的受控环境中调用。这就需要使用Jetpack Compose 提供的不同附带效应 API。

2024-04-03 14:51:49 1018

原创 十二生肖分享

十二生肖,又叫属相,是中国与十二地支相配以人出生年份的十二种动物,包括鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪。

2024-03-05 11:12:06 2923

原创 Compose Navigation使用

如果使用纯Compose开发Android应用,在页面导航方面navigation-compose几乎是唯一选择。介绍一下navigation-compose的简单使用。

2024-01-12 12:45:24 2041

原创 Kotlin高阶函数

高阶函数是指可以接收其他函数作为参数,或者返回一个函数的函数。在许多编程语言中,高阶函数都是一种重要的编程方式,因为它们提供了更高的抽象层次,使得代码更加模块化、易于理解和维护。为什么一个函数能接收另一个函数作为参数呢?因为Kotlin中新增了函数类型,将这种函数类型添加到一个函数的参数声明或者返回值声明当中,那么该函数就是一个高阶函数了。

2023-12-11 13:47:02 222

原创 Android集成Flutter模块经验记录

记录Android原生项目集成Flutter模块经验,其中不乏一些踩坑,也是几番查找资料之后才成功运用于实际开发。主要为了记录,将使用简洁的描述。

2023-11-29 15:35:04 378

原创 Flutter动画学习之实践

在上一篇文章中了解了Animation、Curve、Controller、Tween在Flutter中动画中最主要的四个角色。本篇文章就开始实践。

2023-11-07 20:10:09 214

原创 Flutter动画学习之简介

在动画开始执行后开始生成动画帧,屏幕每刷新一次就是一个动画帧,在动画的每一帧,会随着根据动画的曲线来生成当前的动画值(Animation.value),然后根据当前的动画值去构建UI,当所有动画帧依次触发时,动画值会依次改变,所以构建的UI也会依次变化,所以最终我们可以看到一个完成的动画。其中一个比较常用的Animation类是Animation。Flutter中的动画系统是基于Animation对象的,widget可以在build函数中读取Animation对象的当前值, 并且可以监听动画的状态改变。

2023-10-30 20:01:00 122

原创 NestedScrollView嵌套WebView置顶问题

NestedScrollView嵌套WebView,且WebView上方还有其他View布局,WebView加载h5页面,在h5页面使用了下拉框,可点击,点击展开内容,点击操作这些都是h5页面处理的,跟原生没有交互。当进入该页面的时候,展示正常,且NestedScrollView可正常滑动,当在h5页面点击下拉框时,NestedScrollView触发滚动,将WebView置顶了。原因是因为在h5页面点击操作时抢占了焦点,从而出现了置顶的情况。

2023-10-24 19:14:35 465

原创 Flutter 异常捕获

Zone表示一个代码执行的环境范围,不同的Zone代码上下文是不同的互不影响。类似一个代码执行沙箱,不同沙箱的之间是隔离的,沙箱可以捕获、拦截或修改一些代码行为,如Zone中可以捕获日志输出、Timer创建、微任务调度的行为,同时Zone也可以捕获所有未处理的异常。使用try-catch进行异常捕获,捕获到异常时,创建一个ErrorWidget弹出提示。虽然代码出现了错误,但是并不会导致APP崩溃,Flutter会帮我们捕获异常。如果我们想自己上报异常,只需要提供一个自定义的错误处理回调即可。

2023-09-15 09:34:52 533

原创 Android基于MLKit实现条形码扫码

最近遇上了扫描条码的需求,在查找资料过程中不是那么地顺利,做个笔记,记录下这两篇文章,前人栽树后人乘凉。本篇文章在上一篇文章中,讲到了基于ZXing实现二维码生成&扫描,其中扫描二维码分为使用相机扫描二维码和从相册中识别二维码图片两部分,但是从相册中识别二维码图片,发现存在识别失败的问题,尤其是商品条形码,使用相机扫描商品条形码是可以正常扫描识别出来的,但是将商品条形码拍照保存进相册,使用从相册中识别二维码图片方法,却出现识别失败的情况。为此,又去查找了其他的资料,本篇借助开源库。

2023-08-20 14:56:52 1258

原创 Andorid基于ZXing实现二维码生成&扫描

说到二维码,大量的资料都会提到ZXing,具体见ZXing,这是一个用Java语言实现的1D/2D 条形码图像处理库。涉及专业知识不多做介绍,这篇文章只讲使用。

2023-08-20 14:56:08 1230

原创 ARouter基本使用及原理分析

ARouter是阿里开源的一款帮助Android App进行组件化改造的路由框架,是Android平台中对页面和服务提供路由功能的中间件,可以实现在不同模块的Activity之间跳转。ARouter的特点是灵活性强还能帮助项目解耦。ARouter使用@Route注解,在编译时期通过APT技术生成类文件用于存储path和activityClass的映射关系。在app进程启动的时候会拿到这些类文件,把里面存储的映射关系数据读到内存里,保存在路由表map中。

2023-08-15 15:17:19 676

原创 在Compose Text中插入图片inlineContent

在Android原生开发的时候,想要实现在TextView中插入图片,有多种方式可以实现:- 在xml文件中可以直接使用drawableEnd等属性- 在代码里可以使用setCompoundDrawables、setCompoundDrawablesWithIntrinsicBounds等方法- 使用ImageSpan定制插入图片

2023-07-24 19:54:52 766

原创 Android通过国家名称获取对应的国旗Emoji

遇到一个需求需要通过国家名称,如"CN"、"US",来展示国家的国旗Emoji标志。"CN"展示中国国旗Emoji🇨🇳,"US"展示美国国旗🇺🇸,这在输入法表情里其实很常见。

2023-07-21 19:32:43 1117

原创 自定义圆弧进度条(Kotlin&Compose)

开始使用compose了之后才发现一些以前需要自定义的view,洋洋洒洒几十上百行的代码,需要自定义布局属性,需要继承View,需要使用Paint,如果使用Compose,直接一个方法二十行即可解决。

2023-07-07 19:28:56 545 1

原创 Calendar.WEEK_OF_MONTH跟着系统语言变?

项目之前开发了一个日历功能,有使用到Calendar.WEEK_OF_MONTH去获取在当前月的第几周,项目本身有做多语言适配,发现Calendar.WEEK_OF_MONTH会跟随系统语言有不一样的效果,这不bug就来了,赶紧排查问题。

2023-07-03 17:34:43 241 1

原创 Kotlin之returns和jumps

最近遇到在循环中达到某个条件之后需要退出循环的需要,在Kotlin的foreach中使用return@forEach竟然有坑,因此特地写下该篇文章记录下来。在Kotlin的foreach中使用return@forEach是类似continue的效果,跳转至循环的下一步,如果要跳出循环,需要在循环外面标记run loop@{},然后使用return@loop跳出循环。进入正文。

2023-06-21 11:25:58 538

原创 Android屏幕刷新机制

由于主线程做了一些相对复杂耗时逻辑,导致CPU和GPU的处理时间超过屏幕刷新一帧的时间,由于此时back buffer写入的是B帧数据,在交换buffer前不能被覆盖,而frame buffer被Display用来做刷新用,所以在B帧写入back buffer完成到下一个VSync信号到来之前两个buffer都被占用了,CPU无法继续绘制,这段时间就会被空着,于是又出现了三缓存。当显卡帧率大于屏幕刷新频率,屏幕准备刷新第2帧的时候,GPU 已经在生成第3帧了,就会覆盖第2帧的部分数据。

2023-06-02 16:15:55 716 1

原创 Android SplashScreen API使用

在Android 12 出现了一个SplashScreen新功能,它为所有应用添加了新的应用启动动画,可以通过SplashScreen API来定制专属应用启动动画。

2023-01-18 16:40:27 2165

原创 Compose动画学习之AnimationSpec

在上一篇文章Compose开箱即用的动画API中,在compose动画的学习使用过程中,有一个参数属性一直存在,那就是AnimationSpec。不管是用于为单个值添加动画效果的animate*AsState,还是用于为多个值添加动画效果的updateTransition,亦或是一些封装好的高级别动画API:animatedContentSize、AnimatedVisibility,在这些里面都存在着AnimationSpec这个参数属性。

2022-12-03 19:00:24 538

原创 Compose开箱即用的动画API

这篇文章介绍一些Compose官方已经封装好的,可以开箱即用的动画API。

2022-12-03 18:49:07 657

原创 Android TextView实现超过固定行数折叠内容

这次的小需求是,当TextView中的内容超过固定行数时,需要折叠内容显示…并在后面拼接show more字样,点击之后将折叠内容全部展示并在后面拼接hide字样。

2022-11-25 15:32:41 1226

原创 AndroidX Media3之ExoPlayer简单使用(2)

在上一篇文章中介绍了ExoPlayer的简单使用,运用了media3-ui包中提供的关于ExoPlayer的UI组件和资源。但是在日常开发中,播放器的界面会被要求为各式各样的,没有办法使用media3-ui包中提供的通用界面。在这篇文章将介绍如何自己实现一个简单的PlayerView。

2022-11-19 21:33:56 3538

原创 AndroidX Media3之ExoPlayer简单使用(1)

ExoPlayer是谷歌开源的一个应用级的音视频播放器。Media3 是 Android 媒体支持库的新家,里面包括了 ExoPlayer,目前仍处于Beta 版阶段。

2022-11-15 17:59:27 5579

原创 学习Android启动初始化 App StartUp

StartUp是为了App的启动提供的一套简单、高效的初始化方案。

2022-09-04 14:04:30 2062

原创 Android通知 Notification的简单使用

在Android应用的开发中,必然会遇上通知的开发需求,本文主要讲一下Android中的通知 Notification的简单基本使用,主要包含创建通知渠道、初始化通知、显示通知、显示图片通知、通知点击、以及配合WorkManager发送延迟通知。

2022-08-21 15:36:22 1372

原创 Kotlin 监听键盘显示隐藏

最近碰上了需要监听键盘显示和隐藏,在Kotlin场景下封装了一个扩展方法,方便日后使用。

2022-07-31 13:45:12 926

原创 Android Activity Result API使用

在Android开发中时常需要用到跳转新页面获取结果回传数据,一直以来使用的方法就是startActivityForResult和onActivityResult两个方法,但是startActivityForResult方法却已经被deprecation,官方推荐使用ActivityResultAPI。......

2022-07-21 22:50:18 1555

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除