鴻蒙系統(HarmonyOS)移動開發實戰
柳偉衛
- 出版商: 人民郵電
- 出版日期: 2025-12-01
- 定價: $479
- 售價: $478
- 語言: 簡體中文
- 頁數: 347
- ISBN: 7115645698
- ISBN-13: 9787115645692
-
相關分類:
Cross-Platform
下單後立即進貨 (約4週~6週)
相關主題
商品描述
本書圍繞如何從0開始構建一個完整的短視頻App來介紹HarmonyOS的各項功能。短視頻App擁有非常豐富的功能,比如視頻上傳、視頻發布、視頻播放、視頻暫停、視頻進度條拖動、點贊、收藏、關註、評論等眾多功能。這些功能需要用到非常多的HarmonyOS組件和API,涉及HarmonyOS的Ability、UI開發、自定義布局、數據管理、視頻、相機、圖像、安全管理、媒體數據管理等諸多主題。通過學習並實現一個類似抖音的短視頻App,讀者能夠熟悉並掌握HarmonyOS應用開發所涉及的知識點和流程,產生濃厚的學習興趣,提升編程能力水平。完整實現案例,理論結合實戰,有利於讀者學習。讀者學習完本書之後,能夠獨立承擔HarmonyOS App的設計與實現,增加就業機會。
本書適合作為高等學校移動開發相關課程的教材,也適合作為移動開發工程師的學習參考書。
作者簡介
柳偉衛 在多家知名 IT 公司擔任項目經理、架構師、高級開發顧問等職位,具有多年軟件開發管理及系統架構經驗。負責過多個省、國家級大型分布式系統的設計與研發,參與了多個大型項目的微服務架構的技術改造,在實際工作中,積累了大量的分布式系統及微服務架構經驗。業余時間創建了 waylau.com 網站,用於分享個人技術心得。喜歡開源,長期躍於各大開源社區,是 CSDN、 開源中國、雲棲社區等技術社區專家。為開源社區無私編著了《Spring Framework 4.x參考文檔》、《Netty 實戰(精髓)》、《REST 實戰》、《分布式 Java》、《Spring Boot 教程》、《Spring Security 教程》、《Thymeleaf 教程》等近30余篇技術教程,廣受網友好評。其中出版了《分布式系統常用技術及案例分析》、《Spring Boot 企業級應用開發實戰》、《Spring Cloud 微服務架構開發實戰》等專著。
目錄大綱
第1章 HarmonyOS概述
1.1 為什麼要學習HarmonyOS 1
1.1.1 國貨精品 1
1.1.2 “大廠”制造 2
1.1.3 風口紅利 2
1.2 HarmonyOS應用初體驗 2
1.3 本章小結 4
第2章 初探HarmonyOS
2.1 學習HarmonyOS之前需要哪些知識儲備 5
2.1.1 HarmonyOS開發的兩大方向 5
2.1.2 HarmonyOS應用開發的兩種技術棧 6
2.2 HarmonyOS是如何誕生的 7
2.3 HarmonyOS有哪些特性 9
2.3.1 硬件互助,資源共享 9
2.3.2 一次開發,多端部署 12
2.3.3 統一操作系統,彈性部署 12
2.4 全視角了解HarmonyOS架構 13
2.4.1 內核層 13
2.4.2 系統服務層 14
2.4.3 框架層 14
2.4.4 應用層 15
2.5 本章小結 16
第3章 開發環境搭建
3.1 開發第一步——從註冊華為賬號開始 17
3.1.1 開發者享有的服務/權益 17
3.1.2 註冊、認證需要準備的資料 17
3.1.3 註冊賬號 17
3.1.4 登錄賬號 18
3.1.5 實名認證 18
3.2 如何下載和安裝開發工具HUAWEI DevEco Studio 21
3.2.1 運行環境要求 21
3.2.2 下載和安裝Node.js 21
3.2.3 下載和安裝DevEco Studio 21
3.3 如何設置DevEco Studio 22
3.4 熟悉DevEco Studio的常用功能及使用技巧 24
3.4.1 創建新工程 24
3.4.2 打開現有工程 25
3.5 本章小結 25
第4章 HarmonyOS應用之“HelloWorld”
4.1 如何創建一個HarmonyOS應用之“HelloWorld” 26
4.1.1 創建新工程 26
4.1.2 選擇支持不同設備類型的模板 26
4.1.3 配置項目信息 27
4.1.4 自動生成工程代碼 27
4.2 怎樣使用模擬器運行HarmonyOS應用 27
4.2.1 運行工程 28
4.2.2 啟動模擬器 28
4.2.3 再次運行工程 29
4.2.4 使用本地模擬器運行應用 29
4.3 怎樣使用遠程真機運行HarmonyOS應用 31
4.3.1 啟動遠程真機設備 31
4.3.2 運行應用 31
4.3.3 對應用進行簽名 32
4.3.4 再次運行應用 33
4.4 怎樣使用本地真機運行HarmonyOS應用 33
4.4.1 連接真實的設備 33
4.4.2 運行應用 34
4.5 怎樣使用預覽器預覽HarmonyOS應用 34
4.5.1 如何安裝預覽器 35
4.5.2 如何使用預覽器 35
4.6 本章小結 35
第5章 再探HarmonyOS應用結構
5.1 鴻蒙系統真的是“安卓換殼”嗎 36
5.1.1 鴻蒙系統不是“安卓換殼” 36
5.1.2 鴻蒙系統術語解讀 37
5.2 HarmonyOS應用結構之App結構詳解 38
5.2.1 用戶應用程序 38
5.2.2 用戶應用程序包結構 38
5.2.3 代碼層次的應用 39
5.3 HarmonyOS應用結構之Ability 39
5.3.1 Ability類 39
5.3.2 AbilitySlice類 40
5.3.3 UI 40
5.4 HarmonyOS應用結構之文件詳解 41
5.4.1 庫文件 41
5.4.2 資源文件 41
5.4.3 配置文件 43
5.5 HarmonyOS應用結構之pack.info 49
5.6 本章小結 50
第6章 HarmonyOS的核心概念及常用UI組件
6.1 如何理解HarmonyOS獨有的Ability框架 51
6.1.1 FA 51
6.1.2 PA 52
6.1.3 Ability的配置 52
6.1.4 Ability的三層架構 52
6.2 初識Ability之Page Ability 53
6.2.1 Page Ability基本概念 53
6.2.2 多個AbilitySlice構成一個Page 54
6.2.3 AbilitySlice路由配置 54
6.3 深入理解Page與AbilitySlice的生命周期 55
6.3.1 Page生命周期 55
6.3.2 AbilitySlice生命周期 57
6.3.3 Page與AbilitySlice生命周期關聯 57
6.4 如何實現Page中AbilitySlice之間的路由和導航 58
6.4.1 創建應用 58
6.4.2 創建多個AbilitySlice 58
6.4.3 新增PayAbilitySlice樣式布局 59
6.4.4 設置PayAbilitySlice樣式布局 60
6.4.5 如何實現AbilitySlice之間的路由和導航 61
6.4.6 運行應用 63
6.5 再識Ability之Service Ability 63
6.5.1 創建Service 64
6.5.2 啟動與停止Service 65
6.5.3 連接Service 66
6.6 深入理解Service Ability的生命周期 67
6.7 如何實現Service的創建、啟動和連接 67
6.7.1 創建Service 67
6.7.2 創建遠程對象 70
6.7.3 修改MainAbilitySlice 70
6.7.4 修改ability_main.xml 73
6.7.5 運行應用 74
6.8 終識Ability之Data Ability 75
6.8.1 URI 75
6.8.2 訪問Data 75
6.9 如何實現Data的創建和訪問 76
6.9.1 創建Data 76
6.9.2 初始化數據庫 79
6.9.3 重寫query( )方法 80
6.9.4 重寫insert( )方法 80
6.9.5 重寫update( )方法 81
6.9.6 重寫delete( )方法 81
6.9.7 修改MainAbilitySlice 81
6.9.8 運行應用 85
6.10 深入理解Ability框架必用信息載體——lntent 86
6.10.1 Operation與Parameters 86
6.10.2 根據Ability的全稱啟動應用 86
6.10.3 根據Operation的其他屬性啟動應用 87
6.10.4 啟動系統應用 92
6.11 HarmonyOS常用UI組件 96
6.12 常用UI組件——Text 96
6.12.1 設置背景 96
6.12.2 設置字號和顏色 97
6.12.3 設置字體風格和字重 99
6.12.4 設置文本對齊方式 100
6.12.5 設置文本換行和最大顯示行數 101
6.12.6 設置自動調節字號 101
6.12.7 實現跑馬燈效果 103
6.12.8 場景示例 105
6.13 常用UI組件——Image 107
6.13.1 創建Image 107
6.13.2 設置透明度 108
6.13.3 設置縮放系數 109
6.14 常用UI組件——Slider 109
6.14.1 創建Slider 109
6.14.2 設置Slider的展示方向 110
6.15 常用UI組件——Button 111
6.15.1 創建Button 111
6.15.2 設置點擊事件 113
6.15.3 設置橢圓按鈕 115
6.15.4 設置圓形按鈕 116
6.15.5 場景示例 117
6.16 常用UI組件——PageSlider 121
6.16.1 創建PageSlider 122
6.16.2 創建PageSliderProvider的子類TextPageSliderProvider 122
6.16.3 使用PageSliderProvider 123
6.16.4 運行應用 124
6.16.5 設置布局方向 124
6.17 常用UI組件——ScrollView 125
6.17.1 創建ScrollView 125
6.17.2 配置Text顯示的內容 125
6.18 常用UI組件——ListContainer 126
6.18.1 創建ListContainer 126
6.18.2 創建ListContainer子布局文件 127
6.18.3 創建ListContainer數據包裝類 127
6.18.4 創建ListContainer數據提供者 128
6.18.5 修改MainAbilitySlice 129
6.19 常用UI組件——TabList 130
6.19.1 創建TabList 130
6.19.2 響應焦點變化 132
6.20 常用UI組件——ToastDialog 134
6.20.1 創建Button 134
6.20.2 生成ToastDialog 135
6.20.3 自定義ToastDialog的樣式 135
6.21 常用UI組件——CommonDialog 136
6.21.1 創建Button 137
6.21.2 生成CommonDialog 137
6.21.3 自定義CommonDialog的樣式 138
6.22 本章小結 138
第7章 HarmonyOS常用布局及技巧
7.1 HarmonyOS應用開發常用的6種布局方式 139
7.1.1 組件和布局 139
7.1.2 Component和ComponentContainer 139
7.1.3 LayoutConfig 140
7.1.4 組件樹 140
7.1.5 編寫布局的方式 141
7.1.6 布局方式 141
7.2 使用DirectionalLayout實現水平或者垂直方向排列 141
7.2.1 DirectionalLayout的自有XML屬性 142
7.2.2 DirectionalLayout所包含組件可支持的XML屬性 142
7.2.3 DirectionalLayout演示示例 142
7.3 使用DependentLayout實現相對位置排列 145
7.3.1 DependentLayout的自有XML屬性 146
7.3.2 DependentLayout所包含組件可支持的XML屬性 146
7.3.3 DependentLayout演示示例 148
7.4 使用StackLayout實現以層疊的方式顯示視圖 151
7.4.1 StackLayout所包含組件可支持的XML屬性 152
7.4.2 StackLayout演示示例 152
7.5 使用TableLayout以表格的方式劃分子組件 153
7.5.1 TableLayout的自有XML屬性 153
7.5.2 TableLayout演示示例 154
7.6 使用PositionLayout通過指定準確的坐標值顯示組件 155
7.7 使用AdaptiveBoxLayout實現自適應布局能力 157
7.7.1 AdaptiveBoxLayout實現原理 157
7.7.2 AdaptiveBoxLayout常用方法 157
7.7.3 AdaptiveBoxLayout演示示例 158
7.8 本章小結 161
第8章 短視頻App需求分析及設計
8.1 短視頻平臺概況 162
8.1.1 短視頻平臺百花齊放 162
8.1.2 短視頻平臺功能 163
8.2 我們要實現的功能 163
8.3 HarmonyOS短視頻App架構 165
8.4 HarmonyOS短視頻App之前臺設計 166
8.5 HarmonyOS短視頻App之後臺設計 167
8.6 HarmonyOS短視頻App之存儲設計 167
8.6.1 關系數據庫運作機制 167
8.6.2 ORM數據庫運作機制 168
8.6.3 HarmonyOS短視頻App的存儲設計主要內容 168
8.7 本章小結 168
第9章 短視頻App原型設計與實現
9.1 應用初始化 169
9.1.1 為什麼需要原型設計 169
9.1.2 如何實現原型設計 169
9.1.3 創建短視頻App 170
9.2 歡迎界面 170
9.2.1 創建WelcomePageAbility 170
9.2.2 修改ability_welcome.xml 170
9.2.3 主入口顯示WelcomePageAbility 171
9.3 註冊界面 172
9.3.1 創建RegisterAbilitySlice 172
9.3.2 修改ability_register.xml 172
9.3.3 導航到RegisterAbilitySlice 172
9.4 首頁 173
9.4.1 註冊界面添加Button 173
9.4.2 從註冊界面導航到MainAbilitySlice 174
9.5 導航欄 175
9.5.1 用DirectionalLayout實現導航欄 175
9.5.2 用Button實現導航欄中的按鈕 175
9.6 視頻發布界面 177
9.6.1 新建VideoPublishPageAbility 177
9.6.2 修改ability_video_publish_layout.xml 177
9.6.3 從首頁導航到VideoPublishPageAbility 177
9.7 “我的”界面 179
9.7.1 創建MePageAbility 179
9.7.2 從首頁導航到MePageAbility 180
9.7.3 從視頻發布界面導航到MePageAbility 181
9.7.4 從MePageAbility導航到視頻發布界面 182
9.7.5 從MePageAbility導航到首頁 183
9.8 本章小結 184
第10章 短視頻App個人管理模塊設計與實現
10.1 美化歡迎界面 185
10.1.1 更換Logo 185
10.1.2 修改背景色 186
10.1.3 修改字體顏色 186
10.2 基於TextField搭建註冊界面 187
10.2.1 使用TextField實現賬號和密碼輸入框 187
10.2.2 使用Image設置頭像 188
10.2.3 修改Button樣式 188
10.3 基於ScrollView、TableLayout實現相冊界面 189
10.3.1 創建ImageSelectionAbilitySlice 189
10.3.2 TableLayout和ScrollView 189
10.3.3 動態添加圖片到TableLayout 190
10.3.4 動態計算圖片的寬度 191
10.4 將JSON文件內容解析為圖片資源 193
10.4.1 準備本地圖片資源及JSON文件 193
10.4.2 讀取JSON文件內容 193
10.4.3 JSON字符串轉換為Java對象列表 194
10.5 實現本地圖片資源獲取的工具類CommonUtil 195
10.5.1 創建實現本地圖片資源獲取的方法getImageSource( ) 195
10.5.2 將JSON數據轉換為PortraitInfo列表數據 195
10.5.3 使用CommonUtil在相冊中顯示圖片 196
10.6 選取本地圖片資源作為用戶頭像 197
10.6.1 跳轉到相冊界面 197
10.6.2 選擇相冊圖片 198
10.7 通過onResult( )獲取頭像選擇的結果 199
10.7.1 使用presentForResult( )跳轉界面 200
10.7.2 使用setResult( )回寫結果 200
10.7.3 重寫onResult( )來獲取結果 201
10.8 對用戶註冊/登錄時賬號、密碼進行校驗 201
10.8.1 獲取用戶的賬號和密碼 201
10.8.2 校驗賬號和密碼 202
10.9 對用戶註冊/登錄時頭像進行校驗 202
10.9.1 將頭像路徑作為類成員變量 202
10.9.2 完善校驗方法 203
10.10 初始化ORM數據庫 204
10.10.1 添加與compileOptions相關的配置 204
10.10.2 繼承OrmDatabase 205
10.10.3 創建DatabaseUitl 205
10.10.4 執行DatabaseUtil.initStore( )初始化數據存儲 206
10.11 基於ORM實現用戶信息存儲 207
10.11.1 定義用戶實體UserInfo 207
10.11.2 創建用戶數據倉庫UserInfoRepository 209
10.11.3 使用UserInfoRepository存儲和查詢用戶信息 210
10.12 本章小結 211
第11章 短視頻App核心功能——視頻管理模塊
11.1 定義視頻播放器的生命周期接口IVideoPlayerLifecycle 212
11.2 定義視頻播放器的狀態枚舉類PlayerStatusEnum和視頻播放器的狀態變化監聽器StatusChangeListener 212
11.2.1 PlayerStatusEnum 213
11.2.2 StatusChangeListener 214
11.3 定義視頻播放器的接口IVideoPlayer 214
11.4 實現視頻播放器的生命周期接口實現類VideoPlayerLifecycle 216
11.5 基於Player、Surface實現視頻播放器 218
11.5.1 創建VideoPlayer 218
11.5.2 創建Builder 218
11.5.3 實現addSurface( )方法 219
11.5.4 實現addPlayerStatusCallback( )方法 219
11.5.5 實現play( )方法 219
11.5.6 實現構造函數 220
11.5.7 實現initBasePlayer( )方法 220
11.5.8 實現start( )方法 224
11.5.9 實現replay( )方法 225
11.5.10 實現reload( )方法 225
11.5.11 實現resume( )方法 225
11.5.12 實現pause( )方法 226
11.5.13 實現getCurrentPosition( )方法 226
11.5.14 實現getDuration( )方法 226
11.5.15 實現getVideoScale( )方法 226
11.5.16 實現rewindTo( )方法 227
11.5.17 實現isPlaying( )方法 227
11.5.18 實現stop( )方法 227
11.5.19 實現release( )方法 227
11.5.20 實現getLifecycle( )方法 228
11.5.21 實現getPlayerStatus( )方法 228
11.5.22 實現getBuilder( )方法 228
11.6 定義綁定視頻播放器相關信息的接口IVideoPlayerInfoBinding 228
11.6.1 新建VideoInfo 229
11.6.2 定義VideoPlayerInfo 232
11.6.3 定義IVideoPlayerInfoBinding接口 233
11.7 基於自定義布局實現播放器界面PlayerView 233
11.7.1 定義PlayerView 233
11.7.2 成員變量及構造函數的實現 234
11.7.3 綁定、解綁視頻播放器相關信息 236
11.7.4 自適應屏幕大小 237
11.7.5 啟動播放 237
11.8 基於自定義布局、AnimatorProperty實現加載動畫界面PlayerLoading 238
11.8.1 創建PlayerLoading類 238
11.8.2 創建布局文件video_player_loading_layout.xml 239
11.8.3 成員變量及構造函數的實現 239
11.8.4 綁定、解綁視頻播放器相關信息 241
11.8.5 實現onTouchEvent( )方法 242
11.9 基於自定義布局、Slider實現視頻控制器界面PlayerController 243
11.9.1 定義PlayerController 243
11.9.2 創建布局文件video_player_controller_layout.xml 244
11.9.3 成員變量及構造函數的實現 245
11.9.4 實現createHandler( )方法 246
11.9.5 實現initView( )方法 249
11.9.6 實現initListener( )方法 250
11.9.7 實現bind( )方法 250
11.9.8 實現unbind( )方法 252
11.10 基於ORM實現視頻信息存儲 253
11.10.1 定義實體VideoInfo 253
11.10.2 註冊VideoInfo 253
11.10.3 創建VideoInfoRepository 253
11.11 基於JSON文件的視頻列表讀取 256
11.11.1 準備數據及JSON文件 256
11.11.2 讀取視頻列表並初始化到數據庫中 256
11.12 基於PageSlider實現滑動切換視頻功能 257
11.12.1 在ability_main.xml中增加PageSlider 257
11.12.2 新增VideoPlayerPageSlider-Provider類 258
11.12.3 獲取登錄用戶的信息 261
11.12.4 通過initData( )方法初始化視頻信息數據 262
11.12.5 使用initPageSlider( )方法初始化PageSlider 263
11.12.6 運行應用 264
11.13 設置導航欄的樣式 264
11.14 視頻信息的展示 266
11.14.1 修改video_player_controller_layout.xml 266
11.14.2 修改PlayerController 267
11.15 視頻發布界面整體布局設計 268
11.15.1 修改ability_video_publish_layout.xml 268
11.15.2 獲取用戶信息 270
11.15.3 初始化組件 270
11.16 基於ScrollView、TableLayout實現視頻選擇界面 270
11.16.1 為什麼沒有采用拍攝並上傳視頻的方式 271
11.16.2 創建視頻選擇界面的布局文件 271
11.16.3 創建視頻選擇界面的AbilitySlice 272
11.16.4 跳轉到視頻選擇界面及返回 275
11.16.5 視頻發布 276
11.16.6 運行應用 277
11.17 基於ToastDialog實現發布校驗與提示 277
11.18 本章小結 278
第12章 短視頻App功能實現——視頻展示模塊
12.1 “我的”界面整體布局 279
12.1.1 修改ability_me_layout.xml 279
12.1.2 獲取用戶信息 282
12.1.3 實現個人信息展示區 282
12.1.4 基於PixelMapElement實現背景圖 283
12.2 基於ListContainer實現視頻發布列表功能 284
12.2.1 視頻列表展示區 284
12.2.2 初始化視頻列表 284
12.2.3 初始化分類頁簽及設置TabList選擇事件 285
12.2.4 基於ListContainer實現視頻列表 286
12.2.5 使用VideoListItemProvider 290
12.3 基於CommonDialog實現編輯界面 291
12.3.1 繼承CommonDialog 291
12.3.2 定義編輯界面的布局文件 291
12.3.3 實現編輯界面 292
12.3.4 使用編輯界面 293
12.4 刪除視頻 294
12.5 基於Image實現視頻點贊、取消點贊功能 294
12.5.1 視頻播放界面操作區布局設計 295
12.5.2 實現點贊按鈕及點贊量的顯示 296
12.5.3 處理視頻點贊及取消點贊事件 297
12.6 基於ORM實現點贊信息存儲 298
12.6.1 定義實體MeThumbsupVideoInfo 298
12.6.2 註冊實體MeThumbsupVideoInfo 300
12.6.3 創建MeThumbsupVideoInfo-Repository 300
12.6.4 處理視頻點贊與取消點贊操作 301
12.6.5 初始化首頁數據時的點贊信息處理 302
12.7 基於ListContainer實現視頻點贊列表功能 303
12.7.1 新建視頻點贊列表數據項布局文件 303
12.7.2 繼承BaseItemProvider用於點贊列表數據項呈現 304
12.7.3 初始化視頻點贊列表 306
12.7.4 自定義TabList選擇事件 306
12.8 基於Image實現視頻收藏、取消收藏功能 307
12.8.1 視頻播放界面操作區布局設計 308
12.8.2 實現收藏按鈕及收藏量的顯示 308
12.8.3 處理視頻收藏及取消收藏事件 309
12.9 基於ORM實現收藏信息存儲 310
12.9.1 定義實體MeFavoriteVideoInfo 310
12.9.2 註冊實體MeFavoriteVideoInfo 312
12.9.3 創建MeFavoriteVideoInfo-Repository 312
12.9.4 處理視頻收藏與取消收藏操作 313
12.9.5 初始化首頁數據時的收藏信息處理 313
12.10 基於ListContainer實現視頻收藏列表功能 314
12.10.1 新建視頻收藏列表數據項布局文件 314
12.10.2 繼承BaseItemProvider用於收藏列表數據項呈現 315
12.10.3 初始化視頻收藏列表 317
12.10.4 自定義TabList選擇事件 317
12.11 基於Button實現關註、取關功能 319
12.11.1 視頻播放界面操作區布局設計 319
12.11.2 實現“關註”按鈕 319
12.11.3 處理關註及取關事件 320
12.12 基於ORM實現關註信息存儲 321
12.12.1 定義實體UserFollowInfo 321
12.12.2 註冊實體UserFollowInfo 322
12.12.3 創建UserFollowInfoRepository 322
12.12.4 處理關註與取關操作 323
12.12.5 初始化首頁數據時的關註信息處理 324
12.13 基於ListContainer實現關註列表功能 324
12.13.1 新建關註列表數據項布局文件 325
12.13.2 繼承BaseItemProvider用於關註列表數據項呈現 326
12.13.3 初始化關註列表 327
12.13.4 自定義TabList選擇事件 328
12.14 基於CommonDialog實現評論窗口功能 329
12.14.1 增加評論等組件 329
12.14.2 創建基於CommonDialog的評論窗口 330
12.14.3 實現評論列表 334
12.14.4 使用評論窗口 337
12.15 基於ORM實現評論信息存儲 339
12.15.1 定義實體CommentInfo 339
12.15.2 註冊實體CommentInfo 339
12.15.3 創建CommentInfoRepository 340
12.15.4 存儲評論信息 340
12.15.5 從數據庫中獲取評論信息 341
12.16 如何實現簡易版播放器 341
12.16.1 創建界面布局文件 341
12.16.2 實現簡易版播放器 341
12.17 實現視頻預覽 345
12.17.1 實現“我的”作品預覽 345
12.17.2 實現“我的”點贊預覽 345
12.17.3 實現“我的”收藏預覽 346
12.18 實現沈浸式用戶體驗 347
12.19 本章小結 347
附錄A 本書所涉及的技術及軟件版本

