Android软键盘相关详解

Android控制软键盘的交互主要是通过Activity的android:windowSoftInputMode属性来设置的,它一共有10个值,可以用“|”来设置多个值分别是:

stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan,adjustNothing。

从名字上看可以分为两类:分别是state和adjust。

15:30:54.jpg

水平竖直容器曝光实现

最近做广告相关的曝光,分别针对listView里的item和HorizontalScrollView里的每个view,曝光的主要定义是由不可见到可见时算一次曝光,快速滑动的时候也算。

ListView曝光实现

不放在getView()里来实现主要是因为我们的下拉刷新组件会不断的设置自己的layoutParams,导致整个View树进行measure、layout、draw,getView会多次调用,不能实现准确曝光,所以需要自己实现一个。因为快速滚动也算,所以只能放在了listView的OnScrollListener的onScroll()里做了,可以用onScroll()里的firstVisiableItemvisiableItemCount参数来实现,我们每次可以获取屏幕显示的开始和结束item的位置,然后针对位置坐相关的处理。比如:如果一开始曝光了0-5,用户滑动,滚到1-6,这个时候我们可以知道6是新曝光的。但是要考虑到onScroll里也算上了header和footer,所以要针对这两个情况做一个映射。

AndroidManifests文件合并

背景

目前有这样的一个情景:在开发过程中我们需要在整个应用启动的前面选择合适的环境,因此我们会将整个应用的启动界面替换成HostChooseActivity,将WelcomeActivity相应的启动intent-filter注释掉。而在上线时又需要将HostChooseActivity在Manifest文件里注释掉,将WelcomeActivity的intent-filter打开。本地还好,但是在jenkins上就很麻烦,比如当目前的代码不包含可选环境时,QA需要一个可选环境的包来进行测试,这时就得本地重新更改代码然后push、merge、Jenkins重新打包,流程很复杂。所以希望能够根据不同的build type来选择合适的Manifest,最后在官方文档里找到了解决方案,在这之前先简单介绍下预备知识。

Build Variants

我们知道在Android Studio中有一个Build Variants,它是根据我们在gradle文件里的buildTypes和productFlavors生成的,通过这个我们可以对我们的项目创建不同的版本。例如:可以针对不同的渠道替换一些资源文件,或者更改min Api levels。下面介绍下buildTypes和productFlavors。

配置Build Types

当你创建一个Module时,AS会自动的创建debug和release这两种build types,其中debug并不会在gradle文件里显示,但其实是存在的,我们点击AS的Build Variants时会看见,平时开发时默认的就是这个模式,而且它的debuggable是为true的。下面是一个例子:

shell学习

第一个Shell脚本

1
2
#!/bin/sh
echo "Hello World !"

“#!/bin/sh”用于告诉系统该用什么解释器执行,主要有两种:bash和sh。echo是用于打印的命令

运行Shell的两种方法

作为可执行程序
1
2
chmod +x ./test.sh #使脚本具有可执行权限
./test.sh #执行脚本
通过解释器直接执行
1
/bin/sh test.sh

当使用这种形式时就不需要在前面指定需要哪种解释器。

gradle学习

Groovy基础

常见语法

Groovy可以和Java一样声明和使用一个类,定义和使用一个方法。同时也提供了一个属性的默认的get和set方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Person {
private String name;
public Person(String name) {
this.name = name;
}
String getName() {
return name;
}
}
def person = new Person("xiuweikang");
print person.name
String getPersonName(Person person) {
return person.name
}
println getPersonName(person)
// 默认get、set
class Person {
String name;
}
def person = new Person()
person.setName("xiuweikang")
print person.getName()

View基础相关

坐标系

在Android打算的撒打算的oid中的坐标系是以屏幕左上角为原点,向右为X轴正方向,向下为Y轴正方向,角度如下:

Android动画详解

概述

动画主要分为三种:View动画、帧动画、属性动画,分别介绍:

View动画

View动画的作用对象是View,主要包含平移动画缩放动画旋转动画透明度动画。分别对应TranslateAnimationScaleAnimationRotateAnimationAlphaAnimation。可以通过XML来实现也可以通过代码,需要注意一点的是View动画最大的缺点是不能交互,View自身的属性并不会发生变化。例如对一个放大的View进行点击,点击区域其实还是原本View的点击区域。

View的measure、layout、draw过程

概述

View的整个过程是从ViewRoot开始的,实现类是ViewRootImpl类,在这个类中通过setView()方法添加DecorView,之后以DecorView为rootView。在ViewRootImpl类中通过performTraversals()方法,经过measure、layout、draw三个过程最终将View绘制出来。