• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android的事件触发

武飞扬头像
喜之郎cc果冻
帮助1

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();
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfagea
系列文章
更多 icon
同类精品
更多 icon
继续加载