更新记录

1.0.0(2026-01-06)

1


平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × × × × 6.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × ×

uni-app x(4.87)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 6.0 × × ×

安卓原生灵动岛 (UTS)

本插件使用 Uniapp x 的 UTS 技术开发,直接调用 Android WindowManager 实现系统级悬浮灵动岛。

即使 APP 退到后台,灵动岛依然悬浮在屏幕顶部,类似 iOS 实况活动。

功能特点

  • 🚀 纯原生:UTS 编译为 Kotlin,性能零损耗。
  • 🎨 支持图文:左侧图标 + 右侧文字。
  • 📏 超级校准:内置 API 可调节灵动岛的 Y 轴位置、宽度、高度(解决安卓机型挖孔位置不一的问题)。
  • 👆 无视边界:支持覆盖状态栏,遮挡前置摄像头。

平台支持

  • Android: ✅ (Android 6.0+)
  • iOS: ❌
  • Web: ❌

使用文档

1. 引入插件

 import { 
    showDynamicIsland, 
    hideDynamicIsland, 
    updateIslandLayout
} from "@/uni_modules/ling-Dong"; 

2. API 方法说明

函数名 参数 说明
showDynamicIsland 开启并显示灵动岛
hideDynamicIsland 关闭灵动岛
setIslandContent text, iconPath 设置文字和图标(iconPath 必须为绝对路径)
updateIslandLayout y, magicParam y: Y轴偏移量(支持负数)
magicParam: 控制宽高(<100 调整宽度,>500 调整高度)

3. 测试的时候记得在手机上开启悬浮窗权限

使用示例(uniappx):

<template>
  <view class="container">
    <text class="title">安卓灵动岛</text>

    <view class="row">
        <button class="mini-btn" size="mini" type="primary" @click="handleOpen">开启</button>
        <button class="mini-btn" size="mini" type="warn" @click="handleClose">关闭</button>
    </view>
    <view class="divider"></view>

    <!-- 1. Y轴位置 (允许负数) -->
    <text class="label">垂直位置 (Y): {{ sliderY }}</text>
    <!-- 设置负数让它往上跑 -->
    <slider :value="sliderY" :min="-100" :max="100" show-value @change="onYChange" />
    <text class="desc">向左拉=上移,向右拉=下移</text>

    <view class="divider"></view>

    <!-- 2. 高度调节 (变肥) -->
    <text class="label">岛的高度/肥度: {{ islandHeight }}</text>
    <slider :value="islandHeight" :min="30" :max="60" show-value @change="onHeightChange" />

    <view class="divider"></view>

    <!-- 3. 宽度调节 -->
    <text class="label">宽度增加: {{ sliderWidth }}</text>
    <slider :value="sliderWidth" :min="10" :max="100" show-value @change="onWidthChange" />

    <image src="/static/logo.png" style="width:0;height:0"></image>
  </view>
</template>

<script setup lang="uts">
  import { 
      showDynamicIsland, 
      hideDynamicIsland, 
      updateIslandLayout
  } from "@/uni_modules/ling-Dong"; 

  const sliderY = ref(0);         // Y轴
  const sliderWidth = ref(30);    // 宽度
  const islandHeight = ref(40);   // 高度

  const forceUpdate = () => {
   try{
       const magicNum = 500 + islandHeight.value;
       updateIslandLayout(sliderY.value, magicNum);
   }catch{
           uni.showModal({
               content: '需要开启悬浮窗权限',
           });
   }

  }

  const handleOpen = () => { 
      showDynamicIsland(); 
      forceUpdate(); // 应用当前的校准参数
  }

  const handleClose = () => {
      hideDynamicIsland();
  }

  // === 滑动事件 ===

  const onYChange = (e: UniSliderChangeEvent) => {
      sliderY.value = e.detail.value;
      // 仅修改 Y,宽度传 0 (保持不变)
      updateIslandLayout(sliderY.value, 0);
  }

  // 修改高度(变肥)
  const onHeightChange = (e: UniSliderChangeEvent) => {
      islandHeight.value = e.detail.value;
      const magicNum = 500 + islandHeight.value;
      updateIslandLayout(sliderY.value, magicNum);
  }

  // 修改宽度
  const onWidthChange = (e: UniSliderChangeEvent) => {
      sliderWidth.value = e.detail.value;
      // 正常数字,修改 padding
      updateIslandLayout(sliderY.value, sliderWidth.value);
  }

</script>

<style>
  .container { padding: 30px; }
  .title { text-align: center; font-weight: bold; margin-bottom: 20px;}
  .row { flex-direction: row; justify-content: center; }
  .mini-btn { margin: 0 10px; width: 40%; }
  .divider { height: 1px; background-color: #eee; margin: 20px 0; }
  .label { font-size: 14px; margin-top: 10px; font-weight: bold;}
  .desc { font-size: 12px; color: #999; margin-bottom: 5px; }
</style>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

测试的时候记得在手机上开启悬浮窗权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。