精华内容
下载资源
问答
  • android点击事件的四种方式第一种方式:创建内部类实现点击事件代码如下:package com.example.dail;import android.text.TextUtils;import android.app.Activity;import android.content.Intent;import android.net...

    android点击事件的四种方式

    第一种方式:创建内部类实现点击事件

    代码如下:

    package com.example.dail;

    import android.text.TextUtils;

    import android.app.Activity;

    import android.content.Intent;

    import android.net.Uri;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.Toast;

    public class MainActivity extends Activity implements OnClickListener {

    private EditText etext;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //获取text文本框内容

    etext = (EditText) MainActivity.this.findViewById(R.id.editText1);

    //根据id获取button按钮

    Button btn = (Button) this.findViewById(R.id.button_dail);

    //给按钮添加点击时事件(有四种给按钮添加点击事件方式:1、创建内部类实现点击事件)

    btn.setOnClickListener(new MyOnClickListener());

    }

    private class MyOnClickListener implements OnClickListener{

    @Override

    public void onClick(View arg0) {

    callphone();

    }

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    return true;

    }

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_settings) {

    return true;

    }

    return super.onOptionsItemSelected(item);

    }

    private void callphone() {

    String e_number = etext.getText().toString();

    if(TextUtils.isEmpty(e_number)) {

    Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show();

    return ;

    }

    Intent intent = new Intent();

    intent.setAction(Intent.ACTION_CALL);

    intent.setData(Uri.parse("tel:"+e_number));

    startActivity(intent);

    }

    }

    第二种方式:采用匿名内部类实现点击事件

    package com.example.dail;

    import android.text.TextUtils;

    import android.app.Activity;

    import android.content.Intent;

    import android.net.Uri;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.Toast;

    public class MainActivity extends Activity implements OnClickListener {

    private EditText etext;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //获取text文本框内容

    etext = (EditText) MainActivity.this.findViewById(R.id.editText1);

    //根据id获取button按钮

    Button btn = (Button) this.findViewById(R.id.button_dail);

    //给按钮添加点击时事件(有四种给按钮添加点击事件方式:1、创建内部类实现点击事件)

    // btn.setOnClickListener(new MyOnClickListener());

    //第二种方式:采用匿名内部类实现点击事件

    btn.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    callphone();

    }

    });

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    return true;

    }

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_settings) {

    return true;

    }

    return super.onOptionsItemSelected(item);

    }

    private void callphone() {

    String e_number = etext.getText().toString();

    if(TextUtils.isEmpty(e_number)) {

    Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show();

    return ;

    }

    Intent intent = new Intent();

    intent.setAction(Intent.ACTION_CALL);

    intent.setData(Uri.parse("tel:"+e_number));

    startActivity(intent);

    }

    }

    第三种方式:采用Activity实现OnClickListener接口方式来实现点击事件

    package com.example.dail;

    import android.text.TextUtils;

    import android.app.Activity;

    import android.content.Intent;

    import android.net.Uri;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.Toast;

    public class MainActivity extends Activity implements OnClickListener {

    private EditText etext;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //获取text文本框内容

    etext = (EditText) MainActivity.this.findViewById(R.id.editText1);

    //根据id获取button按钮

    Button btn = (Button) this.findViewById(R.id.button_dail);

    //给按钮添加点击时事件(有四种给按钮添加点击事件方式:1、创建内部类实现点击事件)

    // btn.setOnClickListener(new MyOnClickListener());

    //第二种方式:采用匿名内部类实现点击事件

    /*btn.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    callphone();

    }

    });*/

    //第三种方式:采用Activity实现OnClickListener接口方式来实现点击事件

    btn.setOnClickListener(this);

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    return true;

    }

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_settings) {

    return true;

    }

    return super.onOptionsItemSelected(item);

    }

    private void callphone() {

    String e_number = etext.getText().toString();

    if(TextUtils.isEmpty(e_number)) {

    Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show();

    return ;

    }

    Intent intent = new Intent();

    intent.setAction(Intent.ACTION_CALL);

    intent.setData(Uri.parse("tel:"+e_number));

    startActivity(intent);

    }

    @Override

    public void onClick(View arg0) {

    callphone();

    }

    }

    第四种方式:在布局中绑定一个点击方法

    第一步:在布局文件中添加android:onClicke属性

    android:onClick="dailButtonOnClick"

    android:id="@+id/button_dail"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentLeft="true"

    android:layout_below="@id/editText1"

    android:text="@string/dail"

    />

    第二步:在MainActivity中添加dailButtonOnClick方式

    private void dailButtonOnClick(){

    callphone();

    }

    Android中点击事件的四种写法详解

    Android中点击事件的四种写法 使用内部类实现点击事件 使用匿名内部类实现点击事件 让MainActivity实现View.OnClickListener接口 通过布局文件中控件的属性 第一种方法 ...

    [Android] 点击事件的四种写法

    点击事件的必备条件:实现OnClickListener接口,重写onclick(View v)方法 以拨号简单案例为例,如下图效果: 逻辑流程: 获取点击对象,获取数据 给对象设置监听类 实现OnCl ...

    Android笔记---点击事件的四种写法

    Android 点击事件的四种写法: 1. 以内部类的形式实现 OnClickListener 接口.定义点击事件 class MainActivity extents Activity{ // .. ...

    转--Android按钮单击事件的四种常用写法总结

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下     很多学习Android程序设计的人都会发现每个人对代码的 ...

    Android按钮单击事件的四种常用写法

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的写法都有 ...

    jQuery绑定事件的四种方式:bind、live、delegate、on

    1.jQuery操作DOM元素的绑定事件的四种方式 jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undele ...

    Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

    SWT组件添加事件的四种方式

    在我们CS日常开发过程中会经常去为组件添加事件,我们常用的为AWT与SWT.SWT的事件模型是和标准的AWT基本一样的.下面将按照事件的四种写法来实现它. 一.匿名内部类的写法 new MouseAd ...

    Java添加事件的四种方式

    Java添加事件的几种方式(转载了codebrother的文章,做了稍微的改动) /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author ...

    随机推荐

    [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

    设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

    简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...

    cocos2d 单点触控

    // // Single.hpp // dev // // Created by sun on 15/12/20. // // #ifndef Single_hpp #define Single_hp ...

    【OSGi】OSGi生命周期

    1 生命周期管理 对于非模块化应用,生命周期将应用作为一个整体来操作: 而对于模块化应用,则可以以细粒度的方式来管理应用的某一个独立部分. OSGi生命周期管理 OSGi生命周期层有两种不同的作用: ...

    一天搞定CSS: 浮动(float)及文档流--10

    浮动(float),一个我们即爱又恨的属性.爱,因为通过浮动,我们能很方便地布局: 恨,浮动之后遗留下来太多的问题需要解决,特别是IE6-7(以下无特殊说明均指 windows 平台的 IE浏览器). ...

    Python使用Tabula提取PDF表格数据

    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...

    Linux计划任务及压缩归档(week2_day1)--技术流ken

    计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...

    Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

    Spring-framework应用程序启动loadtime源码分析笔记(三)——@KafkaListener

    org.springframework.context.annotation.ConfigurationClassParser.getConfigurationClasses()读所有@Configu ...

    oracle 定义临时变量,并使用分支判断

    declare tempCount int; tempID ); begin select count(*) into tempCount from CUSTOMER_PROFILE where id ...

    展开全文
  • Android开发】三种方法实现Button点击事件响应

    千次阅读 多人点赞 2021-03-23 11:37:31
    三种实现方法Button事件 onclick事件的定义方法,分为三种, 分别为在xml中进行指定方法; 在Actitivy中new出一个OnClickListenner(); 实现OnClickListener接口三种方式。 1.在xml中实现方法的绑定 &...

    目录

    1、在xml中对onclick()进行指定方法

    2、NEW一个OnClickListenner()接口实现

    3、实现OnClickListener接口(Switch方法)


    Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!

    今天在这里和大家总结记录下在Android开发中关于button点击后事件响应的三种实现方法,这三种方法分别是:

    在xml中对onclick()进行指定方法;

    在Actitivy中new出一个OnClickListenner();

    实现OnClickListener接口

    接下来我们就对这三种方法进行一一讲解:

     

    1、在xml中对onclick()进行指定方法

    如下在xml文件下对button按钮的属性进行定义,对onclick属性指定方法名,如在这里方法名为“btn_1”

        <Button
            android:id="@+id/btn_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="btn_1"
            android:text="+" />

    之后在在MainActivity中实现为按钮绑定的btn_1()方法

       public void btn_1(View v)
        {
            //绑定的btn_1方法
            Toast.makeText(getApplicationContext(), "绑定方法1", Toast.LENGTH_LONG).show();
        }

     

    2、NEW一个OnClickListenner()接口实现

    方法一:

    在MainActivity.java文件下默认的onCreate()方法中对button控件进行关联,之后对关联的控件添加实现接口,在其中书写响应方法

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
          
            //第一步:关联控件
            Button btn_add= findViewById(R.id.btn_add);
    
            //第二步:接口实例化
            btn_add.setOnClickListener(new View.OnClickListener() {
              
                @Override
                public void onClick(View v) {
                    // 在其中写入响应方法              
                }
            });
        }

    方法二:

    同时关于使用OnClickListenner()接口实现事件响应还有另一种写法,就是将该OnClickListenner()接口单独实现,之后将该接口方法添加给控件,该写法可以使代码更加简洁直观。

    在这里要注意:将接口实现方法绑定到控件的代码应该写在最后面,确保是先实现了接口方法,才绑定的控件

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
          
            //第一步:关联控件
            Button bt_1= findViewById(R.id.btn_add);
    
            //第二步:实现接口
            View.OnClickListener add = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //响应事件
                }
            };
    
            //第三步:接口绑定控件
            bt1.setOnClickListener(add);
        }

     

    3、实现OnClickListener接口(Switch方法)

      首先类要引用OnClickListener接口,并实现方法

    public class MainActivity extends Activity implements View.OnClickListener{
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           
            //关联控件
            btn_add=(Button) findViewById(R.id.btn_add);
            btn_reduce=(Button) findViewById(R.id.btn_reduce);
            et=(EditText) findViewById(R.id.editText1);
    
            //第二步,使用接口
            btn_add.setOnClickListener(this);
            btn_reduce.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch(v.getId())
            {
            case R.id.btn_add:   
                //对应控件的响应时间        
                break;
            case R.id.btn_reduce:   
                //对应控件的响应时间         
                break;
            }       
        }
    }
    

    关于button按钮响应事件的三种方法就分享到这里,

    觉得不错记得点赞关注哟!

     

    展开全文
  • Android的触摸消息中,已经实现了三种监测,它们分别是1)pre-pressed:对应的语义是用户轻触(tap)了屏幕2)pressed:对应的语义是用户点击(press)了屏幕3)longpressed:对应的语义是用户长按(long press)了屏幕下图...

    在Android的触摸消息中,已经实现了三种监测,它们分别是

    1)pre-pressed:对应的语义是用户轻触(tap)了屏幕

    2)pressed:对应的语义是用户点击(press)了屏幕

    3)long pressed:对应的语义是用户长按(long press)了屏幕

    下图是触摸消息随时间变化的时间轴示意图:

    a02854d07ea44a9fc0be82e6d8de2271.png

    其中,t0和t1定义在ViewConfiguration类中,标识了tap和longpress的超时时间,定义如下:

    /**

    * Defines the duration in milliseconds we will wait to see if a touch event

    * is a tap or a scroll. If the user does not move within this interval, it is

    * considered to be a tap.

    */

    privatestaticfinalintTAP_TIMEOUT =115;// t0

    /**

    * Defines the duration in milliseconds before a press turns into

    * a long press

    */

    privatestaticfinalintLONG_PRESS_TIMEOUT =500;// t1代码中实现监测的地方在View类的OnTouchEvent函数中,当View监测到ACTION_DOWN事件时,首先发送一个延迟为t0的异步消息,代码如下:

    caseMotionEvent.ACTION_DOWN:

    if(mPendingCheckForTap ==null) {

    mPendingCheckForTap =newCheckForTap();

    }

    mPrivateFlags |= PREPRESSED;

    mHasPerformedLongPress =false;

    postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());

    break;如果在t0时间内用户释放了屏幕,即ACTION_UP事件在t0时间内发生,则本次触摸对应的是pre-pressed处理代码,语义是"用户轻触(TAP)了一下屏幕";如果用户在t1时间内释放了屏幕,那么本次操作是一个"press"操作;如果用户超过t1时间释放屏幕,则系统认为监测到了长按事件。其中处理"press"操作的代码在类CheckForTap类中,处理长按操作的代码在类CheckForLongPress类中。而处理pre-pressed的代码在ACTION_UP事件响应中,ACTION_UP事件响应中大部分代码用于处理触摸的状态变化,如下所示:

    caseMotionEvent.ACTION_UP:

    booleanprepressed = (mPrivateFlags & PREPRESSED) !=0;//获取prepressed状态

    if((mPrivateFlags & PRESSED) !=0|| prepressed) {//如果是pressed状态或者是prepressed状态,才进行处理

    // 如果当前view不具有焦点,则需要先获取焦点,因为我们当前处理触摸模式

    booleanfocusTaken =false;

    if(isFocusable() && isFocusableInTouchMode() && !isFocused()) {

    focusTaken = requestFocus();// 请求获得焦点

    }

    if(!mHasPerformedLongPress) {// 是否处理过长按操作了,如果是,则直接返回

    // 进入该代码段,说明这是一个tap操作,首先移除长按回调操作

    removeLongPressCallback();

    // Only perform take click actions if we were in the pressed state

    if(!focusTaken) {

    // Use a Runnable and post this rather than calling

    // performClick directly. This lets other visual state

    // of the view update before click actions start.

    if(mPerformClick ==null) {

    mPerformClick =newPerformClick();

    }

    if(!post(mPerformClick)) {

    performClick();// 执行点击的处理函数

    }

    }

    }

    if(mUnsetPressedState ==null) {

    mUnsetPressedState =newUnsetPressedState();

    }

    if(prepressed) {

    mPrivateFlags |= PRESSED;

    refreshDrawableState();

    // 发送重置触摸状态的异步延迟消息

    postDelayed(mUnsetPressedState,

    ViewConfiguration.getPressedStateDuration());

    }elseif(!post(mUnsetPressedState)) {

    // If the post failed, unpress right now

    mUnsetPressedState.run();

    }

    removeTapCallback();// 移除tap的回调操作

    }

    break;在上面的代码分析中,可以看出,整个监测过程涉及到两个Runnable对象和一个利用Handler发送异步延迟消息的函数,下面就来分析一下:

    1)PostDelayed函数

    该函数的主要工作是获取UI线程的Handler对象,然后调用Handler类的postDelayed函数将指定的Runnable对象放到消息队列中。

    publicbooleanpostDelayed(Runnable action,longdelayMillis) {

    Handler handler;

    if(mAttachInfo !=null) {

    handler = mAttachInfo.mHandler;

    }else{

    // Assume that post will succeed later

    ViewRoot.getRunQueue().postDelayed(action, delayMillis);

    returntrue;

    }

    returnhandler.postDelayed(action, delayMillis);

    }2)CheckForTap类

    该类实现了Runnable接口,在run函数中设置触摸标识,并刷新Drawable的状态,同时用于发送一个检测长按事件的异步延迟消息,代码如下:

    privatefinalclassCheckForTapimplementsRunnable {

    publicvoidrun() {

    // 进入该函数,说明已经过了ViewConfiguration.getTapTimeout()时间,

    // 即pre-pressed状态结束,宣告触摸进入pressed状态

    mPrivateFlags &= ~PREPRESSED;

    mPrivateFlags |= PRESSED;

    refreshDrawableState();// 刷新控件的背景Drawable

    // 如果长按检测没有被去使能,则发送一个检测长按事件的异步延迟消息

    if((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {

    postCheckForLongClick(ViewConfiguration.getTapTimeout());

    }

    }

    }

    privatevoidpostCheckForLongClick(intdelayOffset) {

    mHasPerformedLongPress =false;

    // 实例化CheckForLongPress对象

    if(mPendingCheckForLongPress ==null) {

    mPendingCheckForLongPress =newCheckForLongPress();

    }

    mPendingCheckForLongPress.rememberWindowAttachCount();

    // 调用PostDelayed函数发送长按事件的异步延迟消息

    postDelayed(mPendingCheckForLongPress,

    ViewConfiguration.getLongPressTimeout() - delayOffset);

    }

    3)CheckForLongPress类

    该类定义了长按操作发生时的响应处理,同样实现了Runnable接口

    classCheckForLongPressimplementsRunnable {

    privateintmOriginalWindowAttachCount;

    publicvoidrun() {

    // 进入该函数,说明检测到了长按操作

    if(isPressed() && (mParent !=null)

    && mOriginalWindowAttachCount == mWindowAttachCount) {

    if(performLongClick()) {

    mHasPerformedLongPress =true;

    }

    }

    }

    publicvoidrememberWindowAttachCount() {

    mOriginalWindowAttachCount = mWindowAttachCount;

    }

    }

    publicbooleanperformLongClick() {

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);

    booleanhandled =false;

    if(mOnLongClickListener !=null) {

    // 回调用户实现的长按操作监听函数(OnLongClickListener)

    handled = mOnLongClickListener.onLongClick(View.this);

    }

    if(!handled) {

    // 如果OnLongClickListener的onLongClick返回false

    // 则需要继续处理该长按事件,这里是显示上下文菜单

    handled = showContextMenu();

    }

    if(handled) {

    // 长按操作事件被处理了,此时应该给用户触觉上的反馈

    performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

    }

    returnhandled;

    }0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • Android事件拦截机制

    2021-06-03 03:48:18
    一直对事件拦截不是很清楚,读Android群英传的笔记,记录下。要了解事件拦截,首先要了解触摸事件,触摸事件是捕获触摸屏幕后发生的事件。按一下屏幕通常会有几个事件发生,当按下屏幕,这是事件1。滑动了一下,这是...

    一直对事件拦截不是很清楚,读Android群英传的笔记,记录下。

    要了解事件拦截,首先要了解触摸事件,触摸事件是捕获触摸屏幕后发生的事件。按一下屏幕通常会有几个事件发生,当按下屏幕,这是事件1。滑动了一下,这是事件2。当手抬起,这是事件3。当重写onTouchEvent方法时,会给我们一个事件封装类MotionEvent。滑动,按下,对应不同的Action(如MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP),通过对Action的判断就可以实现不同的逻辑了。

    咋一看触摸事件好像比较简单,但Android的View是树形结构的,一个View可能放在一个ViewGroup里面,而一个ViewGrop可能又放在另一个ViewGroup里面,可能会存在多层的嵌套结构,那么里面的触摸事件要给谁处理呢?这就要用到事件拦截了。

    先附上代码。

    MyViewGroupA.java

    public class MyViewGroupA extends LinearLayout {

    public MyViewGroupA(Context context) {

    super(context);

    }

    public MyViewGroupA(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    public MyViewGroupA(Context context, AttributeSet attrs,

    int defStyleAttr) {

    super(context, attrs, defStyleAttr);

    }

    @Override

    public boolean dispatchTouchEvent(MotionEvent ev) {

    Log.d("LOG", "ViewGroupA dispatchTouchEvent" + ev.getAction());

    return super.dispatchTouchEvent(ev);

    }

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

    Log.d("LOG", "ViewGroupA onInterceptTouchEvent" + ev.getAction());

    return super.onInterceptTouchEvent(ev);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    Log.d("LOG", "ViewGroupA onTouchEvent" + event.getAction());

    return super.onTouchEvent(event);

    }

    }

    MyViewGroupB.java

    public class MyViewGroupB extends LinearLayout {

    public MyViewGroupB(Context context) {

    super(context);

    }

    public MyViewGroupB(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    public MyViewGroupB(Context context, AttributeSet attrs,

    int defStyleAttr) {

    super(context, attrs, defStyleAttr);

    }

    @Override

    public boolean dispatchTouchEvent(MotionEvent ev) {

    Log.d("LOG", "ViewGroupB dispatchTouchEvent" + ev.getAction());

    return super.dispatchTouchEvent(ev);

    }

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

    Log.d("LOG", "ViewGroupB onInterceptTouchEvent" + ev.getAction());

    return super.onInterceptTouchEvent(ev);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    Log.d("LOG", "ViewGroupB onTouchEvent" + event.getAction());

    return super.onTouchEvent(event);

    }

    }

    MyView.java

    public class MyViewC extends View {

    public MyViewC(Context context) {

    super(context);

    }

    public MyViewC(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    public MyViewC(Context context, AttributeSet attrs,

    int defStyleAttr) {

    super(context, attrs, defStyleAttr);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    Log.d("LOG", "View onTouchEvent" + event.getAction());

    return super.onTouchEvent(event);

    }

    @Override

    public boolean dispatchTouchEvent(MotionEvent event) {

    Log.d("LOG", "View dispatchTouchEvent" + event.getAction());

    return super.dispatchTouchEvent(event);

    }

    }

    activity_main.xml

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@android:color/holo_blue_bright">

    android:layout_width="300dp"

    android:layout_height="300dp"

    android:background="@android:color/holo_green_dark">

    android:layout_width="150dp"

    android:layout_height="150dp"

    android:background="@android:color/darker_gray" />

    这里有2个ViewGroup,一个View,结构如下

    c21bdc825f59

    Paste_Image.png

    可以看到MyViewGroupA,在最外层,MyViewGroupB在中间,MyViewC在最底层。

    ViewGroup分别重写了dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent

    View重写了onTouchEvent,dispatchTouchEvent

    可以看到ViewGroup比View多了一个方法,看名字是拦截的意思。

    当我们点击MyViewC打印log如下

    c21bdc825f59

    Paste_Image.png

    可以看到事件的传递顺序是ViewGroupA -> ViewGroupB - > MyView

    事件的处理顺序是MyView - > ViewGroupB - >ViewGroupA

    Android对dispatchTouchEvent 的解释如下

    /**

    * Pass the touch screen motion event down to the target view, or this

    * view if it is the target.

    *

    * @param event The motion event to be dispatched.

    * @return True if the event was handled by the view, false otherwise.

    **/

    dispatchTouchEvent 方法用来传递事件,返回True ,拦截,返回值false不拦截,继续传递。

    onTouchEvent也类似,返回True处理,返回False交给上级处理。

    可以知道无论是dispatchTouchEvent还是 onTouchEvent,如果返回True,表示这个事件被消费了、处理了不再往下传。

    为了了解拦截过程,先忽略dispatchTouchEvent与onTouchEvent方法,简单修改ViewGroupB onInterceptTouchEvent为true,同样点击MyViewC,log如下

    c21bdc825f59

    Paste_Image.png

    可以看到ViewGroupB拦截后,果然MyView就没有事件继续传递了,事件被ViewGroupB自己完成。

    展开全文
  • 推荐文章:Android中的自定义注解(反射实现-运行时注解)(++还有一点,在Android平台上,查询注解的效率比较低,特别是在Android 4.0之前的系统上,可以看看这个Bug,其中也推荐我们用编译时注解,所以个人观点是慎...
  • 效果如下: 1:下载依赖(两个)2:在AndroidManifest.xml文件中添加权限代码使项目可以访问网上图片3:布局文件xmlns:tools=...android:orientation...
  • 在进行Android程序的逆向分析的时候,经常需要通过Android应用程序的界面UI来定位代码的位置,比较常见的例子就是分析Android应用的网络协议时,用户点击登录按钮,实现客户端程序的登录,将用户的账号信息发送给...
  • 1,在代码中加入如下红色代码,不然会被包含在其中的控件把焦点抢占,此时子控件无需设置clickable和focuseableAndroid:id="@+id/relativeLayout"android:layout_height="wrap_content"android:layout_width="wrap_...
  • 1)拖放事件类2)拖放监听器3)其他辅助的方法和类3、拖放过程?拖放过程有四个基本步骤:1)启动 为了响应用户开始拖动的手势,需要调用View的startDrag方法来通知系统。startDrag方法的参数需要指定所拖动的数据、元.....
  • Android事件分发

    2021-06-02 19:10:41
    1、 引言:Android如此受欢迎,其优秀的交互性功不可没,优秀的事件分发机制在交互性中起到了重要的作用。想做出有良好交互性的应用,深入了解事件分发机制是十分必要的。2、 View和ViewGroup:Android的UI界面都是...
  • 一、写在最前面本次,来介绍一下安卓中为控件--Button绑定事件的五种方式。二、具体的实现第一种:直接绑定在Button控件上:步骤1.在Button控件上设置android:onClick=",其中这个属性的属性值对应的是MainActivity...
  • 原因开发过程中遇到button.performClick()无效,原因是View.performClick()需要再UI线程中调用才会有效执行。响应系统调用的方法(比如报告用户动作的onKeyDown()或一个生命周期回调方法)永远在界面线程中进程,所以...
  • 点击事件透传机制

    2021-06-03 14:21:52
    点击屏幕的事件传递是:Activity将事件交给 所属的Window,如果返回true,整个事件循环就结束了,返回false意味着事件没人处理,所有view的onTouchevent ,都反回了false,那么Activity的onTouchevent就会被调用。...
  • 一、监听的三要素: Event source 事件源 Event 事件 Event Listener 事件监听器
  • Android开发过程中,点击App里面的控件进行网页跳转是经常会遇到的需求,但是Android的网页跳转有两种方式实现App点击控件跳转到网页,第一种就是App里面的代码根据网址链接进行网页跳转,第二种就是根据Webview...
  • 本文讲述Android自定义时间轴的实现过程,供大家参考,具体内容如下时间轴效果,实际上非常简单,就是listView中一个又一个的条目而已….大家可以只关注一个条目。首先展示一个条目的布局效果android:layout_width=...
  • 一共有三种,第一种为button按钮设置onclick属性,在Java类中写onclick方法,第二种为在匿名内部类实现,第三种为button按钮设置接口,再实现该接口。
  • eg:实现从一个页面点击跳转到另一个页面1、首先在一个布局文件(.XML)中绘画了一个跳转按钮(id为btn1):android:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:...
  • 一直对事件拦截不是很清楚,读Android群英传的笔记,记录下。要了解事件拦截,首先要了解触摸事件,触摸事件是捕获触摸屏幕后发生的事件。按一下屏幕通常会有几个事件发生,当按下屏幕,这是事件1。滑动了一下,这是...
  • 小序这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音……背景介绍最近被导师要求做一个购物收费的app,毕设好难呀~ 网上找了半天...
  • public boolean onKeyDown(int keyCode, KeyEvent event) {if(KeyEvent.KEYCODE_HOME==keyCode){//写要执行的动作或者任务android.os.Process.killProcess(android.os.Process.myPid());}return super.onKeyDown...
  • 研究了一下android的touch事件,从doc到google,算是有了一些初步的理解。以下是经过消化的个人理解,有可能与事实不符,欢迎指正。首先,来了解一下android事件机制。android的基本元事件我猜应该有5种,理由是...
  • ImageView设置点击效果需要注意两点,第一个设置android:clickable="true",第二个 属性必须放到最后才能生效android:id="@+id/ivCategory"android:layout_width="@dimen/x110"android:layout_height="@dimen/x110...
  • ImageView设置点击效果需要注意两点,第一个设置android:clickable="true",第二个 属性必须放到最后才能生效android:id="@+id/ivCategory"android:layout_width="@dimen/x110"android:layout_height="@dimen/x110...
  • 有些view的实现会自定义onInterceptTouchEvent, 以及OnTouchEvent两个响应事件,onTouchEvent的功能我们都知道,但是onInterceptTouchEvent的功能是什么呢?两者又是什么关系?什么情况需要使用?...
  • 一、了解Activity的构成一个Activity包含了一个Window对象,这个对象是由PhoneWindow来实现的。PhoneWindow将DecorView作为整个应用窗口的根View,而这个DecorView又将屏幕划分为两个区域:一个是TitleView,另一个...
  • 概述Android开发过程中,经常遇到 Textview 展示不完全的情况。遇到此情况,通常的处理是:方案一Textview 添加 android:ellipsize 属性,让展示不完的部分使用省略号代替。方案二Textview 采用走马灯效果,使其滚动...
  • Android开发实现按钮点击切换背景并修改文字颜色的方法发布时间:2020-10-14 00:57:06来源:脚本之家阅读:99作者:清澈@Cherry本文实例讲述了Android开发实现按钮点击切换背景并修改文字颜色的方法。分享给大家供...
  • 本文实例展示了Android实现为TextView添加多个可点击的文本的方法。该功能在Android社交软件的制作中非常具有实用价值。分享给大家供大家参考。具体如下:很多时候我们在使用社交软件的过程中多多少少会为别人的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,447
精华内容 53,778
关键字:

安卓点击事件的实现过程