aboutView 开发记录

本文最后更新于:2019年11月10日 晚上

工程地址 https://github.com/RustFisher/aboutView

虚拟键盘 - VKeyboard

VKeyboard - Virtual keyboard

定义按键类

定义Key类,代表按键。属性有ascii码,是否使用TextView,是否使用ImageView,按键类别(功能键,普通键)等。

1
2
3
4
5
6
public static class Key {
private int keyType; // 按键种类 是普通按键或者是功能按键
private int uiType = UI_TEXT_VIEW; // UI使用的View类型
private String keyText; // 显示的文字
// ....
}

UI控制器实现

实现一个虚拟键盘。采用给LinearLayout添加子view的方式。
做一个UI控制器(Widget),需要传入一个LinearLayout作为根view。根据设置的键盘宽度动态调整每个按键的大小。

这种方式不太适合组件化。

创建组件的方式

将「按键」装配到键盘上。采用适配器模式,将View添加到ViewGroup中。

VKey代表按键,VKeyboardBody代表键盘,VRow代表键盘上的一行,VKeyboardListener是监听器。
VKeyboard继承Framelayout,创建适配器VKeyboard.Adapter,将「按键」装配到键盘上。

vk

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
16
public 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-properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public 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。


aboutView 开发记录
https://blog.rustfisher.com/2015/12/25/Dev-note/dev-note-aboutView/
作者
Rust Fisher
发布于
2015年12月25日
许可协议