Android简单介绍事件分发

Android简单介绍事件分发与事件处理

在这里插入图片描述

android触摸事件分发与处理

android的分发机制:由父控件判断是否拦截,如果不拦截事件,则继续分发到子控件,然后一直分发下去。

处理:与分发相反,由子控件先处理事件,如果子控件不处理,则交给父控件处理,一直向上传递,直到那个控件处理了触摸事件

相关方法:

Boolean dispatchTouchEvent(MotionEvent ev)接收到触摸事件时,是否分发事件到下面的view,返回true分发触摸事件;不分发返回false,下面的view就拿不到事件

Boolean onInterceptTouchEvent(MotionEvent ev)接收到触摸事件时,是否拦截事件,返回true拦截,则调用onTouchEvent方法处理事件;返回false,继续向子控件传

Boolean onTouchEvent(View v,MotionEvent event)是否响应事件,返回true,响应;返回false不响应

这个方法是基于回调的

Boolean onTouch(View v,MotionEvent event)处理响应事件,当view调用了setOnTouchListener方法设置了触摸监听器,则事件响应的时候先调用onTouch方法
返回true,响应即事件被v消费onTouchEvent方法不执行;返回false时,不响应事件没有被消费而终止了,并调用onTouchEvent方法
这个方法是基于监听onTouchListener 的

void requestDisallowInterceptTouchEvent(Boolean disallowIntercept)请求父控件是否不拦截事件,返回true,不允许父控件的onInterceptTouchEvent调用;false 允许

事件是否被拦截,要看在当前父级阶段能否根据event事件找到消费此事件的控件,如果找到则返回true继续向下分发,否则处理

// An highlighted block
package com.example.day07;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initview();
    }

    private void initview(){
        findViewById(R.id.btn_ll).setOnClickListener(this);
        findViewById(R.id.btn_vp).setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.btn_ll:
                Intent intent=new Intent(MainActivity.this,LinlayoutActivity.class);
                startActivity(intent);
                break;
            case R.id.btn_vp:
                Intent intent1=new Intent(MainActivity.this,ViewPagerActivity.class);
                startActivity(intent1);
                break;
                default:
                    break;
        }
    }
}

package com.example.day07;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import com.example.day07.View.MyViewButton;

public class LinlayoutActivity extends AppCompatActivity implements View.OnClickListener ,View.OnTouchListener{
    MyViewButton button;

    private final  String TAG=LinlayoutActivity.class.getName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linlayout_ac_tivity);

        initview();
    }

    private void initview() {
        findViewById(R.id.btn_MyviewButton).setOnClickListener(this);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        Log.d(TAG, "dispatchTouchEvent:----------");
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "ACTION_DOWN------ ");
                break;

            case MotionEvent.ACTION_UP:
                Log.d(TAG, "ACTION_UP------ ");
                break;
            default:
                break;
        }

        return super.onTouchEvent(event);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.btn_MyviewButton:
                Log.d("LinlayoutActivity", "onClick: ");
                break;
            default:
                break;
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (v.getId()) {
            case R.id.btn_MyviewButton:
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Log.d("LinlayoutActivity", "onTouch: ");
                        break;
                }
                break;
            default:
                break;
        }
        return false;
    }
}

package com.example.day07.View;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

@SuppressLint("AppCompatCustomView")
public class MyViewButton extends Button implements View.OnClickListener, View.OnTouchListener {

    private final  String TAG =MyViewButton.class.getName();
    public MyViewButton(Context context) {
        super(context);
    }

    public MyViewButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyViewButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TAG, "dispatchTouchEvent------ ");
        return super.dispatchTouchEvent(event);
    }




    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "ACTION_DOWN------ ");
                break;

            case MotionEvent.ACTION_UP:
                Log.d(TAG, "ACTION_UP------ ");
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }

    //onclick 所有方法执行后执行 最后执行
    @Override
    public void onClick(View v) {
        Log.d(TAG, "onClick------ ");
    }


    //如果 on TouchListener 被实现 且返回为true 那么会拦截掉所有ontouchevent方法 其中也包括 Onclicklinstener
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouch----ACTION_DOWN------ ");
                break;

            case MotionEvent.ACTION_UP:
                Log.d(TAG, "onTouch-----ACTION_UP------ ");
                break;
            default:
                break;
        }
        return false;
    }
}




在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值