Compose 键盘与面板切换时,ActionBar 如何做到零抖动
页面底部有一条固定 48dp 高的操作栏(ActionBar)。点击「字体」按钮时,需要在软键盘和字体样式面板之间来回切换。朴素实现是「先收键盘,等收完再展开面板」——结果 ActionBar 会先跟着键盘掉到屏幕底部,再被面板顶回来,切换过程明显上下跳动。 目标效果是切换全程 ActionBar 在屏幕上的绝对位置纹丝不动,键盘和面板在它下方无缝互换,类似 iOS 邮件客户端的观感。本文...
页面底部有一条固定 48dp 高的操作栏(ActionBar)。点击「字体」按钮时,需要在软键盘和字体样式面板之间来回切换。朴素实现是「先收键盘,等收完再展开面板」——结果 ActionBar 会先跟着键盘掉到屏幕底部,再被面板顶回来,切换过程明显上下跳动。 目标效果是切换全程 ActionBar 在屏幕上的绝对位置纹丝不动,键盘和面板在它下方无缝互换,类似 iOS 邮件客户端的观感。本文...
一句话概括:Android 的触摸事件从上往下「派发」,每一层容器都可以选择「自己截胡」还是「继续往下发」,子控件处理不了还能「退回」给上层。 这套机制就是事件分发与拦截。它是自定义 View、解决滑动冲突的地基,也是面试必考题。本文从一个比喻讲起,把三个核心方法、传递规则、源码脉络一次讲透,最后补上 Jetpack Compose 里对应的实现原理。 先用一个比喻建立直觉 把一次触摸想...
混合开发(Hybrid)里绕不开一个问题:运行在 WebView 里的网页(JS)和运行在 Android 虚拟机里的原生代码(Java/Kotlin),怎么互相调用? 本文从底层原理讲起,梳理官方提供的几种交互方式,拆解 JsBridge 到底是什么、如何自己实现一个,最后给出目前推荐的两套现代方案及完整代码。 WebView 是两个世界的边界 Android 里的 WebView 内...
版本:V1.0 | 类型:文字模拟 + 轻策略 + Roguelike 修仙 | 引擎:Cocos Creator(2D) 定位:个人开发者产品,无内购,广告激励变现,长线内容迭代 一、产品概述 1.1 产品定位 《凡尘问道》是一款以中国修仙文化为背景的文字驱动型模拟养成游戏。玩家扮演一名资质平平的凡人,从引气入体开始,历经练气、筑基、金丹直至飞升,在数百年的修行岁月中做出无数抉...
Flutter 里用得极多的 Stream 其实是 Dart 语言(dart:async)提供的核心能力。理解它最好的切入点是和 Future 对比:Future 代表一个将来才有的异步值(比如一次网络请求的结果),而 Stream 代表一串随时间陆续到达的异步事件序列(比如点击流、传感器数据、WebSocket 消息)。 维度 Future<...
Flutter 的 Channel(平台通道)是 Dart 层与原生平台(Android/iOS 等)之间通信的桥梁。因为 Flutter 的 UI 和业务逻辑都运行在独立的 Flutter 引擎里,想访问平台特有能力(电池、传感器、蓝牙、原生 SDK 等)就必须“跨界”通信,而 Channel 就是这套异步消息传递机制。 整体架构 消息的流动是这样的:Dart 侧发起调用 → 参数...
本文整理 Flutter 高频面试知识点,按「Dart 语言 → Widget 与三棵树 → 状态管理 → 渲染与布局 → 事件机制 → 线程与异步 → 混合开发 → 性能优化 → 引擎架构」的顺序组织,方便系统性复习。 一、Dart 语言基础 Dart 为什么适合 Flutter? JIT + AOT 双编译:开发期用 JIT(Just-In-Time)编译,支持 Hot R...
用 Claude Code 写 Android 项目大半年了,从最初”当高级搜索引擎用”,到现在日常开发的大部分编码工作都交给它,中间踩了不少坑,也攒了一套自己的工作流。这篇文章把这些心得系统整理一下:怎么描述需求才高效、Token 怎么省、缓存命中率是怎么回事、会话什么时候该重开、Agent / SubAgent / Hook / MCP 这些概念到底是什么、有哪些常用命令和隐藏功能、以及...
这篇是对近一年在一款企业级 IM / 协同办公 Android 客户端上做的几项架构改造的系统复盘。产品形态可以概括为「IM 即时通讯 + 音视频会议 + 组织架构 + 轻量办公套件(日历 / 文档 / 邮箱 / 待办)」,代码按「应用宿主层 → 业务插件层 → 通用组件层 → 基础能力层」分层,采用 Kotlin + Jetpack Compose + MVI。 下面每个专题都按「背景与...
在视频播放场景里,我们经常会遇到两类需求:一类是播放时尽量复用本地缓存,减少重复网络请求;另一类是当缓存已经足够完整时,将缓存内容导出成一个完整的视频文件,供离线使用或后续处理。 Media3 已经提供了缓存、下载、播放器接入等基础能力,但“把缓存导出为一个完整文件”这件事,仍然需要业务层做一次封装。本文结合一套可落地的实践方案,系统梳理以下两个问题: 如何用 Media3 配置视...