Android Touch事件传递机制_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3174 | 回复: 0   主题: Android Touch事件传递机制        下一篇 
java_along
注册用户
等级:上尉
经验:771
发帖:36
精华:0
注册:2014-2-17
状态:离线
发送短消息息给java_along 加好友    发送短消息息给java_along 发消息
发表于: IP:您无权察看 2014-8-10 20:21:50 | [全部帖] [楼主帖] 楼主

当我们在布局的时候,很容易在ViewGroup下嵌套一个View或者ViewGroup,这时候就很容易产生事件的冲突,这里以Touch事件为例,为大家演示下,Android里事件的传递机制。

这里创建3个类,Example04ActivityExampleView01,ExampleView02分别继承Activity,LinearLayout,ListView,正好是3种不同的。

Example04Activity的布局非常简单,就是LinearLayout套个ListView,这里主要讲解事件的传递机制,其他就不过多介绍。

3个类都实现onTouchEvent 方法。

Example04Activity:
public class Example04Activity extends Activity{
      private ExampleView01 preContent=null;
      private ExampleView02 lvContent=null;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity06);
            initView();
            initContent();
      }
      public void initView(){
            preContent=(ExampleView01)findViewById(R.id.scview1);
            lvContent=(ExampleView02)findViewById(R.id.list1);
      }
      public void initContent(){
      }
      @Override
      public boolean onTouchEvent(MotionEvent event) {
            Log.v("sss", "activity touch");
            return super.onTouchEvent(event);
      }
}
ExampleView01:
public class ExampleView01 extends LinearLayout{
      public ExampleView01(Context context, AttributeSet attrs) {
            super(context, attrs);
      }
      @Override
      public boolean onTouchEvent(MotionEvent event) {
            Log.v("sss", "ViewGroup touch");
            return super.onTouchEvent(event);
      }
      @Override
      public boolean onInterceptTouchEvent(MotionEvent ev) {
            Log.v("sss", "ViewGroup Intercept ");
            return super.onInterceptTouchEvent(ev);
      }
}
ExapleView02:
public class ExampleView02 extends ListView{
      public ExampleView02(Context context, AttributeSet attrs) {
            super(context, attrs);
      }
      public ExampleView02(Context context) {
            super(context);
      }
      @Override
      public boolean onTouchEvent(MotionEvent event) {
            Log.v("sss", "View touch");
            return super.onTouchEvent(event);
      }
}


上面仅仅是重写了onTouchEvent onInterceptTouchEvent等方法,但是都未进行修改,也就是说,现在在logcat打印的结果,就是android,事件传递机制。

仅仅在界面一点击

显示:

北京联动北方科技有限公司

也就是说,先通过最外层的ViewGrouponInterceptTouchEvent然后,再通过子ViewonTouchEvent

这是为什么呢?

首先简单介绍下,android的事件传递机制,然后再由显示结果来说明。

首先touch事件触发,被最外层的ViewGroup接收到,调用onInterceptTouchEvent方法,

若返回true,则说明这个事件被ViewGroup拦截了,不再向下也就是ViewGroup下的ViewViewGroup传递,而是直接调用ViewGrouponTouchEvent

我们把onInterceptTouchEvent 的返回值直接改为true(代码这个事件拦截了)

代码:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
      Log.v("sss", "ViewGroup Intercept ");
      return true;
}


其他不变。

点击,显示:

北京联动北方科技有限公司

先调用onInterceptTouchEvent 在调用ViewGrouponTouchEvent,不在调用了子ViewonTouchEvent了,因为被拦截了。

现在我们总结下onInterceptTouchEvent onTouchEvent的作用。

onInterceptTouchEvent 是用于ViewGroup,从最外层的ViewGroup开始,一层一层调用(如果返回的都为false),一直往下抛,直到下面没有ViewGroup了,那么就调用最后一个ViewonTouchEvent(如果返回的都为false),然后一层一层的往上抛,直到抛到最外面的activity。如果在某一个onInterceptTouchEvent 返回了true,那么就说明这个事件被拦截了,

就不在往下抛,如果onTouchEvent返回true,那么就代表,这个事件已经被这个View处理,就不再往上抛。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论