Delete 6. 动画、音频与视频.md
This commit is contained in:
@@ -1,166 +0,0 @@
|
||||
# 动画、音频与视频
|
||||
|
||||
## 动画
|
||||
|
||||
流畅的动画是 iOS 的灵魂所在。对于开发者而言,合理地使用动画,让用户体验得到提升是攻城狮们的必修课程。在前面的课程中我们 已经熟悉了对 Swift 的基础控件,接下来我们将把学习内容放到设计结构上。
|
||||
|
||||
对于动画的应用一般在 View 控件上,动画的种类大体上分为仿射变换、旋转变换以及平移三 种,对于动画过程中的速度时间我们都可以进行设置,这三种变换是所有动画的基础,例如:我们可以通过平移来实现 app 的加载和退场,可以使用仿射变换实现音乐播放时封面的动画,从而让用户有真实感。此外,我们还可以通过旋转来使整个程序增添一份趣味。下面的代码罗列了一些基本的动画使用方法,你需要熟练掌握并且试着学会如何应用。在 playgrounds 中:
|
||||
|
||||
```swift
|
||||
import UIKit
|
||||
import PlaygroundSupport
|
||||
|
||||
//初始化 View
|
||||
let liveViewFrame = CGRect(x: 0, y: 0, width: 500, height: 500) let liveView = UIView(frame : liveViewFrame) liveView .
|
||||
backgroundColor = . white
|
||||
|
||||
PlaygroundPage . current . liveView = liveView
|
||||
let smallFrame = CGRect(x: 0, y: 0, width: 100, height: 100)
|
||||
let square = UIView(frame: smallFrame)
|
||||
square.backgroundColor = .purple
|
||||
liveView.addSubview(square)
|
||||
|
||||
//添加动画
|
||||
UIView.animate(withDuration: 2.0) {
|
||||
square . backgroundColor = . orange
|
||||
let scaleTransform = CGAffineTransform(scaleX : 2.0 , y: 2.0) //添加仿射变换
|
||||
let rotateTransform = CGAffineTransform(rotationAngle: .pi)//添加旋转变换
|
||||
let translateTransform = CGAffineTransform(translationX:200, y: 200) //添加移动变换
|
||||
let comboTransform = scaleTransform.concatenating(rotateTransform ).concatenating (translateTransform ) square .transform = comboTransform //将三种变换合成
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 短效果音播放
|
||||
|
||||
一个有趣的 app 离不开各种令人印象深刻的音效。在 Swift 中,我们通常使用 AudioToolbox 与 AVFoundation 来播放音频和视频。假设导入一个 30s 内的 wav 格式音频,并将其命名为 myVoice, 接下来,我们需要将该音频的所在路径设置为虚拟的 url 地址,并将音频播放的地址设置为该地址:
|
||||
|
||||
```swift
|
||||
import UIKit
|
||||
import AudioToolbox
|
||||
|
||||
class ViewController : UIViewController{
|
||||
override func viewDidLoad () {
|
||||
super.viewDidLoad ()
|
||||
var _soundId : SystemSoundID = 0
|
||||
let path = Bundle.main.path(forResource: ”myVioce”,ofType: ”wav”)
|
||||
let soundUrl = URL( fileURLWithPath : path ! )
|
||||
AudioServicesCreateSystemSoundID ( soundUrl as CFURL,&_soundId )
|
||||
AudioServicesAddSystemSoundCompletion(_soundId , nil , nil ,{(soundID , clientData ) −> Void in
|
||||
print(”音频播放后重复之前的播放”)
|
||||
AudioServicesPlaySystemSound ( soundID )
|
||||
}, nil)
|
||||
AudioServicesPlaySystemSound ( _soundId )
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 长音乐音乐播放
|
||||
|
||||
在一款 app 中,仅仅有 30s 的效果音可能还不够,有时候我们需要导入长音乐。Swift 中内置了一款音乐播放器,对于基础开发者来说足够应用。该播放器的设置过程和短效果音的思路相同,我们也需要设置 url 路径来导入我们的本地音乐。请注意,Swift 内置的音频播放器中并没有暂停和继续播放的功能,我们需要手动设置一个 Button 来实现该效果:
|
||||
|
||||
```swift
|
||||
import UIKit
|
||||
import AVFoundation
|
||||
|
||||
class ViewController: UIViewController,AVAudioPlayerDelegate {
|
||||
var audioPlayer:AVAudioPlayer = AVAudioPlayer()
|
||||
//初始化音乐播放器为 AVAudioPlayer 格式
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
//令路径为项目文件下的音乐文件
|
||||
let path = Bundle.main.path(forResource: "兰亭序", ofType: "mp3") //将路径转化为 URL 路径
|
||||
let soundUrl = URL(fileURLWithPath: path!)
|
||||
do{
|
||||
try audioPlayer = AVAudioPlayer(contentsOf: soundUrl) audioPlayer.volume = 1.0
|
||||
//音频音量为 1.0
|
||||
audioPlayer.numberOfLoops = -1 //-1 为无限循环播放
|
||||
audioPlayer.delegate = self audioPlayer.play()
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
//定义一个暂停/恢复播放按钮
|
||||
let stopMusic = UIButton(frame: CGRect(x: 20, y: 80, width: 280, height: 44))
|
||||
stopMusic.backgroundColor = UIColor.blue
|
||||
stopMusic.setTitle("暂停/恢复音乐", for:UIControl.State.init(rawValue:0))
|
||||
|
||||
//为该按钮添加点击事件
|
||||
stopMusic.addTarget(self, action: #selector(ViewController.pauseOrResumeMusic), for: .touchUpInside)
|
||||
self.view.addSubview(stopMusic)
|
||||
}
|
||||
|
||||
//填写 objc 方法
|
||||
@objc func pauseOrResumeMusic(){
|
||||
if self.audioPlayer.isPlaying{
|
||||
//isPlaying 判断音乐是否在播放,若播放则暂停,反之亦然
|
||||
self.audioPlayer.pause()
|
||||
}else{
|
||||
self.audioPlayer.play()
|
||||
}
|
||||
}
|
||||
|
||||
func audioPlayerBeginInterruption(_ player: AVAudioPlayer) {
|
||||
print("被打断")
|
||||
}
|
||||
|
||||
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
|
||||
print("播放完成")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
附件中携带了一份我自己制作的兰亭序伴奏demo.mp3,你可以用这个音频文件进行功能实现尝试。
|
||||
|
||||
|
||||
|
||||
## 视频播放
|
||||
|
||||
实现了音频播放,该如何实现视频播放呢?Swift 中内置了视频播放的功能,总体上来说,本地视频播放的思路和音频一样,都需要我们设置视频的 url 地址,将本地视频导入其中。在此之前我们需要导入 AVFoundation 头文件,在 `viewDidLoad()`中:
|
||||
|
||||
```swift
|
||||
let moviePath = Bundle.main.path(forResource: "movie", ofType: "mp4")
|
||||
let movieURL = URL(fileURLWithPath: moviePath!)
|
||||
|
||||
let avPlayer = AVPlayer(url: movieURL as URL)
|
||||
let avPlayerLayer = AVPlayerLayer(player:avPlayer)
|
||||
avPlayerLayer.frame = self.view.bounds
|
||||
avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill self.view.layer.addSublayer(avPlayerLayer)
|
||||
avPlayer.play()
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 借助播放器
|
||||
|
||||
在上面的代码中,我们实现了视频的播放,不过你可能发现在该 项目中我们无法进行暂停与快进,更不用提画中画和声音等功能,要想实现这些内容,我们需要借助 Swift 内置的播放器:
|
||||
|
||||
```swift
|
||||
import UIKit
|
||||
import AVFoundation
|
||||
import AVKit
|
||||
|
||||
class ViewController: UIViewController {
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
//设置视频路径,令 URL 为预设地址
|
||||
let moviePath = Bundle.main.path(forResource: "movie", ofType: "mp4")
|
||||
let movieURL = URL(fileURLWithPath: moviePath!)
|
||||
//设置播放器
|
||||
let avPlayer = AVPlayer(url:movieURL as URL)
|
||||
let playerVC = AVPlayerViewController()
|
||||
playerVC.player = avPlayer
|
||||
playerVC.videoGravity = AVLayerVideoGravity.resizeAspect
|
||||
/*.resizeAspectFill 等比缩小,填满整个范围
|
||||
.resizeAspect 等比播放,中间播放 */
|
||||
playerVC.allowsPictureInPicturePlayback = true
|
||||
playerVC.showsPlaybackControls = true playerVC.view.frame = self.view.bounds
|
||||
playerVC.player!.play()
|
||||
self.view.addSubview(playerVC.view)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user