博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 事件处理,事件模型详解
阅读量:6518 次
发布时间:2019-06-24

本文共 3206 字,大约阅读时间需要 10 分钟。

hot3.png

一.按键事件处理,事件传递模型

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    //按键按下的时候;    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        Log.e("---------","onKeyDown");        return super.onKeyDown(keyCode, event);    }    //按键松开    @Override    public boolean onKeyUp(int keyCode, KeyEvent event) {        Log.e("---------","onKeyUp");        return super.onKeyUp(keyCode, event);    }    //按键长按的时候;    @Override    public boolean onKeyLongPress(int keyCode, KeyEvent event) {        Log.e("---------","onKeyLongPress");        return super.onKeyLongPress(keyCode, event);    }}

如果按下返回键的时候:

        onKeyDown--->onKeyUp

源码分析:

Activity: onKeyDown() 

    event.startTracking();//计数

Activity:对于我们回退键的处理: down:计数   up:判断是否计数过  如果计数过 那么就退出

return false: 就是应用层没有处理了事件,继续传递.-->相应给驱动层

return true:就表示事件,就意味着不向系统响应

010349_ilsR_2704624.png

长按键 是如何发生的呢

     event.startTracking();//计数

    return true//拦截事件

home键是一个敏感键,是交给系统层处理的,应用层是不可以处理的,

二.触摸事件处理,事件传递模型

触摸事件的类型

    :down

    :up

    :move

    :pointer_down 多指事件

public class MainActivity extends Activity implements OnTouchListener {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		TextView tv = (TextView) findViewById(R.id.tv);		tv.setOnTouchListener(this);				LinearLayout ll = (LinearLayout) findViewById(R.id.ll);				MyTouchEvent event = new MyTouchEvent();		ll.setOnTouchListener(event);	}		private class MyTouchEvent implements OnTouchListener{		@Override		public boolean onTouch(View v, MotionEvent event) {			switch (event.getAction()) {			case MotionEvent.ACTION_DOWN:				Log.i("tz","layout down");				break;			case MotionEvent.ACTION_MOVE:				Log.i("tz","layout move");				break;			case MotionEvent.ACTION_UP:				Log.i("tz","layout up");				break;			}			return true;		}			}		/**	 * 触摸事件:down    move   up   pointer_down多指   	 */	@Override	public boolean onTouch(View v, MotionEvent event) {		int count = event.getPointerCount(); //获得触摸手指的数量		switch (event.getAction()) {		case MotionEvent.ACTION_DOWN:						Log.i("tz","down");			//拿到按下的坐标			float x = event.getX();			float y = event.getY();						x = event.getRawX();//以屏幕为坐标系  包括了标题栏和状态栏的坐标			y = event.getRawY();			Log.i("tz", "RawX:"+x);			Log.i("tz","RawY:"+y);			break;		case MotionEvent.ACTION_POINTER_DOWN://多跟手指按下			Log.i("tz","pointer_down");			//获取第2根手指的坐标??获取第3根手指的坐标??  			x = event.getX(count-1);//下标从0开始			y = event.getY(count-1);			break;					case MotionEvent.ACTION_MOVE:			Log.i("tz","move");			x = event.getX();//以我们点击的view为坐标			y = event.getY();						x = event.getRawX();//以屏幕为坐标系			y = event.getRawY();			//其他手指移动的坐标			x = event.getX(count-1);			y = event.getY(count-1);			Log.i("tz", "move RawX:"+x);			Log.i("tz","move RawX:"+y);			break;		case MotionEvent.ACTION_UP:			Log.i("tz","up");			break;		}		return true;//表示将事件拦截(消费)		//return false;//表示事件交由上级容器处理 move  up 就捕获不到了		//return super.onTouchEvent(event);//把事件交给Activity处理  由Activity类决定是return true 还是false;	}}

094456_uR3E_2704624.png

如果在down的时候,农民没有完成任务,以后市长秘书就不会叫农民处理move和up事件了

转载于:https://my.oschina.net/yanglingui/blog/775743

你可能感兴趣的文章
添加一条信息到列表,如果重复就替换,
查看>>
C#基础第五天
查看>>
uva 12325 枚举暴力 b
查看>>
多线程问题(JVM重排序)
查看>>
POJ 3268 Silver Cow Party
查看>>
EMLS项目推进思考
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
2018-2019-1 20165302 实验五 通讯协议设计
查看>>
Golang 知识点总结
查看>>
JAVA 8 特性
查看>>
算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
查看>>
WebService之Axis2快速入门(7): Spring与axis整合发布为WebServic
查看>>
Uliweb查看模板调用关系
查看>>
C#与PHP通信压缩
查看>>
关于 Linux
查看>>
ios开发之导航控制器的原理
查看>>
《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
查看>>
Linux系统_Centos7下安装Nginx
查看>>
《PHP和MySQL Web 开发》 第12章 MySQL高级管理
查看>>
数据库设计 Step by Step (6) —— 提取业务规则
查看>>