已初步实现你提出的四大目标的基础骨架,并完成构建通过(Debug 可编译):
-
App 内自选背景图(预留)
- 在
Live2DWallpaperService中添加了bgBitmapPath字段与 TODO 注释,后续可通过设置界面/存储权限加载用户选择的图片,然后在drawFrame()中绘制(当前还未集成实际图片选择与加载逻辑——后续步骤详述)。
- 在
-
动态壁纸骨架
- 新增
Live2DWallpaperService(已在 AndroidManifest.xml 注册并加上@xml/live2d_wallpaper元数据)。 - 提供:
- 基础 Canvas 绘制循环(当前手动触发,无持续定时器,可根据需要加 Choreographer / Handler)。
- 平移(单指拖动),缩放(双指捏合),双击重置。
- 消息气泡展示队列 (最多 3 条)。
- 后续需将现有
Live2D渲染(ImprovedLive2DRenderer+Live2DModelLifecycleManager)接入:推荐用独立 OpenGL ES 环境(EGL + SurfaceHolder)或重构为使用GLSurfaceView/TextureView的 Offscreen 渲染再贴回 Canvas。(暂未集成,保留 “Live2D 模型占位” 文本作为占位)
- 新增
-
桌面小组件消息输入链路(简化版本)
- 新增 Widget Provider:
Live2DChatWidgetProvider+ 布局widget_live2d_chat.xml+ provider infolive2d_chat_widget_info.xml。 - 目前小组件是一个“发送上次输入”按钮(为保持最少依赖与演示通信路径)。
- 点击按钮会读取
SharedPreferences(widget_input)中last_input(后续要在你的主 App 里提供一个界面写入它),然后广播WallpaperComm.ACTION_SEND_MESSAGE。 - 动态壁纸中注册 BroadcastReceiver 接收消息,更新气泡并重绘。
- 新增 Widget Provider:
-
模型作为壁纸时可拖动缩放
- 已完成:平移(单指)、缩放(双指捏合)、双击归位(重置 scale/translate)。
- 当前对拖拽和缩放没有边界限制,可后续引入边界裁剪或惯性。
A. Live2D 真正渲染接入
- 方案1(推荐):在 Wallpaper Engine
Engine内直接创建 EGL 上下文(EGL14+GLES20),参照你现有GLSurfaceView的 renderer 逻辑,把ImprovedLive2DRenderer移植为可手动onSurfaceCreated/onDrawFrame调用。 - 方案2:使用
PixelCopy+ 隐藏GLSurfaceView/ Offscreen FBO,性能与集成复杂度较高,不推荐初版。 - 需要在
onVisibilityChanged(true)时恢复渲染循环,在onDestroy中释放 live2d 资源。
B. 背景图选择
- 在主 App 新增一个设置界面,启动系统图片选择(
ACTION_OPEN_DOCUMENT),得到Uri后复制到本地 cache 或保存persistableUriPermission。 - 将路径存到 SharedPreferences(例如
wallpaper_bg_path),动态壁纸启动时读取并 decode(注意大图用inSampleSize缩放)。 - 支持双击空白处切换背景 / 长按弹菜单等可选 UX。
C. Widget 输入改进
- 目前 widget 布局没有 EditText(App Widget 不支持直接交互式输入框,Android 12 以后也受限制)。常见替代:
- 打开一个透明/弹窗 Activity 输入,然后写入 SharedPreferences,返回桌面点发送按钮广播。
- 使用
RemoteViews的setCharSequence更新显示最近发送内容。
- 可添加“最近一条消息”显示,点击 widget 主区域打开输入 Activity。
D. 消息与对话逻辑
- 如果要复用现有 WebSocket 逻辑,可让 WallpaperService 与主进程共享单例或用
bindService异步通信。 - 或在壁纸里独立轻量级 WebSocket 客户端(注意后台存活与省电策略)。
E. 碰撞区域 / 点击动作
- 后续接入 Live2D 后,可将单指点按位置转换为模型坐标,调用 HitTest 决定播放的 motion。
F. 性能 & 生命周期
- 避免常驻高帧率:可在静止时降低刷新频率(只在有动画或消息时重绘)。
- 增加一个渲染循环控制:Choreographer.postFrameCallback 或 Handler 16ms loop(在有活动动画时才使能)。
G. 多指缩放的改进
- 暂未做惯性/边界 clamp,可在缩放后 clamp translate,防止模型完全拖出屏幕。
- 接入 EGL + Live2D 渲染循环骨架
- 背景图解码与绘制实现(含大图缩放)
- Widget 输入 Activity + 存储 + 回填发送流程
- WebSocket 聊天接入到壁纸(展示实时消息气泡)
- 碰撞区域点击触发动作(占位逻辑)
- 渲染节流(空闲降帧)
只需告诉我你优先想做哪一个或组合,我继续具体实现。
- 安装 Debug 包后:系统 设置 -> 壁纸 -> 选择动态壁纸 -> 选择 “L2DChat”(应用名称)。
- 添加桌面小组件(长按桌面空白 -> 小组件 -> 选择 L2DChat widget)。
- 在你的 App 中写一段代码(临时):
然后点击小组件发送按钮 -> 应显示气泡。
getSharedPreferences(\"widget_input\", MODE_PRIVATE) .edit().putString(\"last_input\", \"测试消息\").apply() - 双指缩放、单指拖动、双击重置可用。
告诉我你想继续哪一块,我就进入实现。需要我先做 Live2D 渲染接入示例也可以。
已进行更改。