导航:首页 > 操作系统 > android事件分发

android事件分发

发布时间:2022-01-14 00:29:35

android 事件分发方法怎么走

当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。上述例子中的消息下发顺序是这样的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。在上述例子中如果⑤的dispatchTouchEvent返回结果为true,那么⑥-⑦-③-④将都接收不到本次Touch事件。来个简单版的代码加深理解:

/**
* ViewGroup
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他处理,在此不管
View[] views=getChildView();
for(int i=0;i<views.length;i++){
//判断下Touch到屏幕上的点在该子View上面
if(...){
if(views[i].dispatchTouchEvent(ev))
return true;
}
}
...//其他处理,在此不管
}
/**
* View
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他处理,在此不管
return false;
}

Ⅱ android事件分发中 怎么确定点击自己想点击的界面

android监听事件添加动作的三种方式:
第一种也是最开始就接触的方式,通常在activity组件的oncreate事件中直接定义,直接动作。这种方式每个控件都定义一次,通常不方便.
Button btn = (Button) findViewById(R.id.myButton);

btn .setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

//do something

}

});
第二种通常是在activity组件实现其接口,这样可以多外控件共享一个接口,这样相对方便
public class TestMedia extends Activity implements View.OnClickListener{

Button btn1 = (Button) findViewById(R.id.myButton1);
Button btn2 = (Button) findViewById(R.id.myButton2);

btn1 .setOnClickListener();
btn2 .setOnClickListener();

}

public void onClick(View v) {

switch (v.getId()) {

case R.id. myButton1:

//do something

break;

case R.id. myButton2:

//do something

break;

}

第三种类似第二种,这样的好处在于如果需要实现多个监听接口,这样更清晰

public class TestMedia extends Activity {

Button btn1 = (Button) findViewById(R.id.myButton1);
Button btn2 = (Button) findViewById(R.id.myButton2);

btn1 .setOnClickListener(new ClickEvent());

btn2 .setOnClickListener(new ClickEvent());

}
class ClickEvent implements View.OnClickListener

public void onClick(View v) {

switch (v.getId()) {

case R.id. myButton1:

//do something

break;

case R.id. myButton2:

//do something

break;

}

Ⅲ 面试怎么回到android 事件分发

自己去看一下事件分发和View的绘制呗,这些都是基础。可以去看《Android开发艺术探索》从源码角度分析,或者郭霖、鸿洋大神的csdn博客。

Ⅳ android 事件分发中 为什么down事件不消费 后续事件也得不到消费

事件都是从dispatchTouchEvent开始的, 如果down事件不消费, 那么在dispatchTouchEvent源码中的mFirstTouchTarget就是空的. mFirstTouchTarget这个变量是记录消费down事件的. 没有消费down 那么mFirstTouchTarget就是空. 其他事件进入dispatchTouchEvent后 会先判断mFirstTouchTarget为空, 就判定事件被拦截了. 就不会继续事件分发了. 也不会去执行onTouchEvent方法了.
至于Android这样设计的道理? 因为如果down事件不接受, 就默认其他事件也不要了. 这也是为了提高性能, 毕竟move是一大串的. 如果不在down中这样设计. 每个move都去判断, 势必会影响触摸响应性能.

Ⅳ android 事件分发用在哪

decorView是window中的最顶层view,如果在不干预子控件的touch或click事件的前提下捕捉touch事件,建议重写antivity中dispatchTouchEvent(event)方法(保留其中的super.dispatchTouchEvent),然后对event进行处理。 建议网上搜索“android触摸事件的分发机制”,先进行具体的了解。

Ⅵ android事件分发机制怎么写

ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayout、RelativeLayout等都是继承自ViewGroup的。
但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。

Ⅶ android中事件分发ontouch跟ontouchevent的区别

可以看这里——
http://blog.csdn.net/huiguixian/article/details/22193977

Ⅷ android事件分发机制 什么意思

android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

(5) OnTouchListener优先于onTouchEvent()对事件进行消费。

上面的消费即表示相应函数返回值为true。

Ⅸ android怎么主动分发事件

Android中,所有的操作类型事件都由如下三个部分作为基础:


按下(ACTION_DOWN)

移动(ACTION_MOVE)

抬起(ACTION_UP)

这三部分都寄生于onTouch事件中,由MontionEvent类中定义的三个常量进行区分。


Android中与Touch事件相关的方法为:

removeTapCallback();
removeLongPressCallback();
break;

case MotionEvent.ACTION_MOVE:
final int x = (int) event.getX();
final int y = (int) event.getY();

// Be lenient about moving outside of buttons
if (!pointInView(x, y, mTouchSlop)) {
// Outside button
removeTapCallback();
if ((mPrivateFlags & PFLAG_PRESSED) != 0) {
// Remove any future long press/tap checks
removeLongPressCallback();

setPressed(false);
}
}
break;
}
return true;
}

return false;
}

Ⅹ 自定义控件 事件分发机制 anr问题 art和dalvik的区别 android关于oom

Android基础知识
Android内存泄漏总结
Handler内存泄漏分析及解决
Handler、Looper、Message、MessageQueue基础流程分析
Android性能优化
ListView详解
RecyclerView和ListView的异同
AsyncTask源码分析
插件化技术
自定义控件
事件分发机制
ANR问题
Art和Dalvik的区别
Android关于OOM的解决方案
Fragment
Activity&Fragment
SurfaceView
Android几种进程
APP启动过程

阅读全文

与android事件分发相关的资料

热点内容
精品php源码 浏览:956
自己编写云服务器抢红包 浏览:199
java解压缩文件加密 浏览:884
dlink打印服务器默认地址 浏览:349
php休眠函数 浏览:369
金蝶如何打开服务器 浏览:762
e4a手游辅助源码 浏览:774
什么app可以实时直播 浏览:103
苹果13的app闪退什么原因 浏览:772
尾盘选股源码公式 浏览:447
php日期运算 浏览:928
天龙八部长歌服务器什么时候开的 浏览:197
鬼泣4模型在那个文件夹 浏览:226
单片机的串行口 浏览:55
phpjson转化为数组 浏览:265
pdf导入excel 浏览:426
苹果xsmax信任app在哪里设置 浏览:51
自动外链php源码 浏览:243
我的世界新手奖励箱命令 浏览:143
linux更新vim 浏览:996