kotlin音乐之自定义唱片组件(简单版本)

news2025/4/19 8:14:27

代码地址

import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.os.Binder
import android.util.AttributeSet
import android.view.animation.LinearInterpolator
import androidx.appcompat.widget.AppCompatImageView
import com.software.mymusicplayer.R


class VinylView @JvmOverloads constructor(
    context: Context,attributeSet: AttributeSet? = null,
    defStyleAttr:Int = 0
) : AppCompatImageView(context,attributeSet,defStyleAttr) {

    private var state:Int
    companion object{
        val STATE_STOP = 0
        val STATE_PAUSE = 1
        val STATE_PLAYING = 2
    }
    private var animator :ObjectAnimator
    //    private var rotationAngle = 0f//旋转角度
//    constructor(context: Context):this(context,null,0)
//    constructor(context: Context,attrs: AttributeSet?):this(context,attrs,0)
    init {
        animator = ObjectAnimator.ofFloat(this,"rotation",
            0f,360f).apply {
            duration = 10000//(10秒每圈),
            interpolator = LinearInterpolator() //图片以匀速运动转动
            repeatCount = ValueAnimator.INFINITE //重复次数
            repeatMode = ValueAnimator.RESTART
        }
        state = STATE_STOP
    }
    fun playMusic(){
        when(state){
            STATE_STOP -> {
                animator.start()
                state = STATE_PLAYING
            }
            STATE_PAUSE -> {
                animator.resume()
                state = STATE_PLAYING
            }

        }
    }
    fun pauseMusic(){
        when(state){
            STATE_PLAYING -> {
                animator.pause()
                state = STATE_PAUSE
            }
        }
    }
    fun stopMusic(){
        animator.cancel()
        rotation = 0f
        state = STATE_STOP
        invalidate()//重绘
    }

    override fun onDetachedFromWindow() {//释放动画资源
        super.onDetachedFromWindow()
        animator.cancel()
    }


}

 

如上是我拷贝出来的代码,可以放到IDE上去看,更加清晰。

其中的@JVMOverload是进行了jotkin的一个构造方法的重载,在源码中AppcompatImageView是java代码,在其中有多个构造函数。那么,通过此注解就可以重载多个构造方法。

 

来看动画的实现,我的动画就利用了属性动画Object Animator 这个动画的好处在于,你在构造此动画的时候,直接输入rotation字符串就能实现围绕中心点的旋转,特别的方便。

0f,360f表示一次动画从哪转到哪。也就是转一圈

再看apply中,因为apply的使用提供了一个this的对象,所以对于属性的赋值更加的方便。

其中,duration表示一次动画的时间为10000毫秒,也就是转一圈为10秒钟。interpolator是一个插值器的属性,我指定的是线性的,保证匀速转动。其他的repeatMode表示每次开始动画都是重新来过,repeat Count表示重复次数。

这里我定义了几个资源共享的状态,可能在其他地方没太用上哈哈哈哈。😭😝😆

这几个控制方法没什么好说的,属性动画非常的贴心把动画的开始、暂停、重启、结束和取消都给我们了。

注意⚠️:一定一定要释放动画,否则可能会内存泄露,我在写代码的时候好像还没遇到过🤔。

 

对了,整体的项目结构有几个文件的代码别学习啊,我为了偷懒就没好好写✍️。尤其是有一个buttomsheetdialog都写重了😾😑。

 

接下来我打算在评论区看一看,如果buttomsheetdialog有人不知道怎么设置让一整个dialog占满一整个屏幕的话我会写一篇文章的哈。🧑🏿‍🏫🥰

 

附一个图片吧

转gif之后有点模糊🥸 

如果觉得主包写的还不赖给我点个关注吧😋

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 版本变更的变化

Redis 版本变更的变化 以下是 Redis 主要版本的清单及其核心功能变化的梳理,按时间顺序整理关键版本演进 8版本没有整理: Redis 1.0 (2009) 初始版本:发布首个稳定版本,支持基本键值存储。 核心特性: 支持字符串&…

文本纠错WPS插件:提升文档质量的利器

文本纠错WPS插件:提升文档质量的利器 引言 在数字化办公日益普及的今天,文档的质量直接影响到我们的工作效率和形象。一个错别字或标点错误,可能就会让我们的专业形象大打折扣。今天,我要向大家介绍一款强大的WPS插件——文本纠…

多光谱相机与高光谱相机的区别

多光谱相机与高光谱相机均属于光谱成像设备,但两者在‌光谱分辨率、波段数量、数据维度及应用场景‌上存在显著差异。以下是详细的对比分析: ‌一、核心差异对比 二、工作原理差异‌ ‌多光谱相机‌ ‌波段选择‌:根据目标物特性‌预设特定…

MVCC详细介绍及面试题

目录 1.什么是mvcc? 2.问题引入 3. MVCC实现原理? 3.1 隐藏字段 3.2 undo log 日志 3.2.1 undo log版本链 3.3 readview 3.3.1 当前读 ​编辑 3.3.2 快照读 3.3.3 ReadView中4个核心字段 3.3.4 版本数据链访问的规则(了解&#x…

电商企业如何实现流程精细化?日事清「标准化+可视化+自动化」全流程管理实战解析​

电商企业在业务快速发展中,往往会遇到如下问题: 1、店铺多款产品需要上新维护,但工作重点往往不清晰,员工经常忘记,没做也不当回事; 2、员工做事经常错漏细节,犯低级错误; 3、人员…

威锋VL822-Q7T10GHUB芯片适用于扩展坞显示器

一、概述 VL822-Q7T是VIA Lab(威盛电子旗下专注于USB相关技术研发的子公司)精心打造的一款高性能USB 3.1 Gen2集线器控制器芯片。在当今数字化时代,USB接口作为设备连接与数据传输的核心通道,其性能与稳定性至关重要。VL822-Q7T凭…

交换机与路由器的默契配合:它们的联系与区别

交换机与路由器的默契配合:它们的联系与区别 一. 交换机与路由器的基本功能1.1 交换机的功能1.2 路由器的功能 二. 交换机和路由器的区别三. 交换机和路由器的联系3.1 数据转发的协作3.2 网络分段与分隔3.3 协同工作提供互联网接入 四. 交换机和路由器的联合应用场景…

Redis 分布式锁+秒杀异步优化

文章目录 问题思路setnx实现锁误删问题和解决方案Redis Lua脚本问题引出解决方案 setnx实现的问题Redission快速入门redission可重入锁原理 秒杀优化(异步优化)异步秒杀思路秒杀资格判断Redis消息队列 问题 比如我们两个机器都部署了我们项目,这里nginx使用轮询的方…

Git_获取GitLab的token方法(访问令牌)

一、操作步骤 GitLab-获取token(访问令牌)主要步骤:以及相关截图 登录 GitLab 打开 GitLab 网站并登录你的账号。 进入用户设置 点击右上角头像 → Edit profile → 左侧菜单选择 Access Tokens。 创建 Token Token name: 输入名称&#…

【生活相关-日语-日本-东京-留学生-搬家后或新入驻-水道局申请饮用水(1)-办理手续】

【生活相关-日语-日本-东京-搬家后-水道局申请饮用水-办理手续】 1、前言2、情况说明(1)他人代办(2)打电话(3)网络申请(4)你将会面临什么,主要步骤(5&#xf…

【C语言】--- 预处理详解

预处理详解 1. 预定义符号2. define定义常量2. define 定义宏4. 带有副作用的宏参数5.宏替换的规则6. 宏和函数的对比7. # 和 \##7.1#运算符 7.2 \##运算符8. 命名约定9.#undef10.命令行定义11.条件编译12. 头文件的包含12.1 头文件被包含的方式12.1.1 头文件的本地包含12.1.2 …

【Axure视频教程】标准金额格式转换

今天教大家在Axure制作标准金额格式转换的原型模板,具体效果可以参考下方视频,该教程从0开始制作,手把手教学,无论是新手小白还是有一定基础的同学,都可以学习的哦。 【视频教程——试看版】 【Axure教程】标准金额格…

每日算法(双指针算法)(Day 1)

双指针算法 1.算法题目(移动零)2.讲解算法原理3.编写代码 1.算法题目(移动零) 2.讲解算法原理 数组划分,数组分块(快排里面最核心的一步)只需把0改为tmp 双指针算法:利用数组下标来…

微服务多模块构建feign项目过程与一些报错(2025详细版)

目录 1.eureka-server的注意事项 2.eureka-feign的注意事项 3.多模块构建feign项目过程 3.1创建父项目 3.2创建子项目eureka-server 3.3创建子项目eureka-provider 3.4创建子项目eureka-feign 3.5运行 给个点赞谢谢 1.eureka-server的注意事项 eureka-server的yml文件…

性能测试-tomcat连接数

Tomcat 处理请求时,是需要 Connector 进行调度和控制的,Connector是Tomcat 处理请求的主干。 Connector 中有一个 accepf队列,当客户端向服务器发送http请求时,如果客户端与操作系统完成三次握手建立了连接,就将该连接放入accept队列,poller从队列中获取到链接后,从链接…

C# 运行web项目

1、web项目直接点击顶部运行

全网通emotn ui桌面免费吗?如何开机自启动

在智能设备的使用中,一款优秀的桌面系统能带来截然不同的体验。全网通Emotn UI桌面便是其中的佼佼者,它以完全免费的特性与卓越性能,成为众多用户的心头好。 其简洁美观的界面设计如同为设备换上"清新外衣",常用功能一…

【AI模型学习】MAE——CV界的无监督预训练

文章目录 一、诞生背景1.1 自监督学习的趋势2.2 ViT 的出现 二、模型2.1 模型架构2.1.1 数据shape变化2.1.2 模型架构流程图2.1.3 PyTorch 代码示例(核心部分) 2.2 位置信息2.3 非对称的编码器-解码器结构2.4图片重构 三、实验3.1 主实验3.2 消融实验3.3…

远方游子的归家记:模仿美食网页的制作与实现

前言 2023年的夏天,闲得无聊学了一个礼拜前端知识点。并根据所学知识点模仿制作了一篇网络上公开发布的关于家乡美食的文章。今天才想到有这个不错的案例可以分享出来,以供大家学习参考。 知识点简介 运用的知识点比较简单,常规的div盒子&…

element-ui colorPicker 组件源码分享

简单分享 colorPicker 颜色选择器组件源码,主要从以下三个方面: 1、colorPicker 组件页面结构。 2、colorPicker 组件属性。 3、colorPicker 组件事件。 一、组件页面结构。 二、组件属性。 2.1 value/v-model 绑定值属性,类型为 string…