• Android修行手册 - ScrollView示例和监听


    往期文章分享

    👉关于作者

    众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
    专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
    有什么需要欢迎私我,交流群让学习不再孤单

    在这里插入图片描述

    本文约6千字,新手阅读需要7分钟,复习需要3分钟收藏随时查阅不再迷路

    👉实践过程

    😜示例

    使用步骤

    1. ScrollView或HorizontalScrollView嵌套一个子ViewGroup,可以是LinearLayout等。
    2. 给ScrollView或HorizontalScrollView设置你想要的宽高。
    3. 如果是ScrollView子view的layout_height是wrap_content,而HorizontalScrollView则layout_width是wrap_content
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <HorizontalScrollView
            android:id="@+id/idScrollView"
            android:layout_width="560dp"
            android:layout_height="200dp"
            android:fadingEdge="horizontal"
            android:fadingEdgeLength="20dp"
            android:isScrollContainer="false"
            android:scrollbarAlwaysDrawHorizontalTrack="true"
            android:scrollbarDefaultDelayBeforeFade="500"
            android:scrollbarFadeDuration="1000"
            android:scrollbarSize="6dp"
            android:scrollbarThumbHorizontal="@color/color_00ff00"
            android:scrollbarTrackHorizontal="@color/color_ff0000"
            android:scrollbars="horizontal">
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal">
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_three" />
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_five" />
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_one" />
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_two" />
    
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_seven" />
            LinearLayout>
        HorizontalScrollView>
    
        <ScrollView
            android:layout_width="240dp"
            android:layout_height="560dp"
            android:layout_marginTop="20dp"
            android:fadeScrollbars="false"
            android:fillViewport="true"
            android:scrollbarAlwaysDrawVerticalTrack="true"
            android:scrollbarDefaultDelayBeforeFade="3000"
            android:scrollbarFadeDuration="2000"
            android:scrollbarSize="10dp"
            android:scrollbarStyle="outsideOverlay"
            android:scrollbarThumbVertical="@color/color_ff0000"
            android:scrollbarTrackVertical="@color/color_00ff00"
            android:scrollbars="vertical"
            android:soundEffectsEnabled="true">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_one" />
    
                <View
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1" />
    
                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:src="@mipmap/study_two" />
    
    
            LinearLayout>
        ScrollView>
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    class ActivityScrollView :AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_scrollview)
            //滚动到底部
            idScrollView.fullScroll(ScrollView.FOCUS_DOWN)
            //滚动到顶部
            idScrollView.fullScroll(ScrollView.FOCUS_UP)
            //滑动到指定位置,参数是x值和y值,view左上角为原点
            idScrollView.smoothScrollTo(100,100)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    😜监听

    ScrollView默认是没有监听的,但是不妨碍我们继承后自定义onScrollChanged来实现。

    Java版

    public class ScrollViewCustomJava extends ScrollView {
        private OnScrollListener onScrollListener;
    
        public void setOnScrollListener(OnScrollListener onScrollListener) {
            this.onScrollListener = onScrollListener;
        }
    
        public ScrollViewCustomJava(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if (onScrollListener != null) {
                //一定要注意着的int值都是像素值,而我们实际用的时候应该是dp,记得自己进行转换
                onScrollListener.onScroll(oldl, oldt, l, t);
            }
        }
    
        interface OnScrollListener {
            /**
             * 回调坐标值  一般ScrollView只有Y值变化, HorizontalScrollView是x值变化
             *
             * @param startScrollX 滑动之前的值
             * @param startScrollY 滑动之前的值
             * @param endScrollX   滑动之后的值
             * @param endScrollY   滑动之后的值
             */
            void onScroll(int startScrollX, int startScrollY, int endScrollX, int endScrollY);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Kotlin版

    class ScrollViewCustomKotlin(context: Context?, attrs: AttributeSet?) : ScrollView(context, attrs) {
        private var onScrollListener: OnScrollListener? = null
    
        fun setOnScrollListener(onScrollListener: OnScrollListener?) {
            this.onScrollListener = onScrollListener
        }
    
        override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {
            super.onScrollChanged(l, t, oldl, oldt)
            if (onScrollListener != null) {
                //一定要注意着的int值都是像素值,而我们实际用的时候应该是dp,记得自己进行转换
                onScrollListener!!.onScroll(oldl, oldt, l, t)
            }
        }
    
        interface OnScrollListener {
            /**
             * 回调坐标值  一般ScrollView只有Y值变化, HorizontalScrollView是x值变化
             *
             * @param startScrollX 滑动之前的值
             * @param startScrollY 滑动之前的值
             * @param endScrollX   滑动之后的值
             * @param endScrollY   滑动之后的值
             */
            fun onScroll(startScrollX: Int, startScrollY: Int, endScrollX: Int, endScrollY: Int)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    使用

    scrollViewCustomJava.setOnScrollListener { startScrollX, startScrollY, endScrollX, endScrollY ->
        {
            Log.e("TAG", "打印出数值: $startScrollX$startScrollY$endScrollX$endScrollY");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    除了这个,后来Android更新了NestedScrollview,不仅解决了监听事件,还能嵌套RecyclerView或ListView了。相比ScrollView强大了不少。后面我们会单独讲,在这说下她的滑动事件(Api需要23以上)。

    两个监听都一样

    idNestedScrollView.setOnScrollChangeListener(object : NestedScrollView.OnScrollChangeListener {
        override fun onScrollChange(v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
        //参数一是NestedScrollView对象 、参数二是:scrollX是目前的(滑动后)的X轴坐标 、参数三是:ScrollY是目前的(滑动后)的Y轴坐标 、参数四是:oldScrollX是之前的(滑动前)的X轴坐标 、参数五是:oldScrollY是之前的(滑动前)的Y轴坐标
        }
    })
    idNestedScrollView.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
        {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    👉其他

    📢作者:小空和小芝中的小空
    📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
    📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

    温馨提示点击下方卡片获取更多意想不到的资源。
    空名先生

  • 相关阅读:
    沁恒CH9101是一个USB总线的转接芯片
    8、MFC界面开发
    C语言的简单学习
    二进制中1的个数
    Effective Cpp
    [附源码]计算机毕业设计springboot高校学生宿舍管理系统
    心累了,看一点职场思维
    delphi socket cross开源跨平台通讯库
    算法刷题——爬楼梯
    Vue2项目练手——通用后台管理项目第五节
  • 原文地址:https://blog.csdn.net/qq_27489007/article/details/126938441