android 锁定ScrollView 使其滑到一定程度不能滑动

界面中局部(部分)区域嵌套滑动 界面中,部分区域(局部)可以滑动,滑动到一定程度后,该区域内的子布局可以继续滑动 阅读详情

Scroller学习

1) scrollTo 和 scrollBy

View自带的两个方法

左加右减,上加下减

2) 平滑效果,使用Scroller

  1. 创建Scroller的实例
  2. 调用startScroll()方法来初始化滚动数据并刷新界面
  3. 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑

3) 案例:ScrollView滑到一定位置不能锁定不能滑动了

package com.abilix.learn.dashpinyinisland1.view;

import android.content.Context;
import android.support.v4.view.ViewConfigurationCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.ScrollView;
import android.widget.Scroller;

/**
 * Created by yanghd on 2017/6/9.
 */

public class SlowScrollView extends ScrollView {

    private Scroller mScroller;

    public SlowScrollView(Context context) {
        this(context,null);
    }

    public SlowScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 第一步,创建Scroller的实例
        mScroller = new Scroller(context);
        setUpBorder(2000);
        ViewConfiguration configuration = ViewConfiguration.get(context);
        // 获取TouchSlop值
        mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
    }

    public SlowScrollView(Context context, AttributeSet attrs, int defStyle) {
        this(context, attrs);

    }

    //调用此方法滚动到目标位置  duration滚动时间
    public void smoothScrollToSlow(int fx, int fy, int duration) {
        int dx = fx - getScrollX();//mScroller.getFinalX();  普通view使用这种方法
        int dy = fy - getScrollY();  //mScroller.getFinalY();
        smoothScrollBySlow(dx, dy, duration);
    }

    //调用此方法设置滚动的相对偏移
    public void smoothScrollBySlow(int dx, int dy, int duration) {

        //设置mScroller的滚动偏移量
        mScroller.startScroll(getScrollX(), getScrollY(), dx, dy, duration);//scrollView使用的方法(因为可以触摸拖动)
//        mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy, duration);  //普通view使用的方法
        invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
    }

    @Override
    public void computeScroll() {

        //先判断mScroller滚动是否完成
        if (mScroller.computeScrollOffset()) {

            //这里调用View的scrollTo()完成实际的滚动
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

            //必须调用该方法,否则不一定能看到滚动效果
            postInvalidate();
        }
        super.computeScroll();
    }

    /**
     * 滑动事件,这是控制手指滑动的惯性速度
     */
    @Override
    public void fling(int velocityY) {
        super.fling(velocityY / 400);
    }


    // -------------------  新增方法  ------------------
    /**
     * 手机当时所处的屏幕坐标
     */
    private float mYMove;

    /**
     * 上次触发ACTION_MOVE事件时的屏幕坐标
     */
    private float mYLastMove;

    /**
     * 界面可滚动的上边界
     */
    private int upBorder;

    /**
     * 手机按下时的屏幕坐标
     */
    private float mYDown;

    /**
     * 判定为拖动的最小移动像素数
     */
    private int mTouchSlop;

/*    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN:
                mYDown = ev.getRawY();
                mYLastMove = mYDown;
                Log.d("SlowScrollView", "拦截Down");
                break;

            case MotionEvent.ACTION_MOVE:
                mYMove = ev.getRawY();
                float diff = Math.abs(mYMove - mYDown);
                mYLastMove = mYMove;
                // 当手指拖动值大于TouchSlop值时,认为应该进行滚动,拦截子控件的事件
                if (diff > mTouchSlop) {
                    Log.d("SlowScrollView", "diff:" + diff);
                    Log.d("SlowScrollView", "mTouchSlop:" + mTouchSlop);
                    Log.d("SlowScrollView", "拦截Move");
                    return true;
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }*/

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {

            case MotionEvent.ACTION_MOVE:
                Log.d("SlowScrollView", "执行Move");
                mYMove = event.getRawY();
                int scrolledY = (int) (mYLastMove - mYMove);
                if (getScrollY() + scrolledY < upBorder) {
                    scrollTo(0, upBorder);
                    return true;
                }
                scrollBy(scrolledY, 0);
                mYLastMove = mYMove;
                break;

            case MotionEvent.ACTION_UP:
                Log.d("SlowScrollView", "执行Up");
/*                // 当手指抬起时,根据当前的滚动值来判定应该滚动到哪个子控件的界面
                int targetIndex = (getScrollX() + getWidth() / 2) / getWidth();
                int dx = targetIndex * getWidth() - getScrollX();
                // 第二步,调用startScroll()方法来初始化滚动数据并刷新界面
                mScroller.startScroll(getScrollX(), 0, dx, 0);
                invalidate();*/
                break;
        }
        return super.onTouchEvent(event);
    }

    public void setUpBorder(int upBorder) {
        this.upBorder = upBorder;
    }

}

其实可以直接不重写 onInterceptTouchEvent 方法;

ViewPager禁止滑动和修改滑动速度 1. 简介 2. ViewPager 禁止滑动 3. ViewPager 的scroller 4. 参考 阅读详情

相关推荐

Android控件NestedScrollView用法

NestedScrollView 是 Android 开发中处理复杂滚动场景的强大工具,特别适合需要嵌套可滚动视图的界面设计。合理使用可以显著提升用户体验和应用性能。

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 333

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.androi...

weixin_38170853的博客 392

MATLAB 设置legend加标题

x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon

早起CaiCai的学习空间 4713

Android修行手册 - NestedScrollView

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)

空名先生 8079

基于MicroBlaze与LWIP的FPGA以太网通信实战指南

本文详细介绍了基于MicroBlaze软核处理器与LWIP协议栈的FPGA以太网通信实现方案。通过Vivado工具链配置硬件设计,结合LWIP轻量级TCP/IP协议栈优化,提供高效、低成本的嵌入式网络解决方案,适用于工业控制等场景。文章包含硬件设计、软件配置及常见问题排查等实战指南。

weixin_29290863的博客 532

单粒子翻转对FPGA的影响及解决方法

单粒子翻转对FPGA的影响及解决方法

航天领域资深码农,型号经验丰富,一线干货分享 2445

Android开发自定义ListView解决在NestedScrollView里不能用listview的问题(ScrollView嵌套ListView的问题)

前几天想玩一玩AppBarLayout,没想到遇到在NestedScrollView里不能用listview的问题,即结果无论如何都只能显示一行数据,终于解决了。 想一想,其实这也是在ScrollView嵌套ListView的问题。 怕自己忘了,还是写成博客吧。。。。 public class MyListView extends ListView { public MyListV

talentclass_ctt的博客 4181

C#与数据采集卡集成开发全指南:从硬件连接到实时数据处理(附工业传感器监测实战)

C#数据采集卡集成开发指南 本文系统介绍了不同类型数据采集卡(DAQ卡)与C#的集成方法。主要内容包括: 数据采集卡分类:按接口分为PCIe/PCI(高带宽低延迟)、USB(便携即插即用)和以太网(远距离组网);按信号类型分为模拟量输入、数字量输入/输出等。 C#集成核心方法: 优先使用厂商SDK(如NI DAQmx),提供完整功能封装 无SDK时采用通用协议(如USB HID、Modbus TCP) 具体实现示例: NI DAQmx采集热电偶温度代码 USB HID协议读取模拟量电压值 工业应用要点:实时

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1969

Android之解决scrollview总是优先滑动,导致在scrollview内的控件不滑动问题

sv01 = (ScrollView) findViewById(R.id.popup_sf_event_scroll_01); sv02 = (ScrollView) findViewById(R.id.popup_sf_event_scroll_02); sv02.setOnTouchListener(new OnTouchListener() { ...

273

手机VPN的连接方法分享

6、返回到VPN页面,可以看到刚刚新添加的VPN,点击开启VPN后面的开关。5、在打开的添加VPN的页面中输入VPN的信息后点击右上角的“保存”按钮。7、待VPN开关开启后,可以看到添加的VPN正在连接的提示信息了。2、在打开的小米手机设置页面中点击“更多连接方式”的菜单项。3、然后在打开的更多连接方式页面中点击VPN的菜单项。4、在打开的VPN设置页面中点击“添加VPN”的按钮。1、首先在手机屏幕左右的滑动,找到手机的设置图标。

惠惠软件 3万+

华为OD机试 - 机器人活动区域(Java 双机位C卷 200分)

现有一个机器人,可放置于 M × N的网格中任意位置,每个网格包含一个非负整数编号。之后M行表示网格数值,每行N个数值(数值大小用k表示),数值间用单个空格分隔,行首行尾无多余空格。说明:图中绿色区域,相邻网格差值绝对值都小于等于1,且为最大区域,对应网格点数目为6。M、N、k均为整数,且1

学Java,找哪吒 915

移动端汉堡菜单设计指南:从规范落地到体验优化

在移动端界面设计中,侧边抽屉(汉堡菜单)是既常用又容易被滥用的交互组件。本文从这一基础概念切入,系统梳理了其适用边界:只有当主界面存在高频核心操作、低频功能需要收纳且无更优替代时,才适合引入侧边抽屉。随后深入解析了抽屉宽度、遮罩透明度、动效曲线等设计规范,并针对手势冲突、Android返回键响应、状态同步等工程实践问题给出了可落地的解决方案。同时,文章强调了无障碍适配、性能优化与埋点验证的重要性,通过真实数据说明用户对低频入口的使用习惯。无论是产品经理还是开发工程师,都能从中获得一套完整的侧边抽屉设计与开发

weixin_33868027的博客 234

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

uni-app无障碍自动化实战:UTS插件实现App批量操作

在移动端应用开发中,无障碍服务(AccessibilityService)最初是为辅助视障用户操作手机而设计的系统级能力,它能够读取界面控件树、模拟点击、输入文本与手势,本质上是赋予应用一双“看得见的手”。对于需要在App内部完成重复表单填写、批量操作、自动翻页等场景的开发者而言,这项技术正逐渐成为构建自动化辅助工具和效率工具的关键基础。UTS作为uni-app支持原生调用的新型语言,将无障碍服务的底层能力封装成前端可直调的插件接口,大幅降低了原生插件集成门槛。从授权检测、节点查找到手势模拟,这一方案可服务

weixin_35906794的博客 234

YOLOv11【第六章:模型压缩与极致优化篇·第4节】Lamp 剪枝算法:无需超参的自动化剪枝策略!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1209

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android之解决RecyclerView与NestedScrollView的滑动冲突方法

道理是一样的,因为刷新组件消耗了事件,RecyclerView并没有收到事件,所以出现了这种情况。解决的方法就是在刷新组件消耗事件的方法中进行判断,如果RecyclerView还能进行滑动,那就不消耗这个事件,将事件分发给RecyclerView,否则就消耗这个事件,进行数据的加载。这个方法判断刷新组件中的子容器是什么类型,并根据类型调用不同的方法,我们添加一段判断子容器是NestedScrollView的语句,注意要写在判断ViewGroup类型的上面。测试结果:可行,滑动冲突解决,但是仍存在一些瑕疵。

ChenYiRan123456的博客 5938

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C语言】C语言期末突击/考研--函数

只有在发生函数调用时,函数print中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。(2)

qq_73830179的博客 1248

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WebView加载数据(不是加载网址)的时候,WebView的图片(可以是多张)添加点击事件

在日常开发过程中,有时候会遇到需要在app中嵌入网页,WebView加载数据(不是加载网址)的时候,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片。本文将就这一系列问题的实现进行说明。 ...

UrasakiNakajima的博客 387

androidx.core.widget.NestedScrollView 内容显示不全

先看效果吧,在NestedScrollView控件里放布局,显示不全怎么办? <?xml version="1.0" encoding="utf-8"?> <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:a...

3921

Android 开发中ScrollView无法上下滚动

问题  &esmp;因项目需要做一个App出来,所以最近在学Android Studio开发,但是我在利用ScrollView实现内容上下滚动的时候出现了一个问题,就是无法将超出页面的内容进行上下滑动,设计UI界面如下: 这里的TextView的高度是我直接用鼠标拉出来的,但是程序运行的结果却无法进行滑动,只能显示部分内容而且我设计右边的滑块也没有显示出来,同时“滚动底部” button 按钮的功能也无法实现,如下: 解决办法:   Scroll的子元素只能有一个,其子元素内部则不受限制,但是我

NiKoJJ‘s Blog 5302

使用NestedScrollView实现整体滑动

使用androidx.core.widget.NestedScrollView包裹的内容能够实现整体的向上移动 注:NestedScrollView内部只能包裹一个子view,如果含有多个并列的子view会报错,这时可以将多个并列的子view再嵌套一层布局即可 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

qq_40447795的博客 1167

安卓应用开发——Android Studio中<androidx.core.widget.NestedScrollView>: Extraneous text in resource files

"Extraneous text in resource files" 这个错误通常指的是在 Android 项目的资源文件(如 XML 布局文件、字符串资源文件等)中存在多余的、不必要的或格式不正确的文本。这可能是因为编辑资源文件时不小心添加了一些不可见的字符、空格、注释或其他非预期的内容。

2303_76399326的博客 949

【Android】NestedScrollView的简单用法与滚动冲突、滑动冲突

是 Android Jetpack 中的组件,用于容纳能够垂直滚动的视图。当页面布局的内容超过屏幕高度时,可以通过滚动展示全部内容。同时,在滚动的过程中与子视图可以进行事件协作。

2301_79977698的博客 5903

NestedScrollView + RecyclerView完美解决显示不全及滑动冲突

<androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <androidx.recyclerview.widget.RecyclerView android:id.

baidu_24743861的博客 5359

Android 设置ScrollView不可滚动

前言: 设置ScrollView不可滚动? 咋一听可能觉得很鸡肋,如果你不需要滚动,为什么要用ScrollView呢? 但是在需求越来越复杂的今天,有很多场景是完全需要用到的。比如你需要在一些情况下,开启滚动,在一些情况下又需要关闭滚动。 思路: 当然,ScrollView本身没有方法去关闭开启滚动。所以我们需要创建新的文件 ,继承ScrollView。 重写onTouchEvent...

Fushize的博客 8994

Android NestedScrollView 嵌套ViewPager不显示和出现空白部分 解决方法

Android ScrollView嵌套ViewPager不显示和出现空白部分 解决方法

songqindong 1786
上一篇: 17.7.29 随笔
下一篇: android RXJava入门(Rxjava1.0)
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值