当前位置: 首页 > 编程笔记 >

Android 滑动拦截实例代码解析

韦繁
2023-03-14
本文向大家介绍Android 滑动拦截实例代码解析,包括了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 滑动拦截实例代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 本文向大家介绍vue axios请求拦截实例代码,包括了vue axios请求拦截实例代码的使用技巧和注意事项,需要的朋友参考一下 axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请

  • 本文向大家介绍vue+axios实现登录拦截的实例代码,包括了vue+axios实现登录拦截的实例代码的使用技巧和注意事项,需要的朋友参考一下 一个项目学会vue全家桶+axios实现登录、拦截、登出功能,以及利用axios的http拦截器拦截请求和响应。 前言 该项目是利用了Github 提供的personal token作为登录token,通过token访问你的Repository List。

  • 本文向大家介绍Struts拦截器实现拦截未登陆用户实例解析,包括了Struts拦截器实现拦截未登陆用户实例解析的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Struts拦截器实现拦截未登陆用户,具体实现如下。 首先建立一个工具类: checkPrivilegeInterceptor:这个类继承interceptor,这是一个接口,要实现三个方法,要是觉得比较多的话,可以继承他的实现类A

  • 本文向大家介绍解决拦截器对ajax请求的拦截实例详解,包括了解决拦截器对ajax请求的拦截实例详解的使用技巧和注意事项,需要的朋友参考一下 解决拦截器对ajax请求的的拦截 拦截器配置: 1、判断 String XRequested =request.getHeader("X-Requested-With") 的值,目的是判断是否是ajax请求。 2、response.getWriter().wr

  • 本文向大家介绍SpringMVC中的拦截器详解及代码示例,包括了SpringMVC中的拦截器详解及代码示例的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下。 Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。本文主要总结一下springmvc中拦截器是如何定义

  • 本文向大家介绍springboot aspect通过@annotation进行拦截的实例代码详解,包括了springboot aspect通过@annotation进行拦截的实例代码详解的使用技巧和注意事项,需要的朋友参考一下 annotation就是注解的意思,在我们使用的拦截器时,可以通过业务层添加的某个注解,对业务方法进行拦截,之前我们在进行统一方法拦截时使用的是execution,而注解的