Android 高仿的音乐播放器APP源码,仿的哪个播放器忘记了,界面年直去很漂亮,功能方面可在线播放一些音乐,里面有抽屉行为控件,操作时自动将触摸位置转换为屏幕坐标。

在音乐播放的幻灯片显示方面,在Z轴上正向移动camera的视角,实际效果为放大图片。如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。在Y轴上旋转,对应图片竖向向里翻转。如果在X轴上旋转,则对应图片横向向里翻转。

文件:590m.com/f/25127180-500761347-4105c0(访问密码:551685)

以下内容无关:

-------------------------------------------分割线---------------------------------------------

数据在写入的情况下 Cow 才有存在的意义。当借用的数据被修改时,在不破坏原有数据的情况下,克隆一个副本并且在副本上进行修改;这是一种惰性的策略,在真正需要修改时才产生克隆的操作,而并不预先克隆。

关键函数

to_mut(), 获取所有权数据的可变引用,无所有权时从借用数据中克隆
into_owned(), 提取所有权数据。
使用
官方示例
官方描述了三种情况

借用数据,但是未调用 to_mut(),故不存在 clone 操作
借用数据,调用 to_mut(), 发生 clone 操作
所有权数据,调用 to_mut(), 不存在 clone 操作,因为具有该数据的所有权
use std::borrow::Cow;

fn abs_all(input: &mut Cow<[i32]>) {
for i in 0…input.len() {
let v = input[i];
if v < 0 {
// Clones into a vector if not already owned.
input.to_mut()[i] = -v;
}
}
}

// No clone occurs because input doesn’t need to be mutated.
let slice = [0, 1, 2];
let mut input = Cow::from(&slice[…]);
abs_all(&mut input);

// Clone occurs because input needs to be mutated.
let slice = [-1, 0, 1];
let mut input = Cow::from(&slice[…]);
abs_all(&mut input);

// No clone occurs because input is already owned.
let mut input = Cow::from(vec![-1, 0, 1]);
abs_all(&mut input);
观察所有权的变化
写了个地址打印函数,以此来观察所有权的变化。

fn print_addr(s: &str) {
println!("{}", s);
let mut p = s.as_ptr();
for ch in s.chars() {
println!("\t{:p}\t{}", p, ch);
p = p.wrapping_add(ch.len_utf8());
}
}
借用修改取出所有权
对借用的数据进行修改操作(有可能不会修改,见下文),操作完成后取出所有权 是最常见的用法

以下是一般的借用数据从修改至获取所有权数据的过程,通过新产生的地址可以看出来存在 clone 操作

{
let s = String::from(“AB”);
print_addr(&s);
let mut cow = Cow::Borrowed(&s);
cow.to_mut().insert_str(1, “cd”);
let sr = cow.into_owned();
print_addr(&sr);
}

// AB
// 0x7fb694c05af0 A
// 0x7fb694c05af1 B
// AcdB
// 0x7fb694c05b00 A
// 0x7fb694c05b01 c
// 0x7fb694c05b02 d
// 0x7fb694c05b03 B
上面的代码注释 to_mut() 行后,相当于不会有获取所有权的需求,这个时候是不应该做修改的,into_owned() 应该弃用转而使用 as_str() 这类没有所有权变化的操作.

{
let s = String::from(“AB”);
print_addr(&s);
let mut cow = Cow::Borrowed(&s);
// cow.to_mut().insert_str(1, “cd”); // 这一行是运行时决定的
let sr = cow.as_str(); // 看后续的使用,若是后续也只是读操作可以使用 as_str()
print_addr(&sr);
}
在所有权数据上进行修改
在对已具有所有权数据上操作时,字符串的地址未发生改变,未发生 clone 操作

insert_str 为两个 memcpy 操作,故首地址不会发生变化

{
let s1 = String::from(“cd”);
print_addr(&s1);
let mut cow1: Cow<’_, String> = Cow::Owned(s1);
cow1.to_mut().insert_str(0, “AB”);
let sr1 = cow1.into_owned();
print_addr(&sr1);
}

// cd
// 0x7fb694c05b10 c
// 0x7fb694c05b11 d
// ABcd
// 0x7fb694c05b10 A
// 0x7fb694c05b11 B
// 0x7fb694c05b12 c
// 0x7fb694c05b13 d
实现
Cow 是一个枚举值,包含了一个借用和所有。可以使用 Cow 的类型需要实现了 ToOwned trait。

ToOwned trait 同样包含了所有权或借用的操作。

需要实现 Borrow 借用 trait
可以从借用的数据中创建所有权数据或者克隆
相关 trait
pub trait ToOwned {
type Owned: Borrow; // 需要实现 Borrow triat

pub fn to_owned(&self) -> Self::Owned;  // 所有权创建
pub fn clone_into(&self, target: &mut Self::Owned) { ... }

}

pub trait Borrow where
Borrowed: ?Sized, {
pub fn borrow(&self) -> &Borrowed;
}
Borrow 借用 triat 泛型实现

impl<T: ?Sized> Borrow for T {
fn borrow(&self) -> &T {
self
}
}
to_owned 创建所有权的泛型实现如下,取决该类型是否实现 Clone tait

impl ToOwned for T
where
T: Clone,
{
type Owned = T;
fn to_owned(&self) -> T {
self.clone()
}
}
方法
to_mut()
获取所有权的可变引用

已获取所有权直接返回引用
借用数据的情况先调用 to_owned() 获取克隆副本的所有权,并且做一个检查
ref 关键字指示模式匹配为借用而不是移动。
::Owned 表示 B 类型实现了 ToOwned trait,现使用该 trait 中的 Owned 类型,本质就是B类型本身,但是限制了实现 trait

pub fn to_mut(&mut self) -> &mut ::Owned {
match *self {
Borrowed(borrowed) => {
*self = Owned(borrowed.to_owned());
match *self {
Borrowed(…) => unreachable!(),
Owned(ref mut owned) => owned,
}
}
Owned(ref mut owned) => owned,
}
}
into_owned()
取出 Cow 中的所有权数据,当为获取所有权时,进行 clone 操作

pub fn into_owned(self) -> ::Owned {
match self {
Borrowed(borrowed) => borrowed.to_owned(),
Owned(owned) => owned,
}
}
deref
由于 Cow 也实现了 Deref trait, 支持解引用强制多态,实现如下。

impl<B: ?Sized + ToOwned> Deref for Cow<’_, B> {
type Target = B;

fn deref(&self) -> &B {match *self {Borrowed(borrowed) => borrowed,Owned(ref owned) => owned.borrow(),}
}

}
上面代码的 print_addr 的参数既可以是 &str, 也可以为 &Cow.

参考

android音乐播放器app源码相关推荐

  1. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

  2. 计算机毕业设计Android的手机音乐播放器app(源码+系统+mysql数据库+Lw文档)

    项目介绍 本次程序的设计,对手机音乐播放器的框架进行了精心的构思和实现,采用主要开发工具Eclipse+Java语言,Android Development Tool的插件和Android SDK版本 ...

  3. 几款最主流的音乐播放器应用源码-android源码

    影音播放 优雅音乐播放器应用源码 这是一款不错的音乐播放器应用源码案例,优雅音乐播放器应用源码,该应用的界面有点类似小米音乐播放器,应用的整天布局还没有那 人气:3328运行环境:/android/i ...

  4. 依米花音乐播放器php源码下载

    仿依米花音乐播放器是一款简约的HTML悬浮音乐播放器,免费分享和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的.这款依米花音乐播放器php源码支持网易云/QQ音乐,可搭建类是与 ...

  5. 依米花音乐播放器php源码

    简介: 和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的. 这款依米花音乐播放器php源码支持云/QQ音乐,可搭建类是与播放器功能的平台. 源码安装方法: 环境:php5.6或 ...

  6. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  7. 最新依米花H5音乐播放器系统源码+Thinkphp内核

    正文: 最新依米花H5音乐播放器系统源码+Thinkphp内核,源码0加密,如果无法发送邮箱和短信啥的,就是你没配置好,自己去检查. 安装环境: 国内外服务器都可以用 主机无法运行 需求环境 php7 ...

  8. 【博主推荐】html好看的音乐播放器(附源码)

    html好看的音乐播放器 文章目录 1.主界面列表效果 2.主界面详情效果 3.背景风格1-背景色轮动 4.背景风格2-图片轮动 5.MP3免费下载 5.1 MyFreeMP3 5.2.铜钟音乐 源码 ...

  9. 从零开始撸音乐播放器(源码可下载)

    演示视频 哈哈,自己是真的弱.被生活狠狠打脸了. Java课设要搞音乐播放器.然而老师只讲了输入输出啥的,其他自学. 从零开始撸代码. 1 .从sound,到AppletPlayer又到Player. ...

  10. 基于Python+tkinter+pygame的音乐播放器完整源码

    import os import tkinter import tkinter.filedialog import random import time import threading import ...

最新文章

  1. 快学Java NIO
  2. linux下系统安全常见问题2
  3. 无需java安装_ubuntu配置java环境-包安装文件无需下载
  4. UI设计工具比较:Sketch、Adobe XD、墨刀、Mockplus、Axure RP
  5. [20161128]关于Little Enddian.txt
  6. java fastjson vector转为json_java对象与Json字符串之间的转化(fastjson)
  7. 【正点原子MP157连载】 第二十二章 ADC实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  8. 在线购物网站-实验4
  9. 【华为机试真题 JAVA】勾股数元组-100
  10. 豌豆怎么做好吃 这几种做法很不错
  11. Redis 实现限流器的三种方法
  12. 米哈游108薪年终奖,假的
  13. 色环电阻阻值如何识别
  14. 微博营销,究竟该怎么做?(实战系列一:粉丝篇)
  15. FreeRTOS临界段的保护
  16. [论文阅读](不确定性系列)
  17. 学校计算机报损报废申请表,学校财产登记报损上报制度
  18. coco2dx 游戏小包上架教程
  19. Web 站点提速的最佳实践(Best Practices for Speeding Up Your Web Site)
  20. 红米Note10Pro安装twrp教程

热门文章

  1. html中字体 楷体_HTML字体集锦-
  2. win10X64 + vs2015通过Cmake编译Opencv(一)
  3. docker常用操作(七)docker安装gitlab
  4. Python新闻网站项目-8.Django前端Web部署
  5. layui富文本编辑器
  6. python基于情感词典的情感分析
  7. 华为OLT快速配置指南
  8. java选课管理_学生选课管理系统(Java语言期末前测试)
  9. netsh命令改IP和重置winsock(可解决能上QQ不能上网的问题)
  10. 用python制作几款简单又好玩的小游戏,找回童年的记忆