最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。 在写自定义键盘的时
最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。
在写自定义键盘的时候,用到了国内网上的一些代码,出处是
向先人致敬!
然后发现down下来的代码用到我的项目时,出现了各种问题:
1.首先,是一打开应用,就会出现弹出的是系统的输入法键盘,而是不自定义键盘,这个问题是由于
android:focusable="true"
android:focusableInTouchMode="true"
那么在
et.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
int inputback = et.getInputType();
et.setInputType(InputType.TYPE_NULL);
AdvantageKeyboard kb = new AdvantageKeyboard(act,ctx,et);
kb.showKeyboard();
et.setInputType(inputback);
v.performClick();
return false;
}
});
2.点击时,键盘弹出的提示框里面没有字体。例如这样
这是由于显示的字体时白色,而背景也是白色导致的。后来各种百度,有人说是因为
在我们自定义的
android:id="@+id/keyboard_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="@color/black"
android:keyBackground="@drawable/btn_keyboard_key"
android:keyPreviewLayout="@layout/key_preview_layout"
android:keyTextColor="@color/white"
android:visibility="gone" />
然后在layout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:textColor="@android:color/white"
android:gravity="center"
android:background="#ff8888ff"/>
其中
3.加入键盘的触摸响应,并记录点击的相关信息(力度,接触面积,,落点坐标等)。
我们可以在自定义键盘中的构造函数中对keyboardView加入触摸监听器,例如这样写构造方法。
public AdvantageKeyboard(Activity act, Context ctx, EditText edit) {
this.act = act;
this.ctx = ctx;
this.ed = edit;
kb_letter = new Keyboard(this.ctx, R.xml.qwerty);
kb_number = new Keyboard(this.ctx, R.xml.symbols);
keyboardView = (KeyboardView) this.act.findViewById(R.id.keyboard_view);
keyboardView.setKeyboard(kb_number);
is_nun = true;
keyboardView.setEnabled(true);
keyboardView.setPreviewEnabled(true);
keyboardView.setOnKeyboardActionListener(action_listener);
keyboardView.setOnTouchListener(touch_listener);//加入触摸监听器
}
然后
private OnTouchListener touch_listener = new OnTouchListener(){
@Override
public boolean onTouch(View v, android.view.MotionEvent event) {
float pressure, size, rx, ry, x, y, interval;
long time, down_time;
int action = event.getAction();
switch (action) {
case (MotionEvent.ACTION_DOWN):
pressure = event.getPressure();
size = event.getSize();
time = event.getEventTime();
down_time = event.getDownTime();
x = event.getX();
y = event.getY();
rx = event.getRawX();
ry = event.getRawY();
interval = (float) 0.0;
if(is_first_press){
interval = down_time - last_down_time;
}
is_first_press = true;
last_down_time = down_time;
Log.i("!!!!!!!!!","pressure:"+String.valueOf(pressure)+"\n"
+"size:"+String.valueOf(size)+"\n"
+"time:"+String.valueOf(time)+"\n"
+"downtime:"+String.valueOf(down_time)+"\n"
+"x:"+String.valueOf(x)+" y:"+String.valueOf(y)+"\n"
+"rx:"+String.valueOf(rx)+" ry:"+String.valueOf(ry)+"\n"
+"interval:"+String.valueOf(interval)+"\n");
break;
case (MotionEvent.ACTION_UP):
v.performClick();
break;
case (MotionEvent.ACTION_MOVE):
break;
}
return false;
}
};
然后搞定了...
源码下载: