密码输入框bug,LinearLayout拦截下滑事件
2016-04-06 15:16
232 查看
1.密码输入框bug(输入法输入切换监听问题,editext焦点问题):
2.LinearLayout拦截下滑操作:
3.Android事件分发拦截处理机制:
1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回
True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;
返回false,则把事件交给子控件的onInterceptTouchEvent()
2、onTouchEvent()用于处理事件,返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控
件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回true,则向上传递给父控件(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代
码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没
有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)
其它理解:
onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截.
down事件首先会传递到onInterceptTouchEvent()方法
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
其它理解2:
onInterceptTouchEvent()与onTouchEvent()的机制:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
相关问题解决方案链接:
参考链接1
参考链接2
DigitsKeyListener keyListener = new DigitsKeyListener() { @Override public int getInputType() { return InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT; } @Override protected char[] getAcceptedChars() { return mAcceptedPwdChars.toCharArray(); } }; //设置可接收字符 edtPwd.setKeyListener(keyListener); /** * 用户点击查看密码 */ private void doSeePwd() { pwd = edtPwd.getText().toString().trim(); if (isShowPwd) { hidePwdImg.setBackgroundResource(R.drawable.sso_showpwd); edtPwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { hidePwdImg.setBackgroundResource(R.drawable.sso_hidepwd); edtPwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } isShowPwd = !isShowPwd; //不改变焦点位置 edtPwd.setSelection(pwd.length()); edtPwd.setKeyListener(keyListener); }
2.LinearLayout拦截下滑操作:
public class LinearLayoutforTouch extends LinearLayout { private int count = 0; private long lastTouchTime = 0; private float startY; public LinearLayoutforTouch(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public LinearLayoutforTouch(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onFilterTouchEventForSecurity(MotionEvent event) { return super.onFilterTouchEventForSecurity(event); } //此处用来处理在linearlayout中的下滑时拦截相关操作 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: startY = ev.getRawY(); if (System.currentTimeMillis() - lastTouchTime > 500) { count = 0; } break; case MotionEvent.ACTION_UP: lastTouchTime = System.currentTimeMillis(); if (ev.getRawY() - startY > 30) { count++; } if (count > 4) { count = 0; Intent intent = new Intent(this.getContext(), ConfigSettingActivity.class); this.getContext().startActivity(intent); } break; } return super.onInterceptTouchEvent(ev); } }
3.Android事件分发拦截处理机制:
1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回
True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;
返回false,则把事件交给子控件的onInterceptTouchEvent()
2、onTouchEvent()用于处理事件,返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控
件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回true,则向上传递给父控件(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代
码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没
有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)
其它理解:
onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截.
down事件首先会传递到onInterceptTouchEvent()方法
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
其它理解2:
onInterceptTouchEvent()与onTouchEvent()的机制:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
相关问题解决方案链接:
参考链接1
参考链接2
相关文章推荐
- vue.js
- php用GD库给图片添加水印
- mysql锁-悲观锁
- strlen与sizeof区别
- Lucene的中文分词器IKAnalyzer
- 一名2012计算机应届毕业生的求职之路
- 通过终端命令行编译java文件
- 数据库事务管理原理
- UIsearchBar怎么将canal改为取消,怎么点击取消按钮将键盘和searchbar复原
- apt-get update error解决方法
- android 各国语言对应的缩写
- 线程任务超时结束方法
- 新建Activity后R文件消失,无法编译,错误大全
- Android Fragment 你应该知道的一切
- 8.驱动与硬件通信
- [DevExpress]设置列的时间格式
- Nginx安装与使用
- JAVA AOP--源自技术
- Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
- ibatis 中 $与#的区别