All Projects → UCodeUStory → Recordvoiceview

UCodeUStory / Recordvoiceview

🍭自定义声音波纹,适合作录音应用的开发,模仿iPhone录音效果,模仿小米录音效果,其他录音效果录音效果

Programming Languages

java
68154 projects - #9 most used programming language

录音波纹控件

模仿iphone录音效果

模仿小米录音效果

小米录音界面实现详解

分析特点

  • 根据声音分贝可以自由控制高度

  • 曲线是动态,像是沿着一个方向在行走

  • 两个端点位置不变曲线两端由低到高

实现方式

  • 1 这里通过正弦函数 f(x) = sin(x)算法来实现,也可以用贝塞尔曲线,不过处理细节部分往往不太好

  • 2 f(x) = sin(x) x 是弧度 0 到2π 区间周期性变化,而我们的屏幕是宽度,0 到 480+ 以上的像素,怎么样转换成弧度呢? 我们知道 角度可以转化成弧度,而我的们的值恰好很接近角度周期性变化,因此,把每个像素看成一个角度,然后对应转化成弧度 0 到 360 对应 0 到 2π,Math有转化函数

    private float calculateY(float x) {

      /**
       * 弧度取值范围 0 2π
       */
      double rad = Math.toRadians(x);
    
      double fx = Math.sin(rad);
    
      float dy = (float) (fx * 50);
    
      return (float) (mCenterY - dy);
    

    }

  • 3 通过上面计算方法,增加点的数量可以得到一条平滑的曲线,点的数量可以按实际像素宽度计算,如果线的宽度大于1px,可以这样计算 点的数量 >= 屏幕宽度/线的宽度,这样效果最好

  • 4 通过上面方法我们只能得到一条静态的曲线,当然我们是希望他动起来,不能乱动,每个点要按sinX 成周期性变化 因此,可以通过时间控制 加入offset参数,offset 随着时间慢慢增加,让后将这个参数加入到sin函数里面

    private float calculateY(float x, float offset) {

      /**
       * 弧度取值范围 0 2π
       */
      double rad = Math.toRadians(x);
    
      double fx = Math.sin(rad + offset);
    
      float dy = (float) (fx * 50);
    
      return (float) (mCenterY - dy);
    

    }

  • 5 得到动态的曲线后,和我们预期还是不太一样,两端没有固定 通过判断两端点,会得到两个端点变化明显,并且我们的目的是两端收敛

  • 6 模仿小米还需要Path LineTo

  • 绘制3条相交的部分

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].