aboutView 开发记录
本文最后更新于:2019年11月10日 晚上
工程地址 https://github.com/RustFisher/aboutView
虚拟键盘 - VKeyboard
VKeyboard - Virtual keyboard
定义按键类
定义Key类,代表按键。属性有ascii码,是否使用TextView,是否使用ImageView,按键类别(功能键,普通键)等。
1 |
|
UI控制器实现
实现一个虚拟键盘。采用给LinearLayout添加子view的方式。
做一个UI控制器(Widget),需要传入一个LinearLayout作为根view。根据设置的键盘宽度动态调整每个按键的大小。
这种方式不太适合组件化。
创建组件的方式
将「按键」装配到键盘上。采用适配器模式,将View添加到ViewGroup中。
VKey代表按键,VKeyboardBody代表键盘,VRow代表键盘上的一行,VKeyboardListener是监听器。
VKeyboard继承Framelayout,创建适配器VKeyboard.Adapter,将「按键」装配到键盘上。
VKey - 按键
代表按键。装载着keyCode,背景资源等等属性值。
VKeyboardBody - 键盘
代表键盘的显示样式。比如UI的padding值和margin值。
VRow - 行
一行按键。实际上是一个LinearLayout的属性值合集。
VKeyboardListener - 监听器
事件监听器。例如点击事件等等。
VKeyboard - 键盘UI类
实际上继承了FrameLayout。通过VKeyboard.Adapter获取到键盘的按键配置信息。
创建对应的子View,并添加到FrameLayout中。
VKeyboard构造函数
构造函数中有AttributeSet
。attrs里面有id,layout_width,layout_height等等信息。
想在View的构造器中获取到定义中xml中的属性,需要从AttributeSet中获取。可能会获取到-1或-2,分别代表MATCH_PARENT和WRAP_CONTENT。
因此要判断获取到的数字是否大于0,如果大于0则表明是一个指定的宽度,直接记下这个宽度值。
获取到xml中指定的宽度后,再计算子view的宽度。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public VKeyboard(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
int[] attrsArray = new int[]{
android.R.attr.id, // 0
android.R.attr.background, // 1
android.R.attr.layout_width, // 2
android.R.attr.layout_height // 3
};
final TypedArray a = context.obtainStyledAttributes(attrs, attrsArray);
int layoutWidth = a.getLayoutDimension(2, ViewGroup.LayoutParams.MATCH_PARENT);
if (layoutWidth > 0) {
keyboardWidthPx = layoutWidth;
}
a.recycle();
initKeyboardUI(context);
}
参考 https://stackoverflow.com/questions/8037101/how-to-get-attributeset-properties1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public MapView(Context context, AttributeSet attrs) {
// ...
int[] attrsArray = new int[] {
android.R.attr.id, // 0
android.R.attr.background, // 1
android.R.attr.layout_width, // 2
android.R.attr.layout_height // 3
};
TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
int id = ta.getResourceId(0 /* index of attribute in attrsArray */, View.NO_ID);
Drawable background = ta.getDrawable(1);
int layout_width = ta. getLayoutDimension(2, ViewGroup.LayoutParams.MATCH_PARENT);
int layout_height = ta. getLayoutDimension(3, ViewGroup.LayoutParams.MATCH_PARENT);
ta.recycle();
}
给Keyboard添加按键(key)。在activity onCreate的时候,Keyboard已经执行了构造函数。
之后我们通过setAdapter的方式给它添加key。