LJ的Blog

学海无涯苦做舟

0%

最近在撸东西,调试的时候用Android原生的Log感觉很不爽,打的Log给我一种东倒西歪,凌乱的感觉。于是自己看了一下Blankj大神的Android-Utils库,看了一下他实现的LogUtils,借鉴了一下,简单的封装了一个在Kotlin中可以正确使用的LogUtil。不过话说讲道理,有扩展,Util这种东西还是可以尽量不用的,但是我有点不清楚Log这玩意该扩展给谁呢,Any?所以还是写了一个LogUtil……

打印效果

最后直接放一下打印Log的样子,这里只放出i级别的日志:

效果图

处理了日志比较长的时候的情况,点击log中蓝色的字可以跳转到代码中的相应位置,各位如果感兴趣是怎么实现的,可以直接看我代码(当然了,我也是看别人的才知道怎么去实现,哈哈)。

阅读全文 »

最近在撸新的东西玩,自定义View我也算是半个老司机了。首先在onMeasure中处理了wrap_content的情况,然后我惊奇的在log中发现,我测量出来的结果竟然是1080?这是什么操作?后来调试发现测量宽度时进入了精确模式,没跑了肯定是match_parent。我是怎么把View添加到父View的呢?代码如下:

1
ll_container!!.addView(v)

这是一个LinearLayout,不说多的点进addView看一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void addView(View child) {
addView(child, -1);
}
<!--more-->

public void addView(View child, int index) {
if (child == null) {
throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup");
}
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams();
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
阅读全文 »

写在前面

本文需要一些CMakeJNI的基础知识,对于CMake的使用推荐Android官网的NDK入门。CMake是Android Studio 2.2以上新增的支持原生编程的工具,CMake是一个跨平台的编译工具,可以用简单的语句描述所有平台的编译过程。恩,暂时先记一下吧,本文现处于自嗨状态,不适合作为各位将之作为NDK的学习资料。

环境配置

在创建项目时勾选include c++,在项目创建完毕,文件目录如下:

目录结构
可以看到,可以看到app目录下有一个CMakeLists.txt,我在这个txt里加了一些注释

阅读全文 »

以前尝试Android中调用C/C++代码,都是自己写一个带native方法的类,然后自己通过命令生成一个头文件,然后再用一个C/C++文件include这个头文件。就一直都很疑惑为毛现在Android Studio点了include c++之后没有生成头文件的操作。最近动手尝试了一波,把原来项目里的native-lib.cpp删掉,将CMake.txt中的native-lib.cpp全部换成了自己的hello.cpp。最后运行的时候却报错了,很奇怪,为毛呢?自己生成了一个头文件放到cpp目录底下,又不报错了……

当时真是感觉日了狗了,为毛他不需要头文件,偏偏我要?后来网上搜了一下,看到这么一句话:

在Java中调用JNI接口时,出现异常,察看日志,发现有如下错误:
WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
检查了几遍代码,Cpp中确实定义了这个接口,而且仔细对照了Java的包名、类名,确实没有错误,那为什么会出现这种问题呢。后来突然想到,JNI接口 都是以C的方式定义的,现在使用C++实现,函数定义前是否需要加上extern “C”呢?

看完就感觉不对头了,果然我自己的cpp中没有extern “C”这句话,而生成的头文件都是有的。我重新建了一个include c++的项目,比对了一下,果然也是有这句话的。于是加了这句话,可以不生成头文件了。

阅读全文 »

写在前面

本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了。文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题。我也是看了一下Android的文档才整理了这篇文章,想看原文的戳这。不得不说,文档还是详细啊~

本文主要会涉及以下内容:

  • 相机的使用流程
  • 拍照及拍照期间的聚焦
  • 保存图片

先放一下最终效果图吧,做的比较简单,各位不用担心:

阅读全文 »

写在前面

动画啊,相机啊,RxJava2啊,还有很多其他的东西,平时都有在看,当时看的时候感觉自己似乎已经明白了,但是过了一时间到需要用的时候还是难免要去翻一下别人的博客。翻别人的不如我记录一下然后翻自己的好了,好记性不如烂简书~

我开始学Android的时候就没有碰到过需要适配4.0以下的情况了,现在手机也普遍在5.0以上了,所以当初学的时候我就直接看的RecyclerView和属性动画,话不多说,直接进入属性动画的学习(API的使用)。对了,首先放上郭霖大神关于属性动画的介绍, Android属性动画完全解析(上),初识属性动画的基本用法,上中下三篇写的都非常不错。只不过属性动画的应用场景非常多,三篇文章不可能提到所有场景,还需要我们根据场景去应用。本篇所有例子都是用kotlin写的,不过都比较简单,而且我也会解释下大概的意思,没看过kotlin的读者也完全可以看懂。

基础使用

在放代码之前先放一些个前置:

阅读全文 »

上篇介绍了如何从dex中加载类,这篇尝试了一下从apk中加载资源,用的同样是DexClassLoader。同样还是那个kotlin项目,简单的尝试从另一个apk的drawable中加载一张图片,个人感觉还是挺麻烦的。

先准备另一个项目

新建另一个项目,这个项目只在drawable下放了一张名为ssm的图片。然后生成一个debug的apk包。将这个apk拷贝到本项目的assets下(只是为了方便,也可以从远程获取这个apk)。
debug apk

我们的目标就是通过这个debug的apk来加载这张图片,这里我将这个apk的名字改为了plugin1.apk。

简单的代码

阅读全文 »

最近想研究一波插件化,在简书上看到这个感觉还不错,就按照这个顺序看下去了。不过得小记一下,省的以后我还得去上面提到的文里去找链接。我这里记得就是自己操作的一遍流程。。其实我也是根据他的文来操作的,属于HelloWorld级别吧。

操作

本来还想介绍一下概念,想了想,算了,不误人子弟了。感兴趣自己搜。

1.新建工程

没什么好说的,打开Android Studio新建一个工程都会吧。我这里新建了一个名为fordex的项目,包名为com.xiasuhuei321.firstpro。

2.新建一个接口和一个类

阅读全文 »

写在前面

Kotlin现在已经是Android官方的一级开发语言了,以前就有大佬给我安利,最近刚好看open cv的c++和ndk看的头昏脑涨,反正最近也用不到,只是出于兴趣,不如换个脑子看看最近势头比较盛的Kotlin好了。在这里感谢一下猫哥对我的耐心指导,让我对Kotlin的认识更进了一步。

委托

委托有委托类和委托属性。

委托类

我在看文档的时候就感觉跟Java里的某个操作非常像……于是非常恶趣味的将代码写成了如下模式:

阅读全文 »

最近有一个需求,要先把文件从U盘拷贝到sd卡。而这个文件的路径则和一个生成的数据有关系,也就是说之前我保存的路径是U盘的路径,最后生成的时候则需要实际在sd卡的路径。这很简单,把路径改了不就成了?

没那么简单,万一sd卡内存不够呢?不够你复制,这个时候你前面已经复制了,路径也改了,数据已经被“污染”了,只能从头再配置一遍。这显然是不合理的做法,所以需要我们拷贝一份原有的数据。但是在Java中默认是引用拷贝,并不是在堆里面给你另外分配一块内存,给你一个新的对象,而是拷贝一个引用给你。这并没有什么卵用,操作的是堆内的同一个对象,依旧逃不过数据被污染的命。所以需要我们自己实现深度拷贝。

我首先能想到的方案有两个:

  • 遍历这个类的所有属性,将每一个属性都拷贝一份
  • 先将对象序列化写入文件,再从文件中读取对象

第一种方式在类比较简单的时候还是比较实用的,我们为每一个属性申请内存并将值设置好。但是如果这个类内部的属性很复杂或者有比较复杂的父类,这个时候处理起来就麻烦很多了。第二种方式简单是简单,本来也打算就用这种方式来做。后来同事提醒我还有第三种方式:利用Json框架。

阅读全文 »