ScrollView滑动到底部或顶部后,再继续滑动达到一定距离的监听;

ScrollView滑动到底部或顶部的监听;


/**
* 监听ScrollView滚动到顶部或者底部做相关事件拦截
*/
public class ContinueSlideScrollView extends ScrollView { private boolean isScrolledToTop = true;// 初始化的时候设置一下值
private boolean isScrolledToBottom = false;
private Context context; private ISmartScrollChangedListener mSmartScrollChangedListener; public ContinueSlideScrollView(Context context) {
super(context);
this.context = context;
} public ContinueSlideScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
} public ContinueSlideScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
} /**
* 滑动到顶部或底部的监听接口
* */
public interface ISmartScrollChangedListener {
void onScrolledToBottom();
void onScrolledToTop();
} public void setScanScrollChangedListener(ISmartScrollChangedListener smartScrollChangedListener) {
mSmartScrollChangedListener = smartScrollChangedListener;
} @Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (scrollY == 0) {
isScrolledToTop = clampedY;
isScrolledToBottom = false;
} else {
isScrolledToTop = false;
isScrolledToBottom = clampedY;
}
notifyScrollChangedListeners();
} @Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (android.os.Build.VERSION.SDK_INT < 9) { // API 9及之后走onOverScrolled方法监听
if (getScrollY() == 0) {
isScrolledToTop = true;
isScrolledToBottom = false;
} else if (getScrollY() + getHeight() - getPaddingTop()-getPaddingBottom() == getChildAt(0).getHeight()) {
isScrolledToBottom = true;
isScrolledToTop = false;
} else {
isScrolledToTop = false;
isScrolledToBottom = false;
}
notifyScrollChangedListeners();
}
} private void notifyScrollChangedListeners() {
if (isScrolledToTop) {
if (mSmartScrollChangedListener != null) {
mSmartScrollChangedListener.onScrolledToTop();
}
} else if (isScrolledToBottom) {
if (mSmartScrollChangedListener != null) {
mSmartScrollChangedListener.onScrolledToBottom();
}
}
} public boolean isScrolledToTop() {
return isScrolledToTop;
} public boolean isScrolledToBottom() {
return isScrolledToBottom;
} /**
* 继续滑动的代码
*/
private float down,move;
private boolean isExecute = false; //是否要执行
private int TRIGGER_DISTANCE = 160; //继续滑动效果触发间距 dp
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
down = ev.getY();
isExecute = true;
break;
case MotionEvent.ACTION_MOVE:
move = ev.getY(); if (isExecute && isScrolledToTop() && move - down > dp2px(context,TRIGGER_DISTANCE)){
isExecute = false;
Log.i("ccb", "onTouchEvent: 回到顶部,继续滑动"+(move - down));
if (continueSlide != null)continueSlide.onContinueSlideTop();
}
if (isExecute && isScrolledToBottom() && move - down < (-dp2px(context,TRIGGER_DISTANCE))){
isExecute = false;
Log.i("ccb", "onTouchEvent: 已经到底,继续滑动"+((move - down)));
if (continueSlide != null)continueSlide.onContinueSlideBottom();
}
break;
case MotionEvent.ACTION_UP:
isExecute = true;
move = 0;
down = 0 ;
break;
}
return super.onTouchEvent(ev);
} /**
* 滑动到顶部或底部继续滑动到一定距离触发
*/
public interface onContinueSlide{
void onContinueSlideTop();
void onContinueSlideBottom();
} public onContinueSlide continueSlide; public void setonContinueSlideListener(onContinueSlide continueSlide){
this.continueSlide = continueSlide;
} /**
* dip转换px
*/
public static int dp2px(Context content, int dip) {
final float scale = content.getResources().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f);
}
}

实现了一下,仿淘宝从商品页继续上拉进入商品详情页的效果:https://github.com/CuiChenbo/DoubleFragmentSwitch

ScrollView滑动到底部或顶部监听,ScrollView滑动到底部或顶部再继续滑动监听;的更多相关文章

  1. Android中监听ScrollView滑动停止和滑动到底部

    1.监听ScrollView滑动停止: /********************监听ScrollView滑动停止*****************************/ scrollView.s ...

  2. Android监听ScrollView滑动到顶端和底部

    Android监听ScrollView滑动到顶端和底部     package cn.testscrollview; import android.os.Bundle; import android. ...

  3. Android 监听 ScrollView 滑动到最底部。

    做产品时,有一个需求,需要监听ScrollView滑动到最底部.在网上找了些方法,都有这样或那样的问题,要不就是监听不精确, 要不就是重复监听,那些代码没有产品化,很不可靠. 经过自己试验,终于找到了 ...

  4. 滑动到底部或顶部响应的ScrollView实现

    关于使用可见:滚动到底部或顶部响应的ScrollView使用 示例APK可从这些地址下载:Google Play,  360手机助手,  百度手机助手,  小米应用商店,  豌豆荚 两种实现方式的主要 ...

  5. Scrollview总结:滑动问题、监听Scrollview实现头部局改变

    ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View. ScrollView的简单介绍 Scrol ...

  6. android ListView滚动条监听判断滚动到底部还是顶部

    代码: lv.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView vie ...

  7. ios监听ScrollView/TableView滚动的正确姿势

    主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scr ...

  8. oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序

    15511477451 原文 oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序? 环境:win7 64位系统.oracle11g数据库 问题描述:在win7 64位系统 ...

  9. 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务 然后重新运行 em configuration assistant。

    在WIN 7/64Bit上安装ORACLE 11gR2后,管理网页Database Control(如:https://localhost:1158/em)始终登录不进去,总是说密码错误,使用配置工具 ...

随机推荐

  1. 数组去重复的时候遇到length变成1 的bug

    arrUnique:function(arr){ //传入空数组的时候有bug,length会变成1 所以修复下 if(arr.length == 0){ return []; } arr.sort( ...

  2. learning makeflie wildward character

    “?”             匹配一个任意字符 “*”                匹配0个或任意多个字符,也就是可以匹配任何内容 “[]”       匹配中括号中任意一个字符.例如:[abc] ...

  3. 正确学习Linux系统的5个建议

    摘要: 最近几年Linux系统应用越来越广泛,以至于很多人开始热衷学习Linux.但是我们都是从小都是学习windows系统长大的,从windows 98到现在的windows 10,而根据学习win ...

  4. win10 ssd 卡顿

    http://www.pconline.com.cn/win10/739/7395324.html

  5. MegaCli 简易使用介绍

    查看帮助 MegaCli64 -h 适配卡配置 查看RAID控制器的数量 MegaCli64 -adpCount 查看所有raid卡详细信息 MegaCli64 -AdpAllInfo -aALL 查 ...

  6. JAVA循环结构

    JAVA循环结构:顺序结构只能执行一次,如果要执行多次需要用到循环 JAVA中的循环结构有while:do...while:for: 1.while循环:先判断布尔表达式中的值,若为true,执行循环 ...

  7. windows环境搭建Vue开发环境

    一.安装node.js(https://nodejs.org/en/) 下载完毕后,可以安装node,建议不要安装在系统盘(如C:). 二.设置nodejs prefix(全局)和cache(缓存)路 ...

  8. echarts.init 使用jq获取初始化对象

    var myChart = echarts.init($('#main')[0]);// 或者var myChart = echarts.init($('#main').get(0));

  9. 复现 360 Unicorn Team 黑科技之 HackNFC

    看了2条360 Unicorn Team的微博后,感觉蛮有趣的,打算复现一下 谷歌了下相关资料,在HACKADAY找到了介绍文章 还有2篇北邮工学硕士的论文,欢迎有兴趣的朋友和我一起交流~ 联系方式在 ...

  10. redis设置过期时间