android事件分发
① 面试怎么回到android 事件分发
自己去看一下事件分发和View的绘制呗,这些都是基础。可以去看《Android开发艺术探索》从源码角度分析,或者郭霖、鸿洋大神的csdn博客。
② android中事件分发ontouch跟ontouchevent的区别
可以看这里——
http://blog.csdn.net/huiguixian/article/details/22193977
③ 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 事件分发方法怎么走
当一个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中,所有的操作类型事件都由如下三个部分作为基础:
按下(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;
}
⑦ Android事件分发机制是怎么判断手势类型,并决定分发给哪个view的
可以参考如下内容:
dispatchTouchEvent -> onTouch -> onTouchEvent
等上述的up事件分发完结后,再调用onClick
看起来一目了然,事实上,我只是用了默认的调用,在TextView的dispatchTouchEvent和onTouchEvent都是让它返回super.xxx。而且在onTouch监听里返回的是false。
所以,实际的情况更多,基于此,为了更清晰地熟悉事件分发机制,我们只能通过看源码了。
源码分析
我目前查看的源码是API 22环境下的。这部分关于View的事件分发的源码和之前的有很大的区别,但是,万变不如其中,有些根本的逻辑流程一般是不会改变的。
我们直接看View的代码,因为控件都继承自View。
⑧ 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监听事件添加动作的三种方式:
第一种也是最开始就接触的方式,通常在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 事件分发中 为什么down事件不消费 后续事件也得不到消费
事件都是从dispatchTouchEvent开始的, 如果down事件不消费, 那么在dispatchTouchEvent源码中的mFirstTouchTarget就是空的. mFirstTouchTarget这个变量是记录消费down事件的. 没有消费down 那么mFirstTouchTarget就是空. 其他事件进入dispatchTouchEvent后 会先判断mFirstTouchTarget为空, 就判定事件被拦截了. 就不会继续事件分发了. 也不会去执行onTouchEvent方法了.
至于Android这样设计的道理? 因为如果down事件不接受, 就默认其他事件也不要了. 这也是为了提高性能, 毕竟move是一大串的. 如果不在down中这样设计. 每个move都去判断, 势必会影响触摸响应性能.