0%

1. 实现圆角

  1. 使用ClipPath先绘制圆角的path,然后再裁剪

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    protected void onDraw(Canvas canvas) {
    clipPath.reset();
    rectF.set(0, 0, getWidth(), getHeight());
    clipPath.addRoundRect(rectF, radius, radius, Path.Direction.CW);
    // int save = canvas.save();
    canvas.clipPath(clipPath);
    canvas.drawRect(rectF, paint);
    super.onDraw(canvas);
    // canvas.restoreToCount(save);
    }
  2. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    paint设置Xfermode取交集。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    Bitmap target = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    Canvas canvas = new Canvas(target);
    RectF rect = new RectF(0, 0, width, height);
    // 设置圆形
    // canvas.drawCircle(width / 2, height / 2, Math.min(width, height) / 2, paint);
    // 设置圆角
    canvas.drawRoundRect(rect, mRadius, mRadius, paint);
    // 核心代码取两个图片的交集部分
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(source, 0, 0, paint);
    return target;
阅读全文 »

  1. 代码混淆
  2. 资源压缩、资源混淆
    图片资源本身变小,resources.arsc 文件变小
  3. 图片资源使用svg或者webp格式
  4. 语言包优化,去除无用的语言包
  5. Dex分包优化
    跨Dex的调用会增加很多冗余标记信息,使用工具,尽量将有调用关系的类和方法分配到同一个 Dex 中,可以减小Dex文件的体积。

Behavior 的测量和布局

Behavior有 onMeasureChild , onLayoutChild 。 Coordinatorlayout 在执行 onMeasureChild 和 onLayoutChild 之前会先判断 behavior 是否有重写对应的方法并返回true。
如果返回true,则表示 behavior 接管了这个child的测量或布局,跳过该child。

阅读全文 »

参数

1
2
3
4
5
6
7
8
9
10
public ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 超时时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 阻塞队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
) {
}
阅读全文 »

背景:

当安卓工程的minSdk<24时,项目中的svg资源如果使用到了有兼容问题的属性,同时module的 vectorDrawables.useSupportLibrary 开关为false,会自动在编译打包过程中生成png图片来解决兼容性问题。

1
2
3
4
5
6
android {
defaultConfig {
vectorDrawables.useSupportLibrary = false
vectorDrawables.generatedDensities = ["xxhdpi"] // 设置只在drawable-xxhdpi目录下的生成png图片,如果不设置,最终的apk会在每一个drawable目录下有一个png
}
}

阅读全文 »

OSI五层网络模型

  1. 物理层
    利用传输介质为数据提供物理连接,传输比特流。 wifi 、光纤 等
  2. 数据链路层
    在两个相邻结点之间传送数据,传输数据帧
  3. 网络层
    提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径。 IP协议
  4. 传输层
    向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,负责向两个主机中进程之间的通信提供服务。 TCP , UDP
  5. 应用层
    为用户提供的服务。 http,https 协议
阅读全文 »

suspend 到底做了什么

一个简单的协程调用

1
2
3
4
5
6
7
8
9
10
suspend fun task() {
delay(100) // 延时来模拟耗时任务
}

suspend fun runTask(): String {
val time = System.currentTimeMillis()
val result = task()
println(result)
return "getTask case ${time - System.currentTimeMillis()}"
}

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public interface RetrofitService {
@GET("query")
Observable<PostInfo> getPostInfoRx(@Query("type") String type, @Query("postid") String postid);
}

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.kuaidi100.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 支持RxJava
.build();

RetrofitService service = retrofit.create(XxxInterface.class);
Call<PostInfo> call = service.getPostInfo("yuantong", "11111111111");
call.enqueue(new Callback<PostInfo>() {
@Override
public void onResponse(Call<PostInfo> call, Response<PostInfo> response) {
Log.i("http返回:", response.body().toString() + "");
}

@Override
public void onFailure(Call<PostInfo> call, Throwable t) {

}
});
阅读全文 »