当前位置:首页 » 安卓系统 » android事件分发

android事件分发

发布时间: 2022-01-24 23:22:57

① 面试怎么回到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都去判断, 势必会影响触摸响应性能.

热点内容
吃鸡配置太低怎么调高画质 发布:2024-11-15 19:58:19 浏览:734
王者怎么设置来电屏蔽安卓 发布:2024-11-15 19:56:08 浏览:449
服务器如何搭建多个ip 发布:2024-11-15 19:42:10 浏览:102
价钱低高配置的有哪些车 发布:2024-11-15 19:34:53 浏览:380
androidgps定位开发 发布:2024-11-15 19:34:52 浏览:334
如何扫码添加服务器地址 发布:2024-11-15 19:31:48 浏览:278
sql语句复制数据库 发布:2024-11-15 19:28:02 浏览:837
算法的薪资 发布:2024-11-15 19:15:22 浏览:322
ubuntu可以重新编译吗 发布:2024-11-15 19:09:10 浏览:649
access数据库表的创建 发布:2024-11-15 18:51:18 浏览:141