【Android的事件触发】

Android学习路线(第二部分)


基于监听的事件处理机制

基于回调事件的处理机制

view的事件触发

Android 存储概念

File 内部存储

一、基于监听的事件处理机制

监听三要素:事件源、事件、事件监听器

实现监听事件的方法:

  1. 通过内部类实现

    class OnClick implements View.OnlickListener{
    
    }
    
  2. 通过匿名内部类实现

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_button);
            mBtn3 = (Button) findViewById(R.id.btn_3);
            mBtn3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(ButtonActivity.this,"btn3被点击了",Toast.LENGTH_SHORT).show();
                }
            });
    
  3. 通过事件源所在类实现

    // 3.通过事件源所在的内部类实现 当前Activity实现implements View.OnClickListener
            mBtnEvent.setOnClickListener(EventActivity.this);
    
    @Override
        public void onClick(View v) {
            Log.d("事件源所在的内部类", "click");
            ToastUtil.showMessage(EventActivity.this, "事件源所在的内部类实现");;
        }        
    
  4. 通过外部类实现

  5. 布局文件中onClick属性(针对点击事件)(这种方法设置的监听器比较优先,如果同一个按钮有好几个监听事件,那么只会执行后设置的监听器)

二、基于回调事件的处理机制

回调事件的实现:我们在自己的控件中继承button类,然后重写了一个ontouchevent方法,当我们点下去按钮的时候,执行回调这个方法。

回调事件处理的传播,系统执行回调操作时先从监听事件检查是否

到控件本身(比如一个自己的button)

再到Activity逐层向外传播。假如在某一层的return true了,那么回调事件停止传播。

mBtnMy = findViewById(R.id.btn_my);

        // 先执行监听器里的方法 在执行回调
        mBtnMy.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            //getAction值的是“按下”这个事件
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.d("Listener", "OnTouchListener");
                        break;
                }

                return false;
            }
        });
    // 后执行Activity里的方法 在执行回调    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.d("EventActivity", "onTouchEvent");
                break;
        }
        return false;
    }

三、View 事件分发流程

1. dispatchTouchEvent方法(入口方法)

1.1、事件分发的核心方法,事件分发的逻辑都是在这个方法中实现;
1.2、View、以及 ViewGroup、其他的实现类都重写了该方法;
1.3、如果成功处理则返回true,处理失败则返回false,表示事件没有被处理。
1.4、在view的相关类中,该方法的主要作用是消费触摸事件。
1.5、在viewGroup相关类中,该方法的主要作用是把事件分发到该viewGroup所拥有的子view,如果子view没有处理则自己处理;

1.6、点击事件时,触发了两次 dispatchTouchEvent方法,一次action_down和一次action_up

2. onTouchEvent
  1. 方法返回true表示消费事件,返回false表示不消费事件;
  2. viewGroup分发事件时,如果没有一个子view消费事件,那么会调用viewGroup自身的onTouchEvent方法来处理事件。
  3. View的dispatchTouchEvent方法(入口方法)中,先调用onTouchListener判断是否消费;如果onTouchListener没有消费事件,才会调用onTouchEvent来处理事件;
3. onTouch 和onTouchEvent 的区别
  • onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
  • 假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
  • 内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。

四、Handler消息处理

功能一:延时处理,postDelayed

private Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);

        mHandler = new Handler();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(HandlerActivity.this, ButtonActivity.class);
                startActivity(intent);
            }
        }, 3000);

功能二:线程间通信,handleMessage,Thread

 private Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        //重写handleMessage方法接收线程的消息并做一些处理
        mHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1:
                        ToastUtil.showMessage(HandlerActivity.this, "线程通信成功");;
                        break;
                }
            }
        };
		//新建一个新的线程thread,发送消息
        new Thread() {
            @Override
            public void run() {
                super.run();

                Message message = new Message();
                message.what = 1;
                mHandler.sendMessage(message);
            }
        }.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值