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

举报
芝麻粒儿 发表于 2022/09/27 15:44:39 2022/09/27
【摘要】 👉关于作者众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)欢迎关注公众号【空名先生】获取更多资源和交流! 👉前提这是小空坚持写的Android新手向系列,欢迎...

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!

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

欢迎关注公众号【空名先生】获取更多资源和交流!

👉前提

这是小空坚持写的Android新手向系列,欢迎品尝。

新手(√√√)

大佬(√)

👉实践过程

😜示例

使用步骤

  1. ScrollView或HorizontalScrollView嵌套一个子ViewGroup,可以是LinearLayout等。
  2. 给ScrollView或HorizontalScrollView设置你想要的宽高。
  3. 如果是ScrollView子view的layout_height是wrap_content,而HorizontalScrollView则layout_width是wrap_content
<?xml version="1.0" encoding="utf-8"?>
<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>
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)
    }
}

image.png

😜监听

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);
    }
}

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)
    }
}

使用

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

除了这个,后来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 ->
    {

    }
}

👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:芝麻粒儿 的个人主页 - 专栏 - 掘金 (juejin.cn)

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。