Skip to content

Latest commit

 

History

History
81 lines (63 loc) · 5.24 KB

File metadata and controls

81 lines (63 loc) · 5.24 KB

已初步实现你提出的四大目标的基础骨架,并完成构建通过(Debug 可编译):

本次实现覆盖点

  1. App 内自选背景图(预留)

    • Live2DWallpaperService 中添加了 bgBitmapPath 字段与 TODO 注释,后续可通过设置界面/存储权限加载用户选择的图片,然后在 drawFrame() 中绘制(当前还未集成实际图片选择与加载逻辑——后续步骤详述)。
  2. 动态壁纸骨架

    • 新增 Live2DWallpaperService(已在 AndroidManifest.xml 注册并加上 @xml/live2d_wallpaper 元数据)。
    • 提供:
      • 基础 Canvas 绘制循环(当前手动触发,无持续定时器,可根据需要加 Choreographer / Handler)。
      • 平移(单指拖动),缩放(双指捏合),双击重置。
      • 消息气泡展示队列 (最多 3 条)。
    • 后续需将现有 Live2D 渲染(ImprovedLive2DRenderer + Live2DModelLifecycleManager)接入:推荐用独立 OpenGL ES 环境(EGL + SurfaceHolder)或重构为使用 GLSurfaceView/TextureView 的 Offscreen 渲染再贴回 Canvas。(暂未集成,保留 “Live2D 模型占位” 文本作为占位)
  3. 桌面小组件消息输入链路(简化版本)

    • 新增 Widget Provider: Live2DChatWidgetProvider + 布局 widget_live2d_chat.xml + provider info live2d_chat_widget_info.xml
    • 目前小组件是一个“发送上次输入”按钮(为保持最少依赖与演示通信路径)。
    • 点击按钮会读取 SharedPreferences(widget_input)last_input(后续要在你的主 App 里提供一个界面写入它),然后广播 WallpaperComm.ACTION_SEND_MESSAGE
    • 动态壁纸中注册 BroadcastReceiver 接收消息,更新气泡并重绘。
  4. 模型作为壁纸时可拖动缩放

    • 已完成:平移(单指)、缩放(双指捏合)、双击归位(重置 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 以后也受限制)。常见替代:
    1. 打开一个透明/弹窗 Activity 输入,然后写入 SharedPreferences,返回桌面点发送按钮广播。
    2. 使用 RemoteViewssetCharSequence 更新显示最近发送内容。
  • 可添加“最近一条消息”显示,点击 widget 主区域打开输入 Activity。

D. 消息与对话逻辑

  • 如果要复用现有 WebSocket 逻辑,可让 WallpaperService 与主进程共享单例或用 bindService 异步通信。
  • 或在壁纸里独立轻量级 WebSocket 客户端(注意后台存活与省电策略)。

E. 碰撞区域 / 点击动作

  • 后续接入 Live2D 后,可将单指点按位置转换为模型坐标,调用 HitTest 决定播放的 motion。

F. 性能 & 生命周期

  • 避免常驻高帧率:可在静止时降低刷新频率(只在有动画或消息时重绘)。
  • 增加一个渲染循环控制:Choreographer.postFrameCallback 或 Handler 16ms loop(在有活动动画时才使能)。

G. 多指缩放的改进

  • 暂未做惯性/边界 clamp,可在缩放后 clamp translate,防止模型完全拖出屏幕。

下一步我可以直接帮你做的具体任务(任选):

  1. 接入 EGL + Live2D 渲染循环骨架
  2. 背景图解码与绘制实现(含大图缩放)
  3. Widget 输入 Activity + 存储 + 回填发送流程
  4. WebSocket 聊天接入到壁纸(展示实时消息气泡)
  5. 碰撞区域点击触发动作(占位逻辑)
  6. 渲染节流(空闲降帧)

只需告诉我你优先想做哪一个或组合,我继续具体实现。

使用提示(当前版本测试方式)

  1. 安装 Debug 包后:系统 设置 -> 壁纸 -> 选择动态壁纸 -> 选择 “L2DChat”(应用名称)。
  2. 添加桌面小组件(长按桌面空白 -> 小组件 -> 选择 L2DChat widget)。
  3. 在你的 App 中写一段代码(临时):
    getSharedPreferences(\"widget_input\", MODE_PRIVATE)
        .edit().putString(\"last_input\", \"测试消息\").apply()
    
    然后点击小组件发送按钮 -> 应显示气泡。
  4. 双指缩放、单指拖动、双击重置可用。

告诉我你想继续哪一块,我就进入实现。需要我先做 Live2D 渲染接入示例也可以。

已进行更改。