Android 滑动拦截实例代码解析

废话不多说了,直接给大家贴代码了,具体代码如下所示:

 package demo.hq.com.fby;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
/**
 * Created by huqing on 2016/12/7.
 * 思路:
 * 分内外部拦截
 * 在父布局中,onInterceptTouchEvent先判断是否拦截滑动,true 拦截 直接进入父布局的onTouch方法 ;false 进入子布局的onTouch方法
 */
public class MyParentView extends LinearLayout
{
  /**
   * 每向下Move移动的距离
   */
  private int mMove;
  /**
   * 落下点的位置
   */
  private int yDown;
  /**
   * 移动点的位置
   */
  private int yMove;
  /**
   * 一共向下挪动的距离
   */
  private int downDistance = 0;
  public MyParentView(Context context, AttributeSet attrs)
  {
    super(context, attrs);
  }
  boolean intercept = false;
  /**
   * 外部拦截,
   * 如果是向下滑动 则为true,交给该控件处理,向上false就交给子控件处理吧
   * 所以向上的事件 子控件都能获取到的
   *
   * @param ev
   * @return
   */
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev)
  {
    switch (ev.getAction())
    {
      case MotionEvent.ACTION_DOWN:
        yDown =(int) ev.getY();
        break;
      case MotionEvent.ACTION_MOVE:
        yMove = (int) ev.getY();
        if (yMove > yDown)
        {
          intercept = true;
          Log.d("hqq", "拦截~~~~~~~~~~~~~~~~~~");
        }
        else if (yMove < yDown)
        {
          intercept = false;
          Log.d("hqq", "不拦截~~~~~~~~~~~~~~~~~~");
        }
        break;
      case MotionEvent.ACTION_UP:
        break;
    }
    //true 拦截,进入该控件的onTouchEvent方法 false:进入子控件的OnTouchEvent
    boolean returnInterCept = intercept;
    intercept = false;
    return returnInterCept;
  }
  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    Log.e("hq", "father onTouch");
    int y = (int) event.getY();
    switch (event.getAction())
    {
      case MotionEvent.ACTION_DOWN:
        yDown = y;
        break;
      case MotionEvent.ACTION_MOVE:
        if (downDistance>=250){
        }else {
          yMove = y;
          if (yMove - yDown > 0)
          {
            mMove = yMove - yDown;
            downDistance += mMove;
            if (downDistance>=250){
              layout(getLeft(),downDistance, getRight(), getHeight() + downDistance);
            }else {
              layout(getLeft(), getTop() + mMove, getRight(), getBottom() + mMove);
            }
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        layout(getLeft(), getTop() - downDistance, getRight(), getBottom() - downDistance);
        downDistance = 0;
        break;
    }
    return true;//    return super.onTouchEvent(event);
  }
}
package demo.hq.com.fby;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
 * Created by huqing on 2016/12/7.
 */
public class MyScrollView extends ScrollView
{
  public MyScrollView(Context context, AttributeSet attrs)
  {
    super(context, attrs);
  }
  @Override
  public boolean onTouchEvent(MotionEvent ev)
  {
    Log.e("hq","child onTouch----------------");
    switch (ev.getAction()){
      case MotionEvent.ACTION_DOWN:
        getParent().requestDisallowInterceptTouchEvent(true);
        break;
      case MotionEvent.ACTION_MOVE:
        if (getScrollY()==0){//ScrollView没有滑动时 ,即滑动高度没变化的话就允许父控件拦截
          getParent().requestDisallowInterceptTouchEvent(false);
        }else {//禁止拦截
          getParent().requestDisallowInterceptTouchEvent(true);
        }
        break;
    }
    return super.onTouchEvent(ev);
  }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  android:id="@+id/activity_main"
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/bg"
  tools:context="demo.hq.com.fby.MainActivity">
  <demo.hq.com.fby.MyParentView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="100dp"
      android:text=" World!"/>
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="100dp"
      android:text=" World!"/>
    <demo.hq.com.fby.MyScrollView android:layout_width="match_parent"
                   android:layout_height="wrap_content">
      <LinearLayout android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical">
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="200dp"
          android:text="Hello World!"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="200dp"
          android:text="Hello World!"/>
      </LinearLayout>
    </demo.hq.com.fby.MyScrollView>
  </demo.hq.com.fby.MyParentView>
</RelativeLayout>

以上所述是小编给大家介绍的Android 滑动拦截实例代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android实现图片左右滑动效果

    关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来就让我们开始实现这种效果. 接下来我们看一下程序结构图: MainActivity文件中代码: package com.android.flip; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import andro

  • android短信拦截的实现代码

    短信拦截的实现主要是使用了广播接收者来实现. BroadcastReceiver  广播接收者   必须指定要接收的广播类型.必须明确的指定action 广播:事件.普通广播: 是异步的.会广播接收者同时接收,不能被中断sendBroadcast()有序广播: 是同步的.会根据广播接收的优先级进行接收,是可以中断   短信到来广播 sendOrderBroadcast()priority的范围是:-1000 ~ 1000如果有序广播明确的指定了广播接收者,他是无法被中断的. 代码实现如下: 1.

  • Android的OkHttp包中的HTTP拦截器Interceptor用法示例

    OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去.例如: 1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容. 2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去. 在 okHttp 中分成 Application Interceptor 和 Network Interceptor 两种. A

  • Android开发四大组件之实现电话拦截和电话录音

    一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断. 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二.加入AIDL文件 Android没有对外

  • Android编程实现拦截短信并屏蔽系统Notification的方法

    本文实例讲述了Android编程实现拦截短信并屏蔽系统Notification的方法.分享给大家供大家参考,具体如下: 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission android:name="android.permission.RECEIVE_SMS"> </uses-permission> <uses-p

  • Android实现图片自动轮播并且支持手势左右无限滑动

    废话不多说了,先给大家上左右无限滑动的代码了. 1.左右无限滑动 public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //图片资源,实际项目需要从网络获取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawab

  • Android使用ViewPager实现无限滑动效果

    前言 其实仔细想一下原理还是挺简单的.无非是当我们滑动到最后一页,再向后滑动时定位到第一页;当我们滑动到第一页,再向前滑动时定位到最后一页. 但是,相信很多朋友都遇到过这个问题:视图的过度效果不自然. 小编也是通过百度和谷歌查找了很多解决方案,实验了很多方法,总结了一个相对不错的方法,接下来给各位分享下滑动效果.实现细节以及一些踩过的坑. 1.无限滑动效果(左右无限滑动) 事先准备好2张滑动图片(有想试验的小伙伴,自备图片啊,小编就不提供了...) 运行效果图(左右无限循环): 为了显示更加直观

  • Android拦截外拨电话程序示例

    拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给拔号广播接收者的电话号码,在拔号广播接收者接收到该广播时,由于电话号码为null,因此取消电话拔打. 复制代码 代码如下: Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:110"));               

  • Android 滑动拦截实例代码解析

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by huqing on 2016/12/7.

  • Android 模拟新闻APP显示界面滑动优化实例代码

    内容: 1.滑动优化(滑动时不加载图片,停止才加载) 2.第一次进入时手动加载 代码如下: 1.界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:

  • Android利用ZXing扫描二维码的实例代码解析

    相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的 看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle

  • Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • Android 中图片和按钮按下状态变化实例代码解析

    1.图片设置背景选择器,以便点按或设置选中与否,背景切换 res/drawable/selector_settings_item_back.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused

  • InputFilter实现EditText文本输入过滤器实例代码解析

    EditText是Android的文本输入框控件,这地球人应该都知道的了,但是默认的EditText是无所不能输入的,有时候我们需要设计一 款软件,而且是给小孩子使用的,而且需要屏蔽以下未成年人所不能涉及的内容,也就是屏蔽某些所不能输入的文字的时候,该如何做呢? 其实Android的SDK早已经为我们想过这个问题了,它为我们提供了一个叫做InputFilter的东西,通过它我们可以轻松的设计一个过滤器,用于屏蔽用户的某些输入,或者将输入改成某些良性的内容,从而解决了以上的问题. 实现InputF

  • AngularJs表单验证实例代码解析

    常用的表单验证指令如下详情: 1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2. 最小长度 验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3.

  • 基于Angular.js实现的触摸滑动动画实例代码

    先上图: 这个主要用到是angular-touch.js中封装好的ng-swipe-left,ng-swipe-right,向左或向右的触摸事件.结合css3的transition实现的动画.ng-class为切换写好的动画的className. <!DOCTYPE HTML> <html ng-app="myapp"> <head> <meta http-equiv="content-type" content="

  • JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

    最近做了个项目,其中有项目需求是要实现跑马灯抽奖效果,实现此功能主要用到js相关知识,废话不多说,感兴趣的朋友可以阅读下全文. 开始之前先来看上篇文章遗漏的两个问题和几个知识点,是自己重构的过程中需要用到的: 1.移动端1px像素线的问题 对于设计师给我的手机端网页的设计稿都是2倍图.按照道理来说,在写网页的时候,所有对象的实际尺寸都是会除2.但是对于1像素的线呢? 先来看两张图,设计稿的效果: 在三星 S4下的实际显示效果: 可以看到这个时候1px的线竟然显示不出来了.这个问题是跟 S4手机的

  • Java之Spring注解配置bean实例代码解析

    前面几篇均是使用xml配置bean,如果有上百个bean,这是不可想象的.故而,请使用注解配置bean !!! [1]注解类别 @Component : 基本注解, 标识了一个受 Spring(点击这里可以下载<Spring应用开发完全手册>) 管理的组件 @Repository : 标识持久层组件 @Service : 标识服务层(业务层)组件 @Controller : 标识表现层组件 Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件. 对于扫描到的组

随机推荐