Skip to content

Commit 0a90da5

Browse files
committed
update readme
1 parent 9509a8f commit 0a90da5

7 files changed

Lines changed: 160 additions & 46 deletions

File tree

AdavancedPart/注解使用.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
注解使用
22
===
33

4-
###简介
4+
### 简介
55

66
> Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.
77
@@ -12,7 +12,7 @@
1212
`Annotation`是不会影响程序代码的执行,无论`annotation`怎么变化,代码都始终如一地执行。
1313
`Java`语言解释器在工作时会忽略这些`annotation`,因此在`JVM`中这些`annotation`是“不起作用”的,只能通过配套的工具才能对这些`annontaion`类型的信息进行访问和处理。
1414

15-
###说明
15+
### 说明
1616

1717
- `Annotation`的声明是通过关键字`@interface`。这个关键字会去继承`Annotation`接口。
1818
- `Annotation`的方法定义是独特的、受限制的。
@@ -37,7 +37,7 @@
3737
}
3838
```
3939
40-
###作用
40+
### 作用
4141
4242
`Annotation`一般作为一种辅助途径,应用在软件框架或者工具中。让这些工具类可以根据不同的`Annotation`注解信息来采取不同的处理过程或者改变相应程的行为。具有“让编译器进行编译检查的作用”。
4343
@@ -48,10 +48,10 @@
4848
- 运行时动态处理,如得到注解信息
4949
5050
51-
###Annotation分类
51+
### Annotation分类
5252
5353
54-
#####标准的`Annotaion`
54+
##### 标准的`Annotaion`
5555
5656
从`jdk 1.5`开始,自带了三种标准的`annotation`类型:
5757
@@ -65,7 +65,7 @@
6565
它不是`marker`类型的`Annotation`。用户告诉编译器不要再对该类、方法或者成员变量进行警告提示。
6666
6767
68-
#####元`Annotation`
68+
##### 元`Annotation`
6969
7070
元`Annotation`是指用来定义`Annotation`的`Annotation`。
7171
@@ -101,7 +101,7 @@
101101
- `@Documented`
102102
是否会保存到`javadoc`文档中。
103103
104-
###自定义`Annotation`
104+
### 自定义`Annotation`
105105
106106
假设现在有个开发团队在每个类的开始都要提供一些信息,例如:
107107
@@ -153,7 +153,7 @@ public class Generation3List extends Generation2List {
153153
}
154154
```
155155
156-
###`Annotation`解析
156+
### `Annotation`解析
157157
158158
当`Java`源代码被编译时,编译器的一个插件`annotation`处理器则会处理这些`annotation`。
159159
处理器可以产生报告信息,或者创建附加的`Java`源文件或资源。
@@ -169,7 +169,7 @@ public class Generation3List extends Generation2List {
169169
所以可以像查询普通的`Java`对象一样查询这些方法返回的`Annotation`。
170170
171171
172-
#####运行时`Annotation`解析
172+
##### 运行时`Annotation`解析
173173
174174
该类是指`@Retention`为`RUNTIME`的`Annotation`。
175175
该类型的解析其实本质的使用反射。反射执行的效率是很低的
@@ -426,7 +426,7 @@ public @interface OnClick {
426426
427427
428428
429-
#####编译时`Annotation`解析
429+
##### 编译时`Annotation`解析
430430
431431
在刚才介绍的运行时注解中,很多人肯定会说使用反射会影响性能,那有没有不影响性能的方式呢?当然有了,那就是编译时注解。在编译时会通过注解标示来动态生成一些类或者`xml`,而在运行时,这里注解是没有的,它会依靠动态生成的类来进行操作。所以它就和直接调用方法一样,当然不会有效率影响了。
432432
@@ -580,7 +580,7 @@ public class Processor extends AbstractProcessor{
580580
`javapoet`:`A Java API for generating .java source files.`可以更方便的生成代码,它可以帮助我们通过类调用的形式来生成代码。
581581
582582
583-
###自定义编译时注解
583+
### 自定义编译时注解
584584
585585
在自定义注解时,一般来说可能会建三个`modules`:
586586
@@ -1530,7 +1530,7 @@ try {
15301530
我们这么做是因为想让我们的工厂模式的例子的使用者在他们的工程中只编译注解,而包含处理器模块只是为了编译。有点晕?我们举个例子,如果我们只有一个包。如果另一个开发者想要把我们的工厂模式处理器用于他的项目中,他就必须包含`@Factory`注解和整个`FactoryProcessor`的代码(包括`FactoryAnnotatedClass`和`FactoryGroupedClasses`)到他们项目中。我非常确定的是,他并不需要在他已经编译好的项目中包含处理器相关的代码。如果你是一个`Android`的开发者,你肯定听说过`65536`个方法的限制(即在一个`.dex`文件中,只能寻址65536个方法)。如果你在`FactoryProcessor`中使用`guava`,并且把注解和处理器打包在一个包中,这样的话,`Android APK`安装包中不只是包含`FactoryProcessor`的代码,而也包含了整个`guava`的代码。`Guava`有大约20000个方法。所以分开注解和处理器是非常有意义的。
15311531
15321532
1533-
###使用注解提高代码的检查性
1533+
### 使用注解提高代码的检查性
15341534
15351535
`Google`提供了`Support-Annotations library`来支持更多的注解功能。
15361536
可以直接在`build.gradle`中添加如下代码:

README.md

Lines changed: 131 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ Android学习笔记
1212
===
1313

1414
- 源码解析
15-
- [自定义View详解]()
16-
- [Activity界面绘制过程详解]()
17-
- [Activity启动过程]()
18-
- [Android Touch事件分发详解]()
19-
- [AsyncTask详解]()
20-
- [butterknife源码详解]()
21-
- [InstantRun详解]()
22-
- [ListView源码分析]()
23-
- [VideoView源码分析]()
24-
- [View绘制过程详解]()
25-
- [网络部分]()
26-
- [HttpURLConnection详解]()
27-
- [HttpURLConnection与HttpClient]()
28-
- [volley-retrofit-okhttp之我们该如何选择网路框架]()
29-
- [Volley源码分析]()
30-
- [Retrofit详解(上)]()
31-
- [Retrofit详解(下)]()
15+
- [自定义View详解][1]
16+
- [Activity界面绘制过程详解][2]
17+
- [Activity启动过程][3]
18+
- [Android Touch事件分发详解][4]
19+
- [AsyncTask详解][5]
20+
- [butterknife源码详解][6]
21+
- [InstantRun详解][7]
22+
- [ListView源码分析][8]
23+
- [VideoView源码分析][9]
24+
- [View绘制过程详解][10]
25+
- [网络部分][11]
26+
- [HttpURLConnection详解][12]
27+
- [HttpURLConnection与HttpClient][13]
28+
- [volley-retrofit-okhttp之我们该如何选择网路框架][14]
29+
- [Volley源码分析][15]
30+
- [Retrofit详解(上)][16]
31+
- [Retrofit详解(下)][17]
3232

3333
- 音视频开发
3434
- [搭建nginx+rtmp服务器]()
@@ -203,6 +203,120 @@ Android学习笔记
203203
- [XmlPullParser]()
204204

205205

206+
[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/%E8%87%AA%E5%AE%9A%E4%B9%89View%E8%AF%A6%E8%A7%A3.md "自定义View详解"
207+
[2]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Activity%E7%95%8C%E9%9D%A2%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "Activity界面绘制过程详解"
208+
[3]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Activity%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B.md "Activity启动过程"
209+
[4]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md "Android Touch事件分发详解"
210+
[5]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/AsyncTask%E8%AF%A6%E8%A7%A3.md "AsyncTask详解"
211+
[6]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md "butterknife源码详解"
212+
[7]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解"
213+
[8]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/ListView源码分析.md "ListView源码分析"
214+
[9]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/VideoView%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "VideoView源码分析"
215+
[10]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "View绘制过程详解"
216+
[11]: https://github.com/CharonChui/AndroidNote/tree/master/SourceAnalysis/Netowork "网络部分"
217+
[12]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/HttpURLConnection%E8%AF%A6%E8%A7%A3.md "HttpURLConnection详解"
218+
[13]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/HttpURLConnection%E4%B8%8EHttpClient.md "HttpURLConnection与HttpClient"
219+
[14]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md "volley-retrofit-okhttp之我们该如何选择网路框架"
220+
[15]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析"
221+
[16]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8A).md "Retrofit详解(上)"
222+
[17]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8B).md "Retrofit详解(下)"
223+
[5]: x ""
224+
[5]: x ""
225+
[5]: x ""
226+
[5]: x ""
227+
[5]: x ""
228+
[5]: x ""
229+
[5]: x ""
230+
[5]: x ""
231+
[5]: x ""
232+
[5]: x ""
233+
[5]: x ""
234+
[5]: x ""
235+
[5]: x ""
236+
[5]: x ""
237+
[5]: x ""
238+
[5]: x ""
239+
[5]: x ""
240+
[5]: x ""
241+
[5]: x ""
242+
[5]: x ""
243+
[5]: x ""
244+
[5]: x ""
245+
[5]: x ""
246+
[5]: x ""
247+
[5]: x ""
248+
[5]: x ""
249+
[5]: x ""
250+
[5]: x ""
251+
[5]: x ""
252+
[5]: x ""
253+
[5]: x ""
254+
[5]: x ""
255+
[5]: x ""
256+
[5]: x ""
257+
[5]: x ""
258+
[5]: x ""
259+
[5]: x ""
260+
[5]: x ""
261+
[5]: x ""
262+
[5]: x ""
263+
[5]: x ""
264+
[5]: x ""
265+
[5]: x ""
266+
[5]: x ""
267+
[5]: x ""
268+
[5]: x ""
269+
[5]: x ""
270+
[5]: x ""
271+
[5]: x ""
272+
[5]: x ""
273+
[5]: x ""
274+
[5]: x ""
275+
[5]: x ""
276+
[5]: x ""
277+
[5]: x ""
278+
[5]: x ""
279+
[5]: x ""
280+
[5]: x ""
281+
[5]: x ""
282+
[5]: x ""
283+
[5]: x ""
284+
[5]: x ""
285+
[5]: x ""
286+
[5]: x ""
287+
[5]: x ""
288+
[5]: x ""
289+
[5]: x ""
290+
[5]: x ""
291+
[5]: x ""
292+
[5]: x ""
293+
[5]: x ""
294+
[5]: x ""
295+
[5]: x ""
296+
[5]: x ""
297+
[5]: x ""
298+
[5]: x ""
299+
[5]: x ""
300+
[5]: x ""
301+
[5]: x ""
302+
[5]: x ""
303+
[5]: x ""
304+
[5]: x ""
305+
[5]: x ""
306+
[5]: x ""
307+
[5]: x ""
308+
[5]: x ""
309+
[5]: x ""
310+
[5]: x ""
311+
[5]: x ""
312+
[5]: x ""
313+
[5]: x ""
314+
[5]: x ""
315+
[5]: x ""
316+
[5]: x ""
317+
[5]: x ""
318+
319+
206320
Developed By
207321
===
208322

SourceAnalysis/Activity界面绘制过程详解.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public Window getWindow() {
3131
return mWindow;
3232
}
3333
```
34-
接下来,我们看一下`PhoneWindow.setContentView()`方法。(简单的理解是`PhoneWindow``DectorView(`FrameLayout的子类)`进行包装,将它作为窗口的根`View`)
34+
接下来,我们看一下`PhoneWindow.setContentView()`方法。(简单的理解是`PhoneWindow``DectorView`(`FrameLayout`的子类)进行包装,将它作为窗口的根`View`)
3535
```java
3636
@Override
3737
public void setContentView(int layoutResID) {
@@ -64,8 +64,8 @@ public void setContentView(int layoutResID) {
6464
}
6565
```
6666

67-
上面简单的说明了installDecor()的作用,这里我们在源码中仔细说明一下, 通过这个源码
68-
我们知道设置主题要在setContentView之前去调用,如用代码设置`requestWindowFeature()`设置主题时要在`setContentView()`之前设置才有用.
67+
上面简单的说明了`installDecor()`的作用,这里我们在源码中仔细说明一下, 通过这个源码
68+
我们知道设置主题要在`setContentView()`之前去调用,如用代码设置`requestWindowFeature()`设置主题时要在`setContentView()`之前设置才有用.
6969
```java
7070
private void installDecor() {
7171
if (mDecor == null) {

SourceAnalysis/InstantRun详解.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
InstantRun详解
22
===
33

4-
之前在写[AndroidStudio提高Build速度](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md)这篇文章的时候写到,想要快,就用`Instant Run`。最近有朋友发来邮件讨论它的原理,最近项目不忙,索性就来系统的学习下。
4+
之前在写[AndroidStudio提高Build速度](https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md)这篇文章的时候写到,想要快,就用`Instant Run`。最近有朋友发来邮件讨论它的原理,最近项目不忙,索性就来系统的学习下。
55

66

77
`Android Studio`2.0开始引入了`Instant Run`,它主要是在`Run``Debug`的时候可以去减少更新应用的时间。虽然第一次`Build`的时候可能会消耗稍长的时间来完成,但是`Instant Run`可以把更新内容推送到设备上,而无需重新`build`一个新的`apk`,这样就会很快速的让我们观察到改变。

SourceAnalysis/Netowork/Retrofit详解(上).md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
Retrofit详解(上)
33
===
44

5-
之前写过一篇文章[volley-retrofit-okhttp之我们该如何选择网路框架](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md)来分析`Volley``Retrofit`之间的区别。之前一直用`Volley`比较多。但是随着`Rx`系列的走红,目前越来越多的项目使用`RxJava+Retrofit`这一黄金组合。而且`Retrofit`使用注解的方式比较方便以及`2.x`版本的提示让`Retrofit`更加完善,今天简单的来学习记录下。
5+
之前写过一篇文章[volley-retrofit-okhttp之我们该如何选择网路框架](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md)来分析`Volley``Retrofit`之间的区别。之前一直用`Volley`比较多。但是随着`Rx`系列的走红,目前越来越多的项目使用`RxJava+Retrofit`这一黄金组合。而且`Retrofit`使用注解的方式比较方便以及`2.x`版本的提示让`Retrofit`更加完善,今天简单的来学习记录下。
66

7-
- 有关更多`Volley`的知识请查看[Volley源码分析](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md)
8-
- 有关注解更多的知识请查看[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)
9-
- 有关更多[RxJava]的介绍请查看[Rx详解系列](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%8A).md)
7+
- 有关更多`Volley`的知识请查看[Volley源码分析](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md)
8+
- 有关注解更多的知识请查看[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)
9+
- 有关更多[RxJava]的介绍请查看[Rx详解系列](https://github.com/CharonChui/AndroidNote/tree/master/RxJavaPart)
1010

1111
简介
1212
---

SourceAnalysis/butterknife源码详解.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ butterknife源码详解
33

44
作为`Android`开发者,大家肯定都知道大名鼎鼎的[butterknife](https://github.com/JakeWharton/butterknife)。它大大的提高了开发效率,虽然在很早之前就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码。最近在学习运行时注解,决定今天来系统的分析下`butterknife`的实现原理。
55

6-
如果你之前不了解`Annotation`,那强烈建议你先看[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md).
6+
如果你之前不了解`Annotation`,那强烈建议你先看[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md).
77

88
废多看图:
99

1010
![image](https://github.com/CharonChui/Pictures/blob/master/butterknife_sample.png?raw=true)
1111

1212
从图中可以很直观的看出它的`module`结构,以及使用示例代码。
1313

14-
它的目录和我们在[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)这篇文章中介绍的一样,大体也是分为三个部分:
14+
它的目录和我们在[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)这篇文章中介绍的一样,大体也是分为三个部分:
1515

1616
- app : butterknife
1717
- api : butterknife-annotations

SourceAnalysis/自定义View详解.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
虽然之前也分析过[View绘制过程](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md),但是如果让我自己集成`ViewGroup`然后自己重新`onMeasure,onLayout,onDraw`方法自定义`View`我还是会头疼。今天索性来系统的学习下。
55

6-
###onMeasure
6+
### `onMeasure`
77

88
```java
99
/**
@@ -116,7 +116,7 @@ public static int getSize(int measureSpec) {
116116
```
117117

118118

119-
###onLayout
119+
### `onLayout`
120120

121121
为了能合理的去绘制定义`View`,你需要制定它的大小。复杂的自定义`View`通常需要根据屏幕的样式和大小来进行复杂的布局计算。你不应该假设你的屏幕上的`View`的大小。即使只有一个应用使用你的自定义`View`,也需要处理不同的屏幕尺寸、屏幕密度和横屏以及竖屏下的多种比率等。
122122

@@ -141,25 +141,25 @@ float diameter = Math.min(ww, hh);
141141
```
142142

143143

144-
###onDraw
144+
### `onDraw`
145145

146146
自定义`View`最重要的就是展现样式。
147147

148-
#####重写`onDraw()`方法
148+
##### 重写`onDraw()`方法
149149

150150
绘制自定义`View`最重要的步骤就是重写`onDraw()`方法。`onDraw()`方法的参数是`Canvas`对象。可以用它来绘制自身。`Canvas`类定义了绘制文字、线、位图和很多其他图形的方法。你可以在`onDraw()`方法中使用这些方法来指定`UI`.
151151

152152
在使用任何绘制方法之前,你都必须要创建一个`Paint`对象。
153153

154-
#####创建绘制的对象
154+
##### 创建绘制的对象
155155

156156
`android.graphics`框架将绘制分为两步:
157157

158158
- 绘制什么,由`Canvas`处理。
159159
- 怎么去绘制,由`Paint`处理。
160160

161161

162-
#####`Canvas`
162+
##### `Canvas`
163163

164164
> The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels,
165165
a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap),
@@ -188,7 +188,7 @@ and a paint (to describe the colors and styles for the drawing).
188188
canvas.drawPath(path, paint);
189189
```
190190

191-
#####`Paint`
191+
##### `Paint`
192192

193193
- `setARGB(int a, int r, int g, int b)` 设置`Paint`对象颜色,参数一为`alpha`透明值
194194
- `setAlpha(int a)` 设置`alpha`不透明度,范围为0~255

0 commit comments

Comments
 (0)