Android开发ScrollView上下左右滑动事件冲突整理一(根据事件)
主要通过重写 onInterceptTouchEvent 事件来解决,代码如下:
- package com.cm.android.pad.view.itemView;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.DisplayMetrics;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.VelocityTracker;
- import android.view.ViewConfiguration;
- import android.view.WindowManager;
- import android.widget.ScrollView;
- import android.widget.Scroller;
- public class MultiScroll extends ScrollView {
- private static final int ANIMATION_SCREEN_SET_DURATION_MILLIS = 500;
- // What fraction (1/x) of the screen the user must swipe to indicate a page change
- private static final int FRACTION_OF_SCREEN_WIDTH_FOR_SWIPE = 4;
- private static final int INVALID_SCREEN = -1;
- /*
- * Velocity of a swipe (in density-independent pixels per second) to force a swipe to the
- * next/previous screen. Adjusted into mDensityAdjustedSnapVelocity on init.
- */
- private static final int SNAP_VELOCITY_DIP_PER_SECOND = 600;
- // Argument to getVelocity for units to give pixels per second (1 = pixels per millisecond).
- private static final int VELOCITY_UNIT_PIXELS_PER_SECOND = 1000;
- private static final int TOUCH_STATE_REST = 0;
- private static final int TOUCH_STATE_HORIZONTAL_SCROLLING = 1;
- private static final int TOUCH_STATE_VERTICAL_SCROLLING = -1;
- private int mCurrentScreen;
- private int mDensityAdjustedSnapVelocity;
- private boolean mFirstLayout = true;
- private float mLastMotionX;
- private float mLastMotionY;
- //private OnScreenSwitchListener mOnScreenSwitchListener;
- private int mMaximumVelocity;
- private int mNextScreen = INVALID_SCREEN;
- private Scroller mScroller;
- private int mTouchSlop;
- private int mTouchState = TOUCH_STATE_REST;
- private VelocityTracker mVelocityTracker;
- private int mLastSeenLayoutWidth = -1;
- public MultiScroll(Context context) {
- super(context);
- init();
- }
- public MultiScroll(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- init();
- }
- public MultiScroll(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mScroller = new Scroller(getContext());
- // Calculate the density-dependent snap velocity in pixels
- DisplayMetrics displayMetrics = new DisplayMetrics();
- ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
- .getMetrics(displayMetrics);
- mDensityAdjustedSnapVelocity =
- (int) (displayMetrics.density * SNAP_VELOCITY_DIP_PER_SECOND);
- final ViewConfiguration configuration = ViewConfiguration.get(getContext());
- mTouchSlop = configuration.getScaledTouchSlop();
- mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
- }
- @Override
- public boolean onInterceptTouchEvent(final MotionEvent ev) {
- /*
- * By Yoni Samlan: Modified onInterceptTouchEvent based on standard ScrollView's
- * onIntercept. The logic is designed to support a nested vertically scrolling view inside
- * this one; once a scroll registers for X-wise scrolling, handle it in this view and don't
- * let the children, but once a scroll registers for y-wise scrolling, let the children
- * handle it exclusively.
- */
- final int action = ev.getAction();
- boolean intercept = false;
- switch (action) {
- case MotionEvent.ACTION_MOVE:
- /*
- * If we're in a horizontal scroll event, take it (intercept further events). But if
- * we're mid-vertical-scroll, don't even try; let the children deal with it. If we
- * haven't found a scroll event yet, check for one.
- */
- if (mTouchState == TOUCH_STATE_HORIZONTAL_SCROLLING) {
- // Let children handle the events for the duration of the scroll event.
- intercept = false;
- } else if (mTouchState == TOUCH_STATE_VERTICAL_SCROLLING) {
- /*
- * We've already started a horizontal scroll; set intercept to true so we can
- * take the remainder of all touch events in onTouchEvent.
- */
- intercept = true;
- } else { // We haven't picked up a scroll event yet; check for one.
- /*
- * If we detected a horizontal scroll event, start stealing touch events (mark
- * as scrolling). Otherwise, see if we had a vertical scroll event -- if so, let
- * the children handle it and don't look to intercept again until the motion is
- * done.
- */
- final float x = ev.getX();
- final int xDiff = (int) Math.abs(x - mLastMotionX);
- boolean xMoved = xDiff > mTouchSlop;
- final float y = ev.getY();
- final int yDiff = (int) Math.abs(y - mLastMotionY);
- boolean yMoved = yDiff > mTouchSlop;
- if (xMoved) {
- // Scroll if the user moved far enough along the X axis
- if(xDiff>=yDiff)
- mTouchState = TOUCH_STATE_HORIZONTAL_SCROLLING;
- mLastMotionX = x;
- }
- if (yMoved) {
- if(yDiff>xDiff)
- mTouchState = TOUCH_STATE_VERTICAL_SCROLLING;
- mLastMotionY = y;
- }
- }
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- // Release the drag.
- mTouchState = TOUCH_STATE_REST;
- intercept = false;
- break;
- case MotionEvent.ACTION_DOWN:
- /*
- * No motion yet, but register the coordinates so we can check for intercept at the
- * next MOVE event.
- */
- //Log.i("ViewPager-->", "Action_Down");
- mTouchState = TOUCH_STATE_REST;
- mLastMotionY = ev.getY();
- mLastMotionX = ev.getX();
- break;
- default:
- break;
- }
- Log.i("MultiScroll-->", intercept+"");
- return intercept;
- }
- }
Android开发ScrollView上下左右滑动事件冲突整理一(根据事件)的更多相关文章
- Android开发之手势滑动(滑动手势监听)详解
Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...
- Android 自定义ScrollView的滑动监听事件
项目结构: 1.LazyScrollView类(自定义ScrollView) package android.zhh.com.myapplicationscrollview; /** * Create ...
- Android开发之源码:多次点击事件的原理和实现
多次点击事件 多次点击事件原理:最后一次点击事件与第一次点击事件的时间间隔是否小于某个时间,当小于的时候,就认为这是一个多次点击事件. Android源码实现效果: import android.ap ...
- android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法
1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...
- JS 事件冒泡整理 浏览器的事件流
JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...
- Android开发(十九)——ViewFlipper中的onClick事件和onFling事件冲突
在onDown中设置this.flipper.setClickable(true); 然后在onFling方法中this.flipper.setClickable(false); ps: 其中setO ...
- Android监测手指上下左右滑动屏幕
在开发android程序时,有时会需要监测手指滑动屏幕,当手指朝上下左右不同方向滑动时做出不同的响应,那怎么去实现呢? 利用Android提供的手势监测器就可以很方便的实现,直接上代码(已测试通过) ...
- android开发学习 ------- 自定义View 圆 ,其点击事件 及 确定当前view的层级关系
我需要实现下面的效果: 参考文章:https://blog.csdn.net/halaoda/article/details/78177069 涉及的View事件分发机制 https://www. ...
- Android开发--ScrollView的应用
1.简介 当内容无法全部显示时,需要采取滚动的方式获取其与内容.其中,ScrollView为垂直滚动控件,HorizontalScrollView为水平滚动控件. 2.构建
随机推荐
- WIN10 搜索功能无法搜索本地应用
原因是使用360卫士此类软件把windows search 服务给禁掉了. 解决方案很简单,就是把windows search 服务重新设置成自启动,并立刻启动,就ok了. 至于如何打开服务组件,可以 ...
- NandFlash
一.概述 1.NandFlash NAND结构能提供极高的单元密度,可以达到高存储密度,比如能达到256M,并且写入和擦除的速度也很快.应用NAND的困难在于flash的管理需要特殊的系统接口. 2. ...
- php开发入门教程
LAMP window:WAMP(windows,apache,mysql,php) LAMP是 Linux,Apache,MySQL和PHP的缩写,是我们提供 Web 服务的软件基础. 对于 Lin ...
- House of hello恶搞凯莉迷你包
欧洲站 House of hello恶搞凯莉迷你包 最近淘宝卖的很疯,看看价格,俺咂舌不已 :1300-1600 今年迷你包卖的很疯我是知道的,迷你包今年没有买一个也是不行的! 剔除暴利,便宜的亲们不 ...
- Apache Maven 入门篇(下)
第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下去的一步是要了解maven的核心概念,这样才能在使用maven的时 ...
- [BZOJ 1033] [ZJOI2008] 杀蚂蚁antbuster 【模拟!】
题目链接: BZOJ - 1033 题目分析 模拟!纯粹按照题目描述模拟! 这是一道喜闻乐见的经典模拟题! 我一共写了2遍,Debug 历时2天的所有晚自习 ... 时间超过 8h ... 我真是太弱 ...
- unity3d中的http通信 二
转载自 http://www.cnblogs.com/88999660/archive/2013/03/11/2954279.html 如果侵权,请及时通知我删除! using System; usi ...
- keil uVision4一些使用总结(汉字注释,C关键字等)
近日心血来潮,下载了最新的版的keil,再加上protues ,想弄个虚拟环境.主要原因还是经济问题.电子元件,是要花钱的... 今天遇到些keil uVision 4使用方面的问题,记录下来,方便以 ...
- Struts2 权限验证
之前的Struts2项目通过再Sitemesh的母版页中使用Struts的if标签进行了session判断,使得未登录的用户不能看到页面,但是这 种现仅仅在view层进行,如果未登录用户直接在地址栏输 ...
- Microsoft Office 2013 激活方法
Microsoft Office 2013 激活方法 Microsoft Office 2013是微软的新一代Office办公软件,全面采用Metro界面,包括Word.PowerPoint.Ex ...