You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中实现点状波纹动画(不依赖第三方库)

纯原生实现圆形图片的点状波纹动画

核心思路

完全用CSS(或少量可选JS)实现,通过缩放+透明度渐变的动画效果,模拟点状波纹从圆形图片边缘向外扩散的视觉。不需要任何第三方库,性能优异。


方案1:固定位置的点状波纹(纯CSS)

适合需要固定几个点(比如上下左右)扩散的场景。

HTML结构

<div class="circle-image-container">
  <img src="your-circle-image.jpg" alt="圆形图片" class="circle-img">
  <!-- 4个点状波纹元素 -->
  <span class="wave wave-1"></span>
  <span class="wave wave-2"></span>
  <span class="wave wave-3"></span>
  <span class="wave wave-4"></span>
</div>

CSS样式

/* 容器:相对定位,用来承载图片和波纹 */
.circle-image-container {
  position: relative;
  width: 200px; /* 按需调整图片尺寸 */
  height: 200px;
}

/* 圆形图片样式 */
.circle-img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
  position: relative;
  z-index: 1; /* 确保图片在波纹上层 */
}

/* 点状波纹基础样式 */
.wave {
  position: absolute;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background-color: rgba(102, 179, 255, 0.8); /* 波纹颜色,可自定义 */
  opacity: 0;
  animation: dot-ripple 2s infinite ease-out;
}

/* 定位4个点到图片边缘 */
.wave-1 { top: 15%; left: 50%; transform: translateX(-50%); }
.wave-2 { bottom: 15%; left: 50%; transform: translateX(-50%); }
.wave-3 { left: 15%; top: 50%; transform: translateY(-50%); }
.wave-4 { right: 15%; top: 50%; transform: translateY(-50%); }

/* 核心动画:从点扩散并消失 */
@keyframes dot-ripple {
  0% {
    transform: translate(-50%, -50%) scale(1);
    opacity: 1;
  }
  100% {
    transform: translate(-50%, -50%) scale(4);
    opacity: 0;
  }
}

/* 给每个波纹设置不同的动画延迟,实现依次扩散 */
.wave-1 { animation-delay: 0s; }
.wave-2 { animation-delay: 0.5s; }
.wave-3 { animation-delay: 1s; }
.wave-4 { animation-delay: 1.5s; }

方案2:随机分布的点状波纹(CSS+少量JS)

适合需要更多随机点扩散的场景,用JS动态生成波纹元素并定位。

HTML结构

<div class="circle-image-container">
  <img src="your-circle-image.jpg" alt="圆形图片" class="circle-img">
</div>

CSS样式

.circle-image-container {
  position: relative;
  width: 200px;
  height: 200px;
}

.circle-img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
  position: relative;
  z-index: 1;
}

.wave {
  position: absolute;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background-color: rgba(102, 179, 255, 0.8);
  opacity: 0;
  animation: dot-ripple 2s infinite ease-out;
}

@keyframes dot-ripple {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  100% {
    transform: scale(4);
    opacity: 0;
  }
}

JS代码(动态生成波纹)

const container = document.querySelector('.circle-image-container');
const dotCount = 6; // 生成6个随机点
const containerSize = container.offsetWidth;

for (let i = 0; i < dotCount; i++) {
  const dot = document.createElement('span');
  dot.classList.add('wave');
  
  // 基于极坐标计算随机位置,确保点在图片边缘区域
  const angle = Math.random() * Math.PI * 2;
  const radius = containerSize / 2;
  const offset = radius * 0.8; // 控制点距离中心的距离
  const x = radius + Math.cos(angle) * offset;
  const y = radius + Math.sin(angle) * offset;
  
  dot.style.left = `${x}px`;
  dot.style.top = `${y}px`;
  dot.style.animationDelay = `${Math.random() * 2}s`; // 随机动画延迟
  container.appendChild(dot);
}

自定义调整建议

  • 修改animation属性的时长(比如把2s改成1.5s)可以调整波纹扩散速度;
  • 改变background-color的值可以自定义波纹颜色,也可以用border实现空心点状波纹;
  • 调整scale()的数值可以控制波纹扩散的范围;
  • 如果需要环形波纹(而非点状),可以把.wave的宽高设为和容器一致,用border代替background-color,动画改为从scale(1)到scale(1.5)+透明度变化。

内容的提问来源于stack exchange,提问作者Nikitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:57:09