业务上需求 需要自定义一个数字键盘 需要乱序、悬浮、拖动
网上代码很多,我就记录一下自己遇到的坑
问题描述
- 如何实现
我在网上看了一些方法,有的是继承keyboardView,有的是用recyclerView 做的,我选择第二种;
我的实现比较简单,因为业务要求不多,只是一个数字键盘的demo,就是用一个recyclerView 做了一个4*4的键盘 0-9 然后凑几个字符 确定删除等。
乱序比较简单,在一个数组里面加入需要的字符,然后 新建两个数组 一个作为结果集,一个作为中间数组,之后Random 随机取放入结果集里面就行;取完从中间数组删除,这样就得到了乱序的数组;
如何在固定位置显示?
我的做法就是乱序完成后再加入需要固定的字符到固定的位置,网格布局加载就可以了;
GridLayoutManager layoutManager = new GridLayoutManager(context, 4, GridLayoutManager.VERTICAL, false) {
@Override
public boolean canScrollVertically() {
return false; //重写这个方法:因为在拖拽的时候会触发recyclerView 的滑动动画,就禁止了;
}
};
2.如何隐藏系统软键盘
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
//这个方法就可以
//但是有的人不行需要 使用windowsmanager.layoutparams.FLAG_ALT_FOCUSALE_IM,windowsmanager.layoutparams.FLAG_ALT_FOCUSALE_IM
//editText 一开始自动获取焦点,可以在布局里面设置
android:focusableInTouchMode="true"
3.如何拖动
使用windowManager中加入这个recyclerView 然后给recyclerView 设置触摸监听setOnTouchListener
这部分网上有很多 就不贴了;
我这里一开始没有成功 因为我在这个recyclerView 外面又包了一个View(走神的时候突然想到的原因),之后把这个View去掉就可以了;
还有就是另一种情况 拖拽的时候,刚一开始拉着有点不对劲,之后就可以随着手指拖动了;我这里是因为 windowmanager中addview 的时候 layoutparams.x,layoutparams.y 设置的太大了 ,在onTouch 里面的事件处理上就不正常,之后初始化正常屏幕尺寸中的layoutParams 就可以了