仿抖音的音乐旋转

简介: 这次是实现一个仿抖音的音乐旋转自定义View,先看一下效果效果图实现这个效果主要是采用的拼凑的方法,即先实现音符动画再实现图片旋转动画然后将两个效果合并到一起。

这次是实现一个仿抖音的音乐旋转自定义View,先看一下效果

img_7c4f1aeb0026a2d08774d4971e1a14a0.gif
效果图

实现这个效果主要是采用的拼凑的方法,即先实现音符动画再实现图片旋转动画然后将两个效果合并到一起。

img_eab640f6d4dd773af8bf8b957695a72d.png
image

先看下概念图

img_e24befe93cd0c02837d2674cb83fa80e.png
概念图

●音符动画

音符动画这里是利用贝塞尔曲线+PathMeasure+ValueAnimator来实现的

img_710d4c2f1db4038be8bde4fe4ff543ba.png
音符动画概念

1.贝塞尔曲线的绘制:因为音符的运动轨迹是自下而上的,因此我们在添加Path路径的时候需要先将起点移到右下角,然后再绘制贝塞尔曲线。

path = new Path();
//将起点移到右下角
path.moveTo(getWidth(),getHeight()-getWidth()/6);
//绘制自下而上的贝塞尔曲线
path.quadTo(0,getHeight(),getWidth()/4,0);
img_5a16b57427b68baf75c94e09ab1ae415.gif
image

2.PathMeasure+ValueAnimator实现音符沿轨迹运动

private void initPath() {
    //新建两个float数组pos用来存储每个轨迹点的坐标,tan用来存储正切值
    pos = new float[2];
    tan = new float[2];
    path = new Path();
    path.moveTo(getWidth(),getHeight()-getWidth()/6);
    path.quadTo(0,getHeight(),getWidth()/4,0);
    pathMeasure = new PathMeasure(path,false);
    length = pathMeasure.getLength();
    valueAnimator = ValueAnimator.ofFloat(0,2f);
    valueAnimator.setDuration(3000);
    //设置重复执行动画
    valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
    //设置为匀速运动
    valueAnimator.setInterpolator(new LinearInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float temp=(float) animation.getAnimatedValue();
            val= temp/2;
            //这里实现音符的透明度从0~1~0的效果
            if(temp>1){
                Music3.this.setAlpha(Math.abs(temp-2f));
            }else {
                Music3.this.setAlpha(temp);
            }
            //更新界面
            invalidate();
        }
    });
    valueAnimator.start();
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //获取每个点对应的坐标
    pathMeasure.getPosTan(length*val,pos,tan);
    //创建音符BitMap宽高是逐渐放大的
    scaledBitmap = Bitmap.createScaledBitmap(bitmap, (int)(getWidth()/5*val)+4, (int)(getWidth()/5*val)+4, true);
    canvas.drawPath(path,paint);
    canvas.drawBitmap(scaledBitmap,pos[0],pos[1],paint);
}
img_05d55bad531ab3e18b483c7f76d31985.gif
音符动画

●图片旋转

这里我引用的一个第三方的圆形图片库

implementation 'de.hdodenhof:circleimageview:2.2.0'

实现图片旋转

circleImageView = findViewById(R.id.mm);
RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration(4000);
rotateAnimation.setRepeatCount(Animation.INFINITE);
circleImageView.startAnimation(rotateAnimation);
img_2e741cabfee91696969a0e685c0d5a79.gif
图片旋转

最后附上源码https://gitee.com/itfittnesss/DouYinMusic

个人博客https://myml666.github.io

目录
相关文章
|
9月前
|
移动开发 JavaScript 安全
分享66个相册特效,总有一款适合您
分享66个相册特效,总有一款适合您
92 5
|
5月前
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
5月前
宇宙星星转动特效带背景音乐引导页源码
宇宙星星转动特效带背景音乐引导页源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
77 7
宇宙星星转动特效带背景音乐引导页源码
|
9月前
如何制作一个微信音乐小游戏
如何制作一个微信音乐小游戏
238 0
|
9月前
|
XML Java Android开发
Android App开发手机阅读之使用贝塞尔曲线实现给主播刷礼物特效(附源码和演示视频 简单易懂 可直接使用)
Android App开发手机阅读之使用贝塞尔曲线实现给主播刷礼物特效(附源码和演示视频 简单易懂 可直接使用)
119 0
|
前端开发 程序员 API
教你实现微信8.0『炸裂』的礼花表情特效
作为一个前端程序员,这就勾起了我的好奇心,虽然我从来没有实现过这样的动画,但是我还是忍不住想要去实现,最终我花了2天时间去看一些库的源码到我自己实现一个类似的效果,在这里我总结一下,并且手把手地教大家怎么学习实现。而🎉有一个自己的名字,叫做五彩纸屑,英文名字叫 confetti。
教你实现微信8.0『炸裂』的礼花表情特效
|
人工智能 编解码 物联网
电视新玩法?旋转竖起来 刷手机刷短视频
随着技术发展、消费者趋势变化,近几年电视新形态设计越来越多样化。其中有一个有趣的方向,近几年短视频火热,彩电厂商也打起了主意,把电视机做成了能旋转竖起来刷短视频的“超大55吋手机”,颠覆了以往电视大屏的横屏模式。
175 0
电视新玩法?旋转竖起来 刷手机刷短视频
|
JavaScript 前端开发
仿抖音短视频系统源码,点击实现波纹效果
仿抖音短视频系统源码,点击实现波纹效果
1873 0
短视频商城源码,滑动时渐变效果实现
短视频商城源码,滑动时渐变效果实现
177 0
|
移动开发 前端开发 定位技术
仿百度地图小度语音助手的贝塞尔曲线动画
废话不多说,看下面的动图,和百度的还是有点点差别,我也不修改了,很简单,我实在是没有多余的时间,还要学习其他的东西,累啊,(复杂的动态View,可以使用SurfaceView,效率更高,我这里就简单使用View了) 效果图: 仔细观察一下百度那个动画,其实是由三层曲线组成的;每层曲线又是由三个贝塞尔曲线组成的。
1251 0