Skip to content

Commit d2a8b12

Browse files
committed
update
1 parent 403ba62 commit d2a8b12

8 files changed

Lines changed: 77 additions & 67 deletions

KotlinCourse/Kotlin学习教程(一).md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class MainActivity : AppCompatActivity() {
142142

143143
### 变量
144144

145-
变量可以很简单地定义成可变`var`和不可变`val`的变量。
145+
变量可以很简单地定义成可变`var`(可读可写)和不可变`val`(只读)的变量。
146146

147147
`val``Java`中使用的`final`很相似。一个不可变对象意味着它在实例化之后就不能再去改变它的状态了。如果你需要一个这个对象修改之后的版本,那就会再创建一个新的对象。
148148

@@ -205,7 +205,7 @@ var weight = 70.5 // double
205205

206206
##### 编译期常量
207207

208-
已知值的属性可以使用`const`修饰符标记为编译期常量(类似`java`中的`public static final`)。这些属性需要满足以下要求:
208+
已知值的属性可以使用`const`修饰符标记为编译期常量(类似`java`中的`public static final`)。`const`只能修复`val`不能修复`var`,这些属性需要满足以下要求:
209209

210210
- 位于顶层或者是`object`的一个成员
211211
-`String`或原生类型值初始化
@@ -214,6 +214,7 @@ var weight = 70.5 // double
214214
```kotlin
215215
// Const val are only allowed on top level or in objects
216216
const val NAME: String = "charon"
217+
217218
class MainActivity : AppCompatActivity() {
218219
override fun onCreate(savedInstanceState: Bundle?) {
219220
super.onCreate(savedInstanceState)

KotlinCourse/Kotlin学习教程(七).md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ Runnable runnable2=()->{
3939
下面来看看一个简短的概述:
4040

4141
- `lambda`表达式总是被大括号括着
42-
- 其参数(如果有的话)在` -> `之前声明(参数类型可以省略),
43-
- 函数体(如果存在的话)在` -> `后面。
42+
- 其参数(如果有的话)在`->`之前声明(参数类型可以省略),
43+
- 函数体(如果存在的话)在`->`后面。
4444

4545
`Lambda`表达式是定义匿名函数的简单方法。由于`Lambda`表达式避免在抽象类或接口中编写明确的函数声明,进而也避免了类的实现部分,所以它是非常有用的。
4646
`Kotlin`语言中,可以将一函数作为另一函数的参数。

KotlinCourse/Kotlin学习教程(三).md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Type Bit width
1616
Double 64
1717
Float 32
1818
Long 64
19-
Int 32
19+
Int 32
2020
Short 16
2121
Byte 8
2222
````

KotlinCourse/Kotlin学习教程(五).md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ val s = try { x as String } catch(e: ClassCastException) { null }
191191

192192
### 对象`(Object)`
193193

194-
声明对象就如同声明一个雷,你只需要用保留字`object`替代`class`,其他都相同。只需要考虑到对象不能有构造函数,因为我们不调用任何构造函数来访问它们。
194+
声明对象就如同声明一个类,你只需要用保留字`object`替代`class`,其他都相同。只需要考虑到对象不能有构造函数,因为我们不调用任何构造函数来访问它们。
195195
事实上,对象就是具有单一实现的数据类型。
196196

197197
```kotlin

KotlinCourse/Kotlin学习教程(八).md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,15 +128,14 @@ class App : Application() {
128128
inline fun <T> with(t: T, body: T.() -> Unit) { t.body() }
129129
```
130130

131-
- 扩张
132131

133132

134133
参考
135134
===
136135

137-
- [https://leanpub.com/kotlin-for-android-developers]https://leanpub.com/kotlin-for-android-developers
138-
- [https://developer.android.com/kotlin/resources.html]https://developer.android.com/kotlin/resources.html
139-
- [https://www.kotlincn.net/docs/reference/coding-conventions.html]https://www.kotlincn.net/docs/reference/coding-conventions.html
136+
- [Kotlin for Android Developers](https://leanpub.com/kotlin-for-android-developers)
137+
- [Resources to Learn Kotlin](https://developer.android.com/kotlin/resources.html)
138+
- [Kotlin语言中文站](https://www.kotlincn.net/docs/reference/coding-conventions.html)
140139

141140

142141
---

KotlinCourse/Kotlin学习教程(六).md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,12 @@ class MainActivity : AppCompatActivity() {
101101
Toast msg : hello, Extension
102102
```
103103

104-
按照通常的做法,会写一个`ToastUtils`工具类,或者在`BaseActivity`中实现`toast`方法,但是现在这些统统不需要了,直接给`Context`增加扩展,这样不论是`Activity`或者`Service`都可以直接调用,更简洁、更优雅。接下来是我的学习进程,希望也能对你有所帮助。
105-
106-
107-
### 扩展函数
104+
按照通常的做法,会写一个`ToastUtils`工具类,或者在`BaseActivity`中实现`toast`。但是使用扩展函数就会简单很。
105+
上面的例子就是在`Context`中添加新的方法,让我们以更简单的方式去显示`toast`,并且不用传入任何`context`参数,可以被任何`Context`或者
106+
它的子类调用。我们可以在任何地方(例如一个工具类文件中)声明这个函数,然后在`Activity`中将它作为普通方法来直接调用。当然了`Anko`中已经包括了
107+
自己的`toast`扩展函数。有关`Anko`后面会讲到。
108108

109+
`Kotlin`扩展函数允许我们在不改变已有类的情况下,为类添加新的函数。
109110
扩展函数是指对类的方法进行扩展,写法和定义方法类似,但是要声明目标类,也就是对哪个类进行扩展,`kotlin`中称之为`Top Level`
110111
扩展函数表现得就像是属于这个类的一样,而且我们可以使用`this`关键字和调用所有`public`方法。
111112
扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式:

KotlinCourse/Kotlin学习教程(四).md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ val charon2 = charon.copy(age = 19)
8989

9090
### 多声明
9191

92-
多声明,也可以理解为变量映射,这就是编译器自动生成的componentN()方法。
92+
多声明,也可以理解为变量映射,这就是编译器自动生成的`componentN()`方法。
9393

9494
```kotlin
9595
var personD = PersonData("PersonData", 20, "male")
@@ -321,16 +321,16 @@ assert(strings.size == 3)
321321
`Kotlin`通过`?`将是否允许为空分割开来,比如`str:String`为不能空,加上`?`后的`str:String?`为允许空,通过这种方式,将本是不能确定的变量人为的加入了限制条件。而不符合条件的输入,则会在`IDE`上显示编译错误而无法执行。
322322

323323
```kotlin
324-
var value1 : String = "abc"
325-
value1 = null // 编译不错误
324+
var value1: String
325+
value1 = null // 编译错误 Null can not be a value of a non-null type String
326326

327-
var value2 : String? = "abc"
328-
value2 = null // 编译能通过
327+
var value2 : String?
328+
value2 = null // 编译通过
329329
```
330330
在对变量进行操作时,如果变量是可能为空的,那么将不能直接调用,因为编译器不知道你的变量是否为空,所以编译器就要求你一定要对变量进行判断
331331
```kotlin
332332
var str : String? = null
333-
str.length // 编译不错误
333+
str.length // 编译错误 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
334334
str?.length // 编译能通过,这表示如果str不为空的时候执行length方法
335335
```
336336

@@ -519,6 +519,8 @@ for(num in nums) {
519519
```
520520

521521

522+
[1]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/Kotlin%E5%AD%A6%E4%B9%A0%E6%95%99%E7%A8%8B(%E4%B8%80).md "Kotlin学习教程(一)"
523+
522524
---
523525

524526
- 邮箱 :charon.chui@gmail.com

VideoDevelopment/视频播放相关内容总结.md

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,68 +6,72 @@
66

77
- 什么是多媒体
88

9-
多媒体是计算机和视频技术的结合,实际上它是两个媒体声音和图像,或者用现在的术语:音响和电视
9+
多媒体是计算机和视频技术的结合,实际上它是两个媒体:声音和图像
1010

1111
- 常用的视频格式
1212

13-
Android系统默认:mp43gp
14-
常用格式ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、
15-
swf、m2v、asx、ra、ram、ndivx、xvid等
13+
`Android`系统默认:`mp4`、`3gp`
14+
常用格式:`ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、
15+
swf、m2v、asx、ra、ram、ndivx、xvid`等
1616
1717
- 常用音频格式:
1818

19-
Android系统:mp3、ogg
20-
常用格式wma、mid、m4a、xmf、aac、mpa、midi、ar等
19+
`Android`系统:`mp3、ogg`
20+
常用格式:`wma、mid、m4a、xmf、aac、mpa、midi、ar`等
2121

22-
- 常用图片格式PNG、GIF、BMP、jpg
22+
- 常用图片格式:`PNG、GIF、BMP、jpg`
2323

24-
- 国内各个视频网站采用的解码框架
24+
- 国内各个视频网站采用的解码框架:
2525

26-
- 优酷、搜狐、奇艺、pps、暴风影音土豆、56网都是用的ffmpeg.
27-
- pptv已经使用p2p技术
28-
点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,
29-
而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点。这类网络可以用于多种用途,
30-
各种档案分享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中
26+
- 优酷、搜狐、奇艺、`pps`、暴风影音土豆、56网都是用的`ffmpeg`.
27+
- `pptv`已经使用`p2p`技术
28+
点对点技术(`peer-to-peer`, 简称`P2P`)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,
29+
而不是把依赖都聚集在较少的几台服务器上。`P2P`网络通常用于通过`Ad Hoc`连接来连接节点。这类网络可以用于多种用途,
30+
各种档案分享软件已经得到了广泛的使用。`P2P`技术也被使用在类似`VoIP`等实时媒体业务的数据通信中
3131
32-
目前常用的开发框架
33-
34-
- VLC框架:
35-
VLC是一个开源项目,基于ffmpeg框架的自定义播放器。其中LibVLC是VLC的核心部分,就相当于MediaPlayer类
36-
VLC一个最主要的部分,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件
37-
VLC是一种跨平台的媒体播放器和流媒体服务器,最初为videolan的客户端,它是一种非常简便的多媒体播放器,
38-
它可以用来播放各种各样的音视频的格式文件(MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等)流媒体协议
39-
最具特色的功能是可以边下载边观看Divx媒体文件,并可以播放不完全的AVI文件。并且支持界面的更改。
40-
缺点:有C/C++代码,还有Java代码,代码太庞大
32+
目前常用的开发框架:
33+
34+
- `VLC`框架:
35+
`VLC`是一个开源项目,基于`ffmpeg`框架的自定义播放器。其中`LibVLC`是`VLC`的核心部分,就相当于`MediaPlayer`类
36+
`VLC`一个最主要的部分,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件
37+
`VLC`是一种跨平台的媒体播放器和流媒体服务器,最初为`videolan`的客户端,它是一种非常简便的多媒体播放器,
38+
它可以用来播放各种各样的音视频的格式文件(`MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC`等等)流媒体协议
39+
最具特色的功能是可以边下载边观看`Divx`媒体文件,并可以播放不完全的`AVI`文件。并且支持界面的更改。
40+
缺点:有`C/C++`代码,还有`Java`代码,代码太庞大
4141

42-
- ffmpeg框架:
43-
优点轻量级框架,易于维护
44-
FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案
45-
FFMPEG几乎为你把所有的繁重工作都做了,比如解码、编码、复用和解复用。
46-
这使得多媒体应用程序变得容易编写。它是一个简单的,用C编写的,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
47-
FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,支持AVI、MPEG、OGG、Matroska、ASF等90多种解码
48-
FFmpeg主目录下主要有libavcodec、libavformat和libavutil等子目录。其中libavcodec用于存放各个encode/decode模块
49-
libavformat用于存放muxer/demuxer模块,libavutil用于存放内存操作等辅助性模块
42+
- `ffmpeg`框架:
43+
优点:轻量级框架,易于维护
44+
`FFmpeg`是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案
45+
`FFmpeg`几乎为你把所有的繁重工作都做了,比如解码、编码、复用和解复用。
46+
这使得多媒体应用程序变得容易编写。它是一个简单的,用`C`编写的,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
47+
`FFmpeg`支持`MPEG、DivX、MPEG4、AC3、DV、FLV`等40多种编码,支持`AVI、MPEG、OGG、Matroska、AS`F等90多种解码
48+
`FFmpeg`主目录下主要有`libavcodec、libavformat`和`libavutil`等子目录。其中`libavcodec`用于存放各个`encode/decode`模块
49+
`libavformat`用于存放`muxer/demuxer`模块,`libavutil`用于存放内存操作等辅助性模块
5050

51-
- vitamio框架:
52-
vitamio也是基于ffmpeg开源框架
53-
VPlayer是vitamio的一个产品,vitamio和VPlayer是同一个团队开发的,VPlayer能播放的vitamio也能播放
51+
- `vitamio`框架:
52+
`vitamio`也是基于`ffmpeg`开源框架
53+
`VPlayer`是`vitamio`的一个产品,`vitamio`和`VPlayer`是同一个团队开发的,`VPlayer`能播放的`vitamio`也能播放
5454

5555

56-
##Surface简介
56+
## `Surface`简介
57+
5758
- `Surface`就是“表面”的意思。在`SDK`的文档中,对`Surface`的描述是这样的:“`Handle onto a raw buffer that is being managed by the screen compositor`”,
58-
翻译成中文就是“由屏幕显示内容合成器`(screen compositor)`所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
59-
- 通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
60-
- 原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。
59+
翻译成中文就是“由屏幕显示内容合成器`(screen compositor)`所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
60+
61+
- 通过`Surface`(因为`Surface`是句柄)就可以获得原生缓冲器以及其中的内容。就像在`C`语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
62+
- 原生缓冲器(`rawbuffer`)是用于保存当前窗口的像素数据的。
63+
6164
- 简单的说`Surface`对应了一块屏幕缓冲区,每个`Window`对应一个`Surface`,任何`View`都是画在`Surface`上的,传统的`view`共享一块屏幕缓冲区,所有的绘制必须在`UI`线程中进行
62-
- 我们不能直接操作Surface实例,要通过SurfaceHolder,在SurfaceView中可以通过getHolder()方法获取到SurfaceHolder实例
65+
- 我们不能直接操作`Surface`实例,要通过`SurfaceHolder`,在`SurfaceView`中可以通过`getHolder()`方法获取到`SurfaceHolder`实例
6366
- `Surface`是一个用来画图形的地方,但是我们知道画图都是在一个`Canvas`对象上面进行的,*`Surface`中的`Canvas`成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,
6467
`Surface`本身的作用类似一个句柄,得到了这个句柄就可以得到其中的`Canvas`、原始缓冲区以及其他方面的内容,所以简单的说`Surface`是用来管理数据的(句柄)*。
6568

66-
## SurfaceView简介
69+
## `SurfaceView`简介
70+
6771
- 简单的说`SurfaceView`就是一个有`Surface``View`里面内嵌了一个专门用于绘制的`Surface`,`SurfaceView`控制这个`Surface`的格式和尺寸以及绘制位置.`SurfaceView`是一个`View`也许不够严谨,
6872
然而从定义中 `public class SurfaceView extends View`显示`SurfaceView`确实是派生自`View`,但是`SurfaceView`却有着自己的`Surface`,源码:
6973
```java
70-
if (mWindow == null) {
74+
if (mWindow == null) { ß
7175
mWindow = new MyWindow(this);
7276
mLayout.type = mWindowType;
7377
mLayout.gravity = Gravity.LEFT|Gravity.TOP;
@@ -82,18 +86,21 @@
8286
- `Surface`是纵深排序`(Z-ordered)`的,这表明它总在自己所在窗口的后面。
8387
- `Surfaceview`提供了一个可见区域,只有在这个可见区域内的`Surface`部分内容才可见,可见区域外的部分不可见,所以可以认为**`SurfaceView`就是展示`Surface`中数据的地方**,`Surface`就是管理数据的地方,
8488
`SurfaceView`就是展示数据的地方,只有通过`SurfaceView`才能展现`Surface`中的数据。
85-
![image](https://github.com/CharonChui/Pictures/master/SurfaceView.png?raw=true)
89+
90+
![image](https://github.com/CharonChui/Pictures/blob/master/SurfaceView.png?raw=true)
91+
92+
8693
- `Surface`的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者`Surface`的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物`(overlays)`(例如,文本和按钮等控件)。
87-
注意,如果`Surface`上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁
88-
这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)surfaceDestroyed(SurfaceHolder)。
94+
注意,如果`Surface`上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。`surfaceview`变得可见时,`surface`被创建;`surfaceview`隐藏前,`surface`被销毁
95+
这样能节省资源。如果你要查看`surface`被创建和销毁的时机,可以重载`surfaceCreated(SurfaceHolder)`和`surfaceDestroyed(SurfaceHolder)`
8996
**`SurfaceView`的核心在于提供了两个线程:`UI`线程和渲染线程**,两个线程通过“双缓冲”机制来达到高效的界面适时更新。
9097

91-
## SurfaceHolder简介
98+
## `SurfaceHolder`简介
9299

93100
显示一个`Surface`的抽象接口,使你可以控制`Surface`的大小和格式以及在`Surface`上编辑像素,和监视`Surace`的改变。这个接口通常通过`SurfaceView`类实现。
94101
简单的说就是我们无法直接操作`Surface`只能通过`SurfaceHolder`这个接口来获取和操作`Surface`
95-
SurfaceHolder`中提供了一些`lockCanvas()`:获取一个Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。加锁的目的其实就是为了在绘制的过程中,
96-
Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个线程对同一canvas写入
102+
`SurfaceHolder`中提供了一些`lockCanvas()`:获取一个`Canvas`对象,并锁定之。所得到的`Canvas`对象,其实就是`Surface`中一个成员。加锁的目的其实就是为了在绘制的过程中,
103+
`Surface`中的数据不会被改变。`lockCanvas`是为了防止同一时刻多个线程对同一`canvas`写入
97104

98105

99106
*从设计模式的角度来看,`Surface、SurfaceView、SurfaceHolder`实质上就是`MVC(Model-View-Controller)``Model`就是模型或者说是数据模型,更简单的可以理解成数据,在这里也就是`Surface`
@@ -107,7 +114,7 @@ Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个
107114
如果当前的`MediaController`只是播放前下面的控制栏部分(进度条、快进、快退、暂停等)这样我们可以通过对VideoView设置点击事件,控制它的显示和隐藏。
108115
如果`MediaController`为整个屏幕包括了控制栏部分、上端的信息显示部分、以及左右栏的功能部分、这时候就可以通过对`MediaController`本身设置点击事件来控制显示和隐藏。
109116

110-
`Controller`可以用`PopupWindow`来实现,具体有两种方式
117+
`Controller`可以用`PopupWindow`来实现,具体有两种方式:
111118

112119
- 整个控制栏(上面的信息部分、下面的控制部分以及左右边)都在`Controller`中,`setAnchorView()`的时候就会让`Controller`中的`PopupWindow`显示出来(一直显示,但是这个`PopupWindow`是透明的),
113120
真正的显示与隐藏是控制在`PopupWindow`中的`View`部分的显示与隐藏来实现。开始的时候我是想用这种方式,当时我想的是播放就播放、控制就控制,分离开来多好,但是没想到,

0 commit comments

Comments
 (0)