View的事件分发(附流程图)
来源:互联网 发布:尔雅网络选修课登陆 编辑:程序博客网 时间:2024/05/22 20:17
View的事件分发:
1、 触摸事件的传递流程是从dispatchTouchEvent开始的,如果不进行人为干预(super.dispatchTouchEvent()),则事件会按照嵌套层次从外层依次向内层传递,到达最内层View时,就由它的TouchEvent方法处理。该方法如果能消费此事件,则返回true,如果处理不了,则返回false,这时事件会重新向外层传递,并由外层view的touchevetnt方法进行处理,以此类推。如果进行人为干预,无论返回true或false,都不再向下传递。
2、 如果事件在向内层传递过程中进行人为干预,处理函数返回true,则会导致事件提前被消费掉,内层view将不会收到此事件
3、 View控件的事件触发顺序是先执行onTouch方法,在最后才执行onClick方法。如果OnTouch返回true,则事件不会继续传递,最后也不会调用onclick方法,如果onTouch返回false,则事件继续传递。
package com.lantier.xxb_student.firstapp;import android.content.Context;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.TextView;/** * Created by xxb_student on 2017/6/7. */public class MyTextView extends TextView { private static final String TAG = "MyTextView"; public MyTextView(Context context) { super(context); } public MyTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG, "---->>onTouchEvent ACTION_DOWN: " ); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "---->>onTouchEvent ACTION_MOVE: " ); break; case MotionEvent.ACTION_UP: Log.e(TAG, "---->>onTouchEvent ACTION_UP: " ); break; } return true; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG, "---->>dispatchTouchEvent ACTION_DOWN: " ); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "---->>dispatchTouchEvent ACTION_MOVE: " ); break; case MotionEvent.ACTION_UP: Log.e(TAG, "---->>dispatchTouchEvent ACTION_UP: " ); break; } return super.dispatchTouchEvent(event); }}
package com.lantier.xxb_student.firstapp;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.MotionEvent;import android.view.View;public class TouchActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener{ private static final String TAG = "TouchActivity"; private MyTextView tvTest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_touch); initView(); } private void initView() { tvTest = (MyTextView) findViewById(R.id.tv_test); tvTest.setOnClickListener(this); tvTest.setOnTouchListener(this); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG, "---->>onTouchEvent ACTION_DOWN: " ); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "---->>onTouchEvent ACTION_MOVE: " ); break; case MotionEvent.ACTION_UP: Log.e(TAG, "---->>onTouchEvent ACTION_UP: " ); break; } return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG, "---->>dispatchTouchEvent ACTION_DOWN: " ); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "---->>dispatchTouchEvent ACTION_MOVE: " ); break; case MotionEvent.ACTION_UP: Log.e(TAG, "---->>dispatchTouchEvent ACTION_UP: " ); break; } return super.dispatchTouchEvent(event); } @Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()){ case R.id.tv_test: switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG, "---->>tv_test onTouch ACTION_DOWN: " ); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "---->>tv_test onTouch ACTION_MOVE: " ); break; case MotionEvent.ACTION_UP: Log.e(TAG, "---->>tv_test onTouch ACTION_UP: " ); break; } break; } return false; } @Override public void onClick(View v) { switch (v.getId()){ case R.id.tv_test: Log.e(TAG, "---->>onClick:tv_test " ); break; } }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.lantier.xxb_student.firstapp.TouchActivity"><com.lantier.xxb_student.firstapp.MyTextView android:id="@+id/tv_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定义TextView"/></LinearLayout>
阅读全文
0 0
- View的事件分发(附流程图)
- 笔记:事件分发机制(一):View的事件分发
- View的事件分发
- View的事件分发
- view的分发事件
- View的事件分发
- View的事件分发
- View的事件分发
- View的事件分发
- View 事件的分发机制 (一)
- View的事件分发机制(1)
- View 的事件分发机制(一)
- (十 )View的事件分发机制
- Android View的事件分发机制(一):View
- View的事件分发机制(View篇)
- 关于View的事件分发
- Android View的事件分发
- View 的事件分发机制
- Jackson 框架,轻易转换JSON
- Codeforces Round #415 (Div. 1) 题解
- 超实数*R真的存在吗?
- Python与NumPy的比较
- 提升软件研发水平,高级软件需求分析师开课
- View的事件分发(附流程图)
- PowerDesigned15连接MySQL出现"Could not initialize JavaVM"时的详细解决步骤(图文)
- 何去何从,飞进寒冬的无人机
- 又不在状态?来看看程序员保持动力的9种方法
- HDU 2063:过山车
- 解决SurfaceView各种疑难杂症
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八
- Oracle中正则表达式使用小记
- 计算广告学习笔记1.6 广告的基础知识-计算广告核心问题和挑战