精华内容
下载资源
问答
  • 失效的原因是因为 TouchEvent() 首先被 scrollView 中的onTouchEvent() (ScrollView 中也有这个方法) ,而且ScrollView 的 onTouchEvent() 执行完了之后,返回的是 true 所以此时,事件停止传播。即这个时候 Activity...

    失效的原因是因为 TouchEvent() 首先被 scrollView 中的onTouchEvent() (ScrollView 中也有这个方法) ,而且ScrollView  的 onTouchEvent() 执行完了之后,返回的是 true 所以此时,事件停止传播。即这个时候 Activity 中的onTouchEvent 将不会被回调了。 所以呢。解决的方法是 自定义一个ScrollView。


    例如:


    [java]  view plain copy
    1. import android.content.Context;  
    2. import android.util.AttributeSet;  
    3. import android.view.MotionEvent;  
    4. import android.widget.ScrollView;  
    5.   
    6. public class MyScrollView extends ScrollView  
    7. {  
    8.       
    9.     public MyScrollView(Context context)  
    10.     {  
    11.         super(context);  
    12.   
    13.     }  
    14.   
    15.     public MyScrollView(Context context, AttributeSet attrs)  
    16.     {  
    17.         super(context, attrs);  
    18.           
    19.     }  
    20.       
    21.     public MyScrollView(Context context, AttributeSet attrs, int defStyle)  
    22.     {  
    23.         super(context, attrs, defStyle);  
    24.     }  
    25.       
    26.     @Override  
    27.     public boolean onInterceptTouchEvent(MotionEvent event)   //这个方法如果返回 true 的话 两个手指移动,启动一个按下的手指的移动不能被传播出去。  
    28.     {  
    29.         super.onInterceptTouchEvent(event);  
    30.         return false;  
    31.     }  
    32.       
    33.     @Override  
    34.     public boolean onTouchEvent(MotionEvent event)//这个方法如果 true 则整个Activity 的 onTouchEvent() 不会被系统回调  
    35.     {  
    36.         super.onTouchEvent(event);  
    37.         return false;         
    38.     }  
    39.           
    40. }  




    自定义了以上代码之后我们就可以在布局xml中编写

    [html]  view plain copy
    1. <org.youpackage.name.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="match_parent"  
    3.     android:layout_height="match_parent"  
    4.     android:fillViewport="true">  
    5.     <LinearLayout  
    6.          android:layout_width="match_parent"  
    7.          android:layout_height="match_parent"  
    8.          android:orientation="vertical"  
    9.          >   
    10.             ......   //这里放组件  
    11.     </LinearLayout>  
    12.   
    13.  </org.youpackage.name.MyScrollView 
    14.  
    15.   
    16.  经过这个定义之后 Activity 中的 onTouchEvent() 就回被调用了。  
    17.  有什么不懂的可以留言。技术最重要就是交流了。 关于事件的传播,我也是一知半解,如有前辈,望指点一下。 
    18.   转自:http://blog.csdn.net/failure01/article/details/8525709   
    19.       
    展开全文
  • 在一个relativeLayout中有两个view,其中一个的自定义控件,定义了它的触摸、点击等事件的监听,activity启动后即把处理后的图片加载给它,另一个是系统的imageview,在activity中重写了ontouchevent,在触摸屏幕后...
  • 借鉴网上解决办法: 场景: 在实际开发中你可能需要把ListView中的onTouchEvent写在Activity中进行...这时候你会发现ListView的onTouchEvent事件有效,但是Activity的onTouchEvent事件却失效,这是为什么呢?  ...

    借鉴网上解决办法:

    场景:

    在实际开发中你可能需要把ListView中的onTouchEvent写在Activity中进行操作,或者是同时存在对ListView或者Activity的不同向操作(例如向左右向上下滑动绑定不同事件)。

     

    问题:

    这时候你会发现ListView的onTouchEvent事件有效,但是Activity的onTouchEvent事件却失效,这是为什么呢?

     

    解决与分析:

    这是因为ListView是的onTouchEvent 优先权高于Activity的,前者把后者覆盖了,于是造成Activity onTouchEvent失效。

     

    这时候我们查看API以及翻阅网上资料,发现Activity提供另外一个方法的重写。

     

    @Override  

     

    1.     public boolean dispatchTouchEvent(MotionEvent event) {  
    2.   
    3.     return super.dispatchTouchEvent(event);  
    4.   
    5.   
    6.     }  
    @Override
    	public boolean dispatchTouchEvent(MotionEvent event) {
    
    	return super.dispatchTouchEvent(event);
    
    
    	}

    替换方法就ok了

    展开全文
  • 在实际开发中你可能需要把ListView中的onTouchEvent写在Activity中进行操作,或者是同时存在对ListView或者...这时候你会发现ListView的onTouchEvent事件有效,但是Activity的onTouchEvent事件却失效,这是为什么呢?

    使用GestureDetector来实现,当手势在屏幕上面滑动的时候 ,会掉用onFling方法,所以,在这个方法里面做判断和操作即可。原理就不讲了,直接上代码,相信你会看懂的。。。

     

    实现手势下滑关闭功能。

              1.在onCreate方法里面重写 GestureDetector的方法

     

    private GestureDetector mGestureDetector;
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layout_login);
         
            mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                    // if (Math.abs(e1.getRawX() - e2.getRawX()) > 250) {
                    // // System.out.println("水平方向移动距离过大");
                    // return true;
                    // }
                    if (Math.abs(velocityY) < 100) {
                        // System.out.println("手指移动的太慢了");
                        return true;
                    }
    
                    // 手势向下 down
                    if ((e2.getRawY() - e1.getRawY()) > 200) {
                        finish();//在此处控制关闭
                        return true;
                    }
                    // 手势向上 up
                    if ((e1.getRawY() - e2.getRawY()) > 200) {
                        return true;
                    }
                    return super.onFling(e1, e2, velocityX, velocityY);
                }
            });
    
        }


    调用这句的代码启动手势识别器:

    //2.让手势识别器 工作起来
    
    //当activity被触摸的时候调用的方法.
    
    @Override
    
    public boolean onTouchEvent(MotionEvent event) {
    
        mGestureDetector.onTouchEvent(event);
    
        return super.onTouchEvent(event);
    
    }

     

            2. 同样,如果你想要控制左滑和右滑,直接使用getRawX()方法即可,可以尝试。

    二、实现下拉和上抽动画效果。

         动画效果实现,重写上抽和下拉的动画效果,可以使用Android自带的一个方法,在finish()方法之前进行调用:

          overridePendingTransition(R.anim.slide_up_in, R.anim.slide_up_out);

           

    R.anim.slide_up_out

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="200"
            android:fromYDelta="0%"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:toYDelta="100%" />
    
    </set>


     

    R.anim.slide_up_in:

    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="300"
            android:fromYDelta="-100%"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:toYDelta="0%" />
    
    </set>

     

              ================= 问题分割线 =================
     

    在实际开发中你可能需要把ListView中的onTouchEvent写在Activity中进行操作,或者是同时存在对ListView或者Activity的不同向操作(例如向左右向上下滑动绑定不同事件)。这时候你会发现ListView的onTouchEvent事件有效,但是Activity的onTouchEvent事件却失效,这是为什么呢?疑问

     

    解决与分析:奋斗

    这是因为ListView是的onTouchEvent 优先权高于Activity的,前者把后者覆盖了,于是造成Activity onTouchEvent失效。

     

    这时候我们查看API以及翻阅网上资料,发现Activity提供另外一个方法的重写。

     

    @Override
    	public boolean dispatchTouchEvent(MotionEvent event) {
    
    	return super.dispatchTouchEvent(event);
    
    
    	}


     

     这时候我们只需要把相关的操作写在这里,你会发现焦点不冲突啦~大笑

     

     微信扫描头像开始关注啦!生气

    展开全文
  • 魅族手机onTouchEvent 、onLongClick踩坑

    千次阅读 2017-11-20 20:54:38
    在遇到的坑之前我们先了解 Android onTouchEvent, onClick及onLongClick的调用机制 1. onTouchEvent: onTouchEvent中要处理的最常用的3个事件就是:ACTION_DOWN(按下)、ACTION_MOVE(移动)、ACTION_UP(抬起)...

    在遇到的坑之前我们先了解 Android onTouchEvent, onClick及onLongClick的调用机制
    1.  onTouchEvent:

     onTouchEvent中要处理的最常用的3个事件就是:ACTION_DOWN(按下)、ACTION_MOVE(移动)、ACTION_UP(抬起)。
    

    2.  onClick、onLongClick与onTouchEvent

     在Android中,onClick、onLongClick的触发是和ACTION_DOWN及ACTION_UP相关的,在时序上,如果我们在一个View中同时覆写了onClick、onLongClick及onTouchEvent的话,onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。主要的逻辑在View.java中的onTouchEvent方法中实现的,主要的操作是在View.onTucchEvent下的:
    
           switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0;
                    if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) {
                        // take focus if we don't have it already and we should in
                        // touch mode.
                        boolean focusTaken = false;
                        if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
                            focusTaken = requestFocus();
                        }
    
                        if (prepressed) {
                            // The button is being released before we actually
                            // showed it as pressed.  Make it show the pressed
                            // state now (before scheduling the click) to ensure
                            // the user sees it.
                            setPressed(true, x, y);
                       }
    
                        if (!mHasPerformedLongPress) {
                            // This is a tap, so remove the longpress check
                            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 = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClick();
                                }
                            }
                        }
    
                        if (mUnsetPressedState == null) {
                            mUnsetPressedState = new UnsetPressedState();
                        }
    
                        if (prepressed) {
                            postDelayed(mUnsetPressedState,
                                    ViewConfiguration.getPressedStateDuration());
                        } else if (!post(mUnsetPressedState)) {
                            // If the post failed, unpress right now
                            mUnsetPressedState.run();
                        }
    
                        removeTapCallback();
                    }
                    break;
    
                case MotionEvent.ACTION_DOWN:
                    mHasPerformedLongPress = false;
    
                    if (performButtonActionOnTouchDown(event)) {
                        break;
                    }
    
                    // Walk up the hierarchy to determine if we're inside a scrolling container.
                    boolean isInScrollingContainer = isInScrollingContainer();
    
                    // For views inside a scrolling container, delay the pressed feedback for
                    // a short period in case this is a scroll.
                    if (isInScrollingContainer) {
                        mPrivateFlags |= PFLAG_PREPRESSED;
                        if (mPendingCheckForTap == null) {
                            mPendingCheckForTap = new CheckForTap();
                        }
                        mPendingCheckForTap.x = event.getX();
                        mPendingCheckForTap.y = event.getY();
                        postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
                    } else {
                        // Not inside a scrolling container, so show the feedback right away
                        setPressed(true, x, y);
                        checkForLongClick(0);
                    }
                    break;
    
                case MotionEvent.ACTION_CANCEL:
                    setPressed(false);
                    removeTapCallback();
                    removeLongPressCallback();
                    break;
    
                case MotionEvent.ACTION_MOVE:
                    drawableHotspotChanged(x, y);
    
                    // Be lenient about moving outside of buttons
                    if (!pointInView(x, y, mTouchSlop)) {
                        // Outside button
                        removeTapCallback();
                        if ((mPrivateFlags & PFLAG_PRESSED) != 0) {
                            // Remove any future long press/tap checks
                            removeLongPressCallback();
    
                            setPressed(false);
                        }
                    }
                    break;
    

    可以看到,Click的触发是在系统捕捉到ACTION_UP后发生并由performClick()执行的;LongClick的触发则是从ACTION_DOWN开始,由checkForLongClick()方法完成的;
    他们执行Touch事件的的顺序 ACTION_DOWN ->  ACTION_UP  ->  OnClick/OnLongClick。 

    首先,该View会先响应ACTION_DOWN事件,并返回一个boolean值,这里有两种判断:
    1. 返回true,表示该View接受此按下动作,就是说这个点击动作的按下操作被中止,然后就是响应ACTION_UP事件。点击动作的按下操作被ACTION_DOWN接受之后就结束了,所以之后的OnClick/OnLongClick事件就不会响应了。
    2. 返回false,表示该View不接受此按下动作,响应完之后,按下操作继续往下发,之后是响应ACTION_UP事件,这里又有一个判断:

     如果ACTION_UP事件返回true,表示ACTION_UP接受松开操作,松开操作中止;View会一直处于按下状态,之后View便会响应OnLongClick事件。
    
    如果ACTION_UP事件返回false,表示ACTION_UP不接收松开操作,松开操作继续下发;因为按下与松开操作都没有被中止,所以之后View就会响应OnClick事件。
    

    下面就是我在魅族中踩的坑了:

    手机在EditText长按进行粘贴,会触发OnLongClick 的事件,但是我在魅族的手机EditText长按进行粘贴,如果做了onTouchEvent监听,死活的都不会触发OnLongClick 的事件,不够onTouchEvent返回的是true还是false 都白费,当然也不会进行粘贴;其他的手机都是按照正常的节奏来,就只有魅族!
    找到问题了现在就是怎么去解决问题,这里我用到onTouchEvent 主要监听的是ACTION_MOVE 的处理,既然onTuchEvent不行就只有用其方式来监听滑动了,用到的是GestureDetector.SimpleOnGestureListener 进行监听的 :

    public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener {  
     // --------------OnGestureListener的接口有这几个----------------
     // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)  
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }
    
       // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 
        public void onLongPress(MotionEvent e) {
        }
    
      // 滚动,触摸屏按下后移动  
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            return false;
        }
    
      // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势  
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            return false;
        }
    
      // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 
        public void onShowPress(MotionEvent e) {
        }
        // 单击,触摸屏按下时立刻触发
        public boolean onDown(MotionEvent e) {
            return false;
        }
        //------------------------OnDoubleTapListener的接口有这几个-----------
      // 双击,手指在触摸屏上迅速点击第二下时触发  
        public boolean onDoubleTap(MotionEvent e) {
            return false;
        }
       // 双击的按下跟抬起各触发一次  
        public boolean onDoubleTapEvent(MotionEvent e) {
            return false;
        }
       // 单击确认,即很快的按下并抬起,但并不连续点击第二下  
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return false;
        }
    }
    

    于是我重写我的EditText 继承EditText:

    public class MyEditText extends EditText {
    private GestureDetector mGestureDetector;
    private SimpleOnGestureListener simpleOnGestureListener;
    private Context context;
    public MyEditText(Context context) {
        super(context);
        this.context = context;
        setLongClickable(true);
    }
    public void setMyGestureListener(SimpleOnGestureListener simpleOnGestureListener) {
        this.simpleOnGestureListener = simpleOnGestureListener;
        setGestureDetector();
    }
    
    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        setLongClickable(true);
        this.context = context;
    
    }
    
    private void setGestureDetector() {
        mGestureDetector = new GestureDetector(context, simpleOnGestureListener);
        this.setOnTouchListener(new OnTouchListener() {
    
            public boolean onTouch(View v, MotionEvent event) {
                return mGestureDetector.onTouchEvent(event);
            }
        });
    }
    

    }
    注意:

     1.这里一定要记得设置longClickable为true, 否则手势识别无法正确工作,只会返回Down, Show, Long三种手势
    

    2. 必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作

    最后这样就ok了:

            mTvEditContent.setMyGestureListener(new SimpleOnGestureListener() {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                // 处理我想做的
                return super.onScroll(e1, e2, distanceX, distanceY);
            }
        });
    

    Star 我的GitHub

    展开全文
  • 场景: 在实际开发中你可能需要把ListView中的onTouchEvent写在Activity中进行操作,或者是...这时候你会发现ListView的onTouchEvent事件有效,但是Activity的onTouchEvent事件却失效,这是为什么呢? 解决与分析:
  • 生效,直至起来的那一刻失效,这之间维持不变。 5. 如果一个 ACTION_DOWN 事件被父 View 拦截了,则任何子 View 不会再收到任何 Touch 事件了(这符合第 1 点的要求)。 6. 如果一个非 ACTION_DOWN ...
  • 针对于整个activity来说,监听整个activity的手势: ... public boolean onTouchEvent(MotionEvent event){ //int action= getActionMasked(event); int action= event.getAction(); switch (action){ ...
  • 前言:辞职也一周了,在家里宅了5天,找了两工作,找得人...现在开始走入正轨,继续我的研究,工作没找到也不能荒废学习,这里讲解dispatchKeyEvent,onTouchEvent,onInterceptTouchEvent这个三个方法 ————再
  • 最显著的区别为onTouchListener的接口的优先级是要高于onTouchEvent 也就是说,如果ontouchlistener中的ontouch方法返回了true,就说明本次的触摸事件已经被消费了。比ontouchlistener优先级低的ontouchevent就收不...
  • 解决方案:onTouchEvent回调添加super方法 override fun onTouchEvent(event: MotionEvent): Boolean { //XXXXXX 处理逻辑 super.onTouchEvent(event) return true }
  • 其实这不是一个很难的问题,发现这个问题后想当然的百度一波,大多数文章都是说将onTouchEvent函数的返回值改成true,以此来接收后续事件,试了下发现并不管用,这个关键点在于你自定义的是view还是viewGroup,如果...
  • 自定义View中重写onTouchEvent后设置点击监听无效冲突解决问题代码分析第一次修改后代码最终代码 第一次写博客,还是有点小激动的! 今天自定义View时,出现了个小问题。就是,我在继承自定义的View中重写了...
  • onTouchEvent,dispatchTouchEvent,这两个方法里面偶尔无法正常监听。 猜测是有控件抢占了onTouch事件,导致列表的 ``` ACTION_TOUCH ``` 无法监听 ,有大神知道解决方法吗
  • 一:前言 ...当一个View接收到了触碰事件时,会调用其onTouchEvent方法.方法声明如下: /** * Implement this method to handle touch screen motion events. * * @param event The motion event.
  • 自定义的view重写了onTouchEvent方法后,还想要响应onClick方法的话,最好在up事件里调用一下performClick()方法。 参考:https://www.jianshu.com/p/7d1e773d9955
  • 本文我首发于简书,但是简书界面太小...public boolean onTouchEvent(MotionEvent event) { final float x = event.getX();//触摸点x坐标 final float y = event.getY();//触摸点y坐标 final int viewFlags = mView
  • listview onListItemClick 失效解决方案

    千次阅读 2014-02-12 18:12:08
    查看Android源代码,查看源代码,发现在AbsListView.onTouchEvent中有调用View.hasFocusable(),所以只要设置button属性:  Xml代码 android:focusable="false" 另外还要设置  Xml代码
  • 先讲 dialog的setOnKeyListener的监听key手机返回键 tipsDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {    @Override ... public boolean ...看看构造函数里面必须要写不然按键失效
  • 1、体验与发现首先看一下代码:@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getActionMasked()) {case MotionEvent.ACTION_DOWN:Log.i(TAG, "viewSizeHandle: down"+event.getAction...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,555
精华内容 622
关键字:

ontouchevent失效