精华内容
下载资源
问答
  • ontouch事件

    2013-01-08 10:31:28
    触摸事件 ontouch 回调 函数,其返回值是布尔型的,如果返回false则只触发按下事件,不会触发回调,如果返回true 则触发按下 抬起 移动事件
    触摸事件  ontouch  回调 函数,其返回值是布尔型的,如果返回false则只触发按下事件,不会触发回调,如果返回true 则触发按下 抬起 移动事件
    展开全文
  • android onTouch事件

    2019-10-01 23:12:01
    1 /** 2 *Button的onTouch,onClick,onLongClick... 4 *首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件; 5 *然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。 6 * ...
      1 /**
      2 *Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:
      3 *一,onTouch返回false
      4 *首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件;
      5 *然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。
      6 *
      7 *二,onTouch返回true
      8 *首先是onTouch事件的down事件发生,然后是onTouch事件的up事件发生;
      9 *期间不触发onClick和onLongClick事件
     10 *
     11 *三,onTouch:down返回true,up返回false:结果同二。
     12 *机制分析:
     13 *   onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),
     14 *而up事件标记此次事件结束时间,也就是判断是否为长按。
     15 *只要当down返回true时候,系统将不把本次事件记录为点击事件,也就不会触发onClick或者onLongClick事件了。
     16 *因此尽管当up的时候返回false,系统也不会继续触发onClick事件了。
     17 *
     18 *四,onTouch:down返回false,up返回true:
     19 *首先是onTouch事件的down事件发生,此时:
     20 *长按,触发onLongClick事件,然后是onTouch事件的up事件发生,完毕。
     21 *短按,先触发onTouch的up事件, 到一定时间后,自动触发onLongClick事件。
     22 *机制分析:
     23 *  onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),而up事件标记此次事件结束时间,也就是判断是否为长按。
     24 *  当down返回false,标记此次事件为点击事件,而up返回了true,则表示此次事件一直没有结束,也就是一直长按下去了,达到长按临界时间后,自然触发长按事件,而onClick事件没有触发到
     25 */
     26 public class ImageZoomActivity extends Activity implements OnTouchListener {
     27    private static final String TAG = "Touch";
     28    // These matrices will be used to move and zoom image
     29    Matrix matrix = new Matrix();
     30    Matrix savedMatrix = new Matrix();
     31 
     32    // We can be in one of these 3 states
     33    static final int NONE = 0;
     34    static final int DRAG = 1;
     35    static final int ZOOM = 2;
     36    int mode = NONE;
     37 
     38    // Remember some things for zooming
     39    PointF start = new PointF();
     40    PointF mid = new PointF();
     41    float oldDist = 1f;
     42  private ImageView view;
     43  private boolean keyUpDown=false;
     44  private int timer=0;
     45  
     46    /* (non-Javadoc)
     47  * @see android.app.Activity#onCreate(android.os.Bundle)
     48  */
     49 @Override
     50    public void onCreate(Bundle savedInstanceState) {
     51       super.onCreate(savedInstanceState);
     52       requestWindowFeature(Window.FEATURE_NO_TITLE);
     53       setContentView(R.layout.touch);
     54       view = (ImageView) findViewById(R.id.imageView);
     55       Intent intent=getIntent();
     56 //      Drawable drawable=loadImgByFilePath(intent.getStringExtra("toZoom"));
     57       view.setImageURI(Uri.parse(intent.getStringExtra("toZoom")));
     58       view.setOnTouchListener(this);
     59    }
     60 
     61  private Handler clickHandler = new Handler(){
     62   @Override
     63   public void handleMessage(Message msg) {
     64    if(msg.what==0){
     65     keyUpDown=true;
     66     keyUpDownListener();
     67    }else if(msg.what==1){
     68     keyUpDown=false;
     69     if(timer<=1)
     70      ImageZoomActivity.this.finish();//此处即为OnClick处理对应部分,只需在此处添中处理代码即可.
     71     else timer=0;
     72    }
     73   }
     74  };
     75  private int keyUpDownListener() {
     76   new Thread(){
     77    public void run(){
     78     while(keyUpDown){
     79      try {
     80       sleep(200);
     81       timer++;
     82       Log.d("info","timing:timer="+timer);
     83      } catch (InterruptedException e) {
     84       e.printStackTrace();
     85      }
     86     }
     87    }
     88   }.start();
     89   return timer;
     90  }
     91 
     92    @Override
     93    public boolean onTouch(View v, MotionEvent event) {
     94       ImageView view = (ImageView) v;
     95 
     96       // Dump touch event to log
     97 //      dumpEvent(event);
     98 
     99       // Handle touch events here...
    100       switch (event.getAction() & MotionEvent.ACTION_MASK)
    101       {
    102       case MotionEvent.ACTION_DOWN:
    103          savedMatrix.set(matrix);
    104          //設置初始點位置
    105          start.set(event.getX(), event.getY());
    106          Log.d(TAG, "mode=DRAG");
    107         clickHandler.sendEmptyMessage(0);
    108          mode = DRAG;
    109          break;
    110       case MotionEvent.ACTION_POINTER_DOWN:
    111          oldDist = spacing(event);
    112          Log.d(TAG, "oldDist=" + oldDist);
    113          if (oldDist > 10f) {
    114             savedMatrix.set(matrix);
    115             midPoint(mid, event);
    116             mode = ZOOM;
    117             Log.d(TAG, "mode=ZOOM");
    118          }
    119          break;
    120       case MotionEvent.ACTION_UP:clickHandler.sendEmptyMessage(1);
    121       case MotionEvent.ACTION_POINTER_UP:
    122          mode = NONE;
    123          Log.d(TAG, "mode=NONE");
    124          break;
    125       case MotionEvent.ACTION_MOVE:
    126          if (mode == DRAG) {
    127             // ...
    128             matrix.set(savedMatrix);
    129             matrix.postTranslate(event.getX() - start.x,
    130                   event.getY() - start.y);
    131          }
    132          else if (mode == ZOOM) {
    133             float newDist = spacing(event);
    134             Log.d(TAG, "newDist=" + newDist);
    135             if (newDist > 10f) {
    136                matrix.set(savedMatrix);
    137                float scale = newDist / oldDist;
    138                matrix.postScale(scale, scale, mid.x, mid.y);
    139             }
    140          }
    141          break;
    142       }
    143 
    144       view.setImageMatrix(matrix);
    145       return true; // indicate event was handled
    146    }
    147 
    148    /** Determine the space between the first two fingers */
    149    private float spacing(MotionEvent event) {
    150       float x = event.getX(0) - event.getX(1);
    151       float y = event.getY(0) - event.getY(1);
    152       return FloatMath.sqrt(x * x + y * y);
    153    }
    154 
    155    /** Calculate the mid point of the first two fingers */
    156    private void midPoint(PointF point, MotionEvent event) {
    157       float x = event.getX(0) + event.getX(1);
    158       float y = event.getY(0) + event.getY(1);
    159       point.set(x / 2, y / 2);
    160    }
    161 }

     

    转载于:https://www.cnblogs.com/QuentinYo/p/3487148.html

    展开全文
  • Android onTouch事件传递机制
  • OnTouch事件对应代码

    2015-02-05 22:10:31
    OnTouch事件的机制,容易出错的地方
  • onTouch事件传递

    千次阅读 2017-02-24 17:44:40
    前言在我们的项目中,遇到比较复杂布局的时候,最常见的就是布局嵌套和自定义控件,那么滑动冲突与点击冲突你一定是遇到过的,解决的方法有很多,但是总的来说都是对onTouch事件传递做处理.那么我们就来了解一下onTouch...

    前言

    在我们的项目中,遇到比较复杂布局的时候,最常见的就是布局嵌套和自定义控件,那么滑动冲突与点击冲突你一定是遇到过的,解决的方法有很多,但是总的来说都是对onTouch事件传递做处理.那么我们就来了解一下onTouch事件到底是怎么传递的

    1.基本知识

    我们先看看相关的几个方法

    (View是没有onInterceptTouchEvent方法的)

    ViewGroup

    • 1. dispatchTouchEvent(分发touch事件)
    • 2. onInterceptTouchEvent(拦截touch事件)
    • 3. onTouchEvent(消费事件)

    View

    • 1. dispatchTouchEvent(分发touch事件)
    • 2. onTouchEvent(消费事件)

    一个事件首先会由dispatchTouchEvent决定怎么分配,接着由onInterceptTouchEvent决定是否拦截,最后由onTouchEvent决定怎么消费

    一般来说我们会重写onInterceptTouchEvent和onTouchEvent方法来改变事件的传递,但是不会去重写dispatchTouchEvent方法

    下面为了更好的描述,有些地方就用简称描述了

    • dispatchTouchEvent : 分配
    • onInterceptTouchEvent : 拦截

    2. 传递规律

    (1)基本传递方向

    首先我们需要知道onTouch事件传递的基本传递方向,onTouch事件的传递方向大概是从父控件传递到子控件,然后再从子控件传回父控件,这个过程中一旦事件被消费了,那么事件就不会继续传递了

    (2)拦截

    onInterceptTouchEvent方法会有一个返回值,如果你返回的是false,表示不拦截,那么事件就会先往子控件传递,如果你返回的是true,表示拦截,那么事件不会往下传递了

    (3)消费

    可以消费事件的地方有两个:

    • OnTouchListener: 通过setOnTouchListener设置的OnTouchListener里面的onTouch方法
    • onTouchEvent: 控件本身的onTouchEvent方法

    这两个方法都有返回值,如果你返回的是true,代表事件被消费了,如果你返回的是false,那么就算你在方法里做了很多事,也不算消费

    当OnTouchListener存在的时候,会先获取到事件,如果不消费的话才会传到onTouchEvent

    OnTouchListener虽然优先于onTouchEvent,但都属于同一层的消费,在这里我们就不分开来描述了,统一描述为自己消费

    (OnTouchListener > onTouchEvent)

    (4)一组事件

    move和up事件往往是和dowm事件相关联的,为了简化描述,我们这里就把down,move,up同一称为一组事件(下一次down事件之后的算下一组)

    (5)控件

    这里指的所有控件都是在onTouch事件的点击范围内,如果不在这个点击范围内的控件,是不会参与事件传递的

    3.传递路线

    一个控件获取到事件时,首先会走dispatchTouchEvent,才会走onInterceptTouchEvent和onTouchEvent,一般我们都不会去重写dispatchTouchEvent方法(研究源码的需要重点研究这个方法),所以接下来的传递路线就跳过dispatchTouchEvent这个方法了

    这个例子里面只有一个ViewGroup,ViewGroup里面有只有一个View

    4.要点

    (1)拦截

    ①如果ViewGroup在onInterceptTouchEvent里面拦截了down事件,那么这一组事件都不会再进入onInterceptTouchEvent方法里面了,也不会分配到View里面了

    (2)消费

    ①如果ViewGroup消费了down事件,那么这一组事件不会进入到onInterceptTouchEvent里面了,更不会分配到View里面了,而是直接从dispatchTouchEvent方法走到自己消费的方法里

    (3)多个View

    如果ViewGroup有多个View,那么会从最上面的view遍历,如果有view消费了down事件,那么就不会继续遍历了,而且这一组事件也会直接进入这个view

    (还会走ViewGroup的分配和拦截方法)

    5.总结

    onTouch事件的传递有很多可能的路线,这里就不贴出笔者当初研究的DEMO代码了,免得看得头晕.你只要知道几个主要的原则和规律,再复杂的情况你也能够知道事件会怎么传递,这里就再次总结一下

    (1)一个ViewGroup有三种方法,分配,拦截,消费

    • 分配: dispatchTouchEvent
    • 拦截: onInterceptTouchEvent
    • 消费: OnTouchListener和onTouchEvent (优先走OnTouchListener的onTouch)

    (View的话没有拦截)

    (2)首先事件会从父控件开始,逐级往下传递

    (2)事件经过某个控件的时候,会先走分配,再走拦截,如果不拦截又会接着往下分配

    (3)事件从上往下分配时,要么是走到某一层被拦截了,要么是走到最底层了才会停止向下分配

    (4)一旦停止向下传递,就要开始考虑消费的事了

    (5)从停止传递的那一层开始,询问是否要消费事件,如果自己不消费,那么逐级往上询问

    (6)一旦某层把事件消费了,那么就不再向上询问,事件传递就到此结束了

    6.思维导图

    笔者当初第一次研究的时候做了一个DEMO,并把传递的过程用思维导图详细的记录了下来,有兴趣的朋友可以去下载看看,免费的哦,不过还是建议有时间的朋友能够自己写demo测试一下,这样才能更好的理解.

    思维导图

    http://download.csdn.net/download/yulyu/9763226

    热门文章

    展开全文
  • 相信不少朋友在刚开始...分不清onTouch(),onTouchEvent()和OnClick()之间的关系和先后顺序,所以觉得有必要搞清onTouch事件传递的原理。经过一段时间的琢磨以及相关博客的介绍,这篇文章就给大家详细的分析介绍下。
  • Android onTouch事件记录

    2019-12-04 19:45:03
    正在写一个连连看,需要onTouch获得点击坐标数据,于是使用了onTouch事件,然而使用后发现多次执行了onTouch事件。 原因:onTouch事件分为了ACTION_DOWN(按下)、ACTION_UP(放开)等等状态,所以会多次调用。 来...

    正在写一个连连看,需要onTouch获得点击坐标数据,于是使用了onTouch事件,然而使用后发现多次执行了onTouch事件。

    原因:onTouch事件分为了ACTION_DOWN(按下)、ACTION_UP(放开)等等状态,所以会多次调用。

    来个switch就好了。

     

    展开全文
  • 可直接运行的手势操作onTouch事件的demo
  • 最近几天在做一个瀑布流的小项目,为了实现以下功能:图片的手指放大、移动,点击后关闭当前的自定义窗口,无论怎么设置,ontouch事件和onclick就是发生冲突,无法实现想要功能,刚开始以为是手指放大移动功能的方法...
  • onTouch 事件传递

    2017-04-11 13:17:35
    在我们的项目中,遇到比较复杂布局的时候,最常见的就是布局嵌套和自定义控件,那么滑动冲突与点击冲突你一定是遇到过的,解决的方法有很多,但是总的来说都是对onTouch事件传递做处理.那么我们就来了解一下onTouch事件...
  • onTouch事件onClick

    2012-05-02 19:21:41
    首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件; 然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。 二,onTouch返回true 首先是onTouch事件的down事件发生,然后是o
  • onTouch事件的传递思维导图(完整版)
  • onTouch事件的传递机制

    2017-07-16 12:22:18
    onTouch事件的传递机制一、点击事件传递机制: 1.view执行dispatchTouchEvent 方法,开始分发事件,返回值决定是否分发出去 2.执行onInterceptHoverEvent 方法,判断是否中断事件,返回值决定是否传递给子View 3....
  • 新手学习Android, ontouch事件处理的三种写法,1、接口实现,2、内部类,3、匿名内部类
  • androud onTouch事件记录

    2015-05-18 15:28:56
    1,return false说明你还没消费onTouch事件,在执行完你onTouch里面的代码之后,onTouch事件并没有结束。就是会自动地执行Gallery这个view里onTouch代码(这个为默认).所以这就是为什么没增加你的处理的时候就只自动...
  • Android onClick onTouch事件关联

    千次阅读 2013-03-25 09:06:16
    首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件; 然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。 二,onTouch返回true 首先是onTouch事件的down事件发生,然后是onTouch
  • android click 和onTouch 事件处理机制,极其详细介绍
  • Android中丰富多彩的onTouch事件.rar
  • Android的OnTouch事件的处理机制 Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:  一,onTouch返回false  首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件;  ...
  • onTouch事件传递机制

    2015-02-09 11:21:11
    在触发OnTouch事件时Android的GroupView会调用3个函数:public boolean dispatchTouchEvent(MotionEvent ev) //用于事件分发public boolean onInterceptTouchEvent(MotionEvent ev) //用于事件的拦截public boolea.....
  • 在按钮的onTouch事件内加入 view.getParent().requestDisallowInterceptTouchEvent(true);//通知ScrollView请勿拦截本控件touch事件 例如: //button是 在scrollview里面的按钮 button.setOnTouchListener(new ...
  • 要彻底理解ontouch事件,首先必须从源码角度对ontouch事件有个直观的认识,谈到认识,不得不提及一位大牛的两篇博文,实际上如果看懂了,ontouch事件和onclick包括onlongclick基本上也就被攻克了。 ...
  • 一旦我触摸小图像,那么他们应该消失或应该弹出一个警告框,但ontouch事件没有发生,迄今为止我已经搜索了ontouch事件,但没有用。我不想通过HTML中的img标签来绘制图像。 这里是我的代码段如何在canvas HTML5中使用...
  • 最近给框架里面加了个自定义Button,由于需要增加点击效果,故在自定义的Button里面加了OnTouch事件以起到点击的效果,但是写完测的时候发现return false的时候event 只有down 没有up,在Activity里面调用此Button ...
  • Android onTouch事件与手势操作
  • TextView无法响应onTouch事件

    千次阅读 2013-07-17 11:24:49
    刚才给要给TextView设置拖动效果,用了setOnTouchListener为其添加了onTouch事件来处理拖动效果。但是测试总是失败。 后来找到问题,需要在TextView的属性中使能哦那Click事件——android:clickable="true"。然后就...
  • android onTouch事件的派发 android中的时间分为按键事件和触摸事件,OnTouch()事件是触摸事件的基础事件。有必要对onTouch()事件进行深入的研究。 一个最简单的屏幕触摸动作触发了一系列Touch...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,584
精华内容 9,433
关键字:

ontouch事件