文档章节

Android 事件处理,事件模型详解

y
 yanglingui
发布于 2016/10/26 01:56
字数 629
阅读 29
收藏 0

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

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:就表示事件,就意味着不向系统响应

长按键 是如何发生的呢

     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;
	}

}

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

http://blog.csdn.net/chenqiang920502/article/details/50378837

© 著作权归作者所有

上一篇: git命令
y
粉丝 1
博文 135
码字总数 18801
作品 0
海淀
私信 提问
android基础知识03——事件处理01:主要事件及其处理方式

这一期主要集中学习了android的事件处理相关内容。主要参考内容为: Android 事件处理 Android核心技术与实例详解—事件处理 android的窗口机制分析------事件处理 (该文属于android源码分析...

迷途d书童
2012/03/23
726
0
Android RxJava: 这是一份全面的 操作符 使用汇总 (含详细实例讲解)

前言 ,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 如此受欢迎的原...

Carson_Ho
2018/05/31
0
0
EventBus 3.0使用详解

01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之...

天王盖地虎626
05/09
45
0
C语言自学完备手册(21)——递归

版权声明: https://blog.csdn.net/lfdfhl/article/details/82897146 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–o...

谷哥的小弟
2018/09/29
0
0
C语言自学完备手册(19)——冒泡排序

版权声明: https://blog.csdn.net/lfdfhl/article/details/82862688 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–o...

谷哥的小弟
2018/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
23分钟前
3
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部