作者:程序员小冰,GitHub主页:https://github.com/QQ986945193

新浪微博:http://weibo.com/mcxiaobing

首先给大家看一下我们今天这个最终实现的效果图:



我这里只是单纯的实现了scrollview返回顶部的功能。具体效果大家可以适当地美化

在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。

好了,首先我们是当不在顶部的时候,返回顶部按钮就会出现,而到顶部之后就会隐藏此按钮,所以我们这里就要算scrollview的滑动偏移量,当然,有这个返回顶部按钮,而且一直显示在底部,所以当然用相对布局了。下面先给大家看一下xml布局源码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ScrollView
  6. android:id="@+id/my_scrollView"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent">
  9. <LinearLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:gravity="center"
  13. android:orientation="vertical">
  14. <TextView
  15. android:layout_width="match_parent"
  16. android:layout_height="200dp"
  17. android:text="Hello 程序员小冰"
  18. android:textSize="20dp" />
  19. <TextView
  20. android:layout_width="match_parent"
  21. android:layout_height="200dp"
  22. android:text="Android Dev Team"
  23. android:textSize="20dp" />
  24. <TextView
  25. android:layout_width="match_parent"
  26. android:layout_height="200dp"
  27. android:text="http://weibo.com/mcxiaobing"
  28. android:textSize="20dp" />
  29. <TextView
  30. android:layout_width="match_parent"
  31. android:layout_height="200dp"
  32. android:text="qq986945193"
  33. android:textSize="20dp" />
  34. <TextView
  35. android:layout_width="match_parent"
  36. android:layout_height="200dp"
  37. android:text="Hello IOS" />
  38. <TextView
  39. android:layout_width="match_parent"
  40. android:layout_height="200dp"
  41. android:text="java开发者"
  42. android:textSize="20dp" />
  43. <TextView
  44. android:layout_width="match_parent"
  45. android:layout_height="200dp"
  46. android:text="Android开发者"
  47. android:textSize="20dp" />
  48. </LinearLayout>
  49. </ScrollView>
  50. <Button
  51. android:id="@+id/top_btn"
  52. android:layout_width="50dp"
  53. android:layout_height="50dp"
  54. android:layout_alignParentBottom="true"
  55. android:layout_alignParentRight="true"
  56. android:layout_marginBottom="6dp"
  57. android:layout_marginRight="6dp"
  58. android:background="@mipmap/top_btn_bg"
  59. android:gravity="center"
  60. android:text="顶"
  61. android:visibility="gone" />
  62. </RelativeLayout>

好了,然后就是我们的java实现代码了。下面是源代码,不懂得朋友可以留言,或者更好的建议,相互交流。对了,特别说一下,scrollview在XML布局中只能有一个子view,不然就会报错。所以这一点我在java代码中也特意说明了一下。java实现代码如下:

  1. package davidtotopscrollview.qq986945193.davidtotopscrollview;
  2. import android.os.Handler;
  3. import android.os.Message;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.MotionEvent;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.ScrollView;
  11. /**
  12. * @author :程序员小冰
  13. * @新浪微博 :http://weibo.com/mcxiaobing
  14. * @GitHub: https://github.com/QQ986945193
  15. * @CSDN博客: http://blog.csdn.net/qq_21376985
  16. * @码云OsChina :http://git.oschina.net/MCXIAOBING
  17. */
  18. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  19. private ScrollView scrollView;// scrollView数据列表
  20. private Button toTopBtn;// 返回顶部的按钮
  21. private int scrollY = 0;// 标记上次滑动位置
  22. private View contentView;
  23. private final String TAG = "qq986945193";
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28. initView();
  29. }
  30. /**
  31. * 初始化视图
  32. */
  33. private void initView() {
  34. scrollView = (ScrollView) findViewById(R.id.my_scrollView);
  35. if (contentView == null) {
  36. contentView = scrollView.getChildAt(0);
  37. }
  38. toTopBtn = (Button) findViewById(R.id.top_btn);
  39. toTopBtn.setOnClickListener(this);
  40. //http://blog.csdn.net/qq_21376985
  41. /******************** 监听ScrollView滑动停止 *****************************/
  42. scrollView.setOnTouchListener(new View.OnTouchListener() {
  43. private int lastY = 0;
  44. private int touchEventId = -9983761;
  45. Handler handler = new Handler() {
  46. @Override
  47. public void handleMessage(Message msg) {
  48. super.handleMessage(msg);
  49. View scroller = (View) msg.obj;
  50. if (msg.what == touchEventId) {
  51. if (lastY == scroller.getScrollY()) {
  52. handleStop(scroller);
  53. } else {
  54. handler.sendMessageDelayed(handler.obtainMessage(
  55. touchEventId, scroller), 5);
  56. lastY = scroller.getScrollY();
  57. }
  58. }
  59. }
  60. };
  61. public boolean onTouch(View v, MotionEvent event) {
  62. if (event.getAction() == MotionEvent.ACTION_UP) {
  63. handler.sendMessageDelayed(
  64. handler.obtainMessage(touchEventId, v), 5);
  65. }
  66. return false;
  67. }
  68. /**
  69. * ScrollView 停止
  70. *
  71. * @param view
  72. */
  73. private void handleStop(Object view) {
  74. Log.i(TAG, "handleStop");
  75. ScrollView scroller = (ScrollView) view;
  76. scrollY = scroller.getScrollY();
  77. doOnBorderListener();
  78. }
  79. });
  80. /***********************************************************/
  81. }
  82. /**
  83. * ScrollView 的顶部,底部判断:
  84. * http://blog.csdn.net/qq_21376985
  85. * <p/>
  86. * 其中getChildAt表示得到ScrollView的child View, 因为ScrollView只允许一个child
  87. * view,所以contentView.getMeasuredHeight()表示得到子View的高度,
  88. * getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。
  89. * 当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~
  90. *
  91. * @param
  92. */
  93. private void doOnBorderListener() {
  94. // 底部判断
  95. if (contentView != null
  96. && contentView.getMeasuredHeight() <= scrollView.getScrollY()
  97. + scrollView.getHeight()) {
  98. toTopBtn.setVisibility(View.VISIBLE);
  99. Log.i(TAG, "bottom");
  100. }
  101. // 顶部判断
  102. else if (scrollView.getScrollY() == 0) {
  103. Log.i(TAG, "top");
  104. } else if (scrollView.getScrollY() > 30) {
  105. toTopBtn.setVisibility(View.VISIBLE);
  106. Log.i(TAG, "test");
  107. }
  108. }
  109. /**
  110. * 下面我们看一下这个函数: scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
  111. * scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
  112. * <p/>
  113. * <p/>
  114. * 需要注意的是,该方法不能直接被调用 因为Android很多函数都是基于消息队列来同步,所以需要一部操作,
  115. * addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快, 但是如果立即调用fullScroll,
  116. * view可能还没有显示出来,所以会失败 应该通过handler在新线程中更新
  117. * <p/>
  118. * http://blog.csdn.net/qq_21376985
  119. * http://weibo.com/mcxiaobing
  120. */
  121. @Override
  122. public void onClick(View v) {
  123. // TODO Auto-generated method stub
  124. switch (v.getId()) {
  125. case R.id.top_btn:
  126. scrollView.post(new Runnable() {
  127. @Override
  128. public void run() {
  129. // scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
  130. // scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
  131. //
  132. // 需要注意的是,该方法不能直接被调用
  133. // 因为Android很多函数都是基于消息队列来同步,所以需要一部操作,
  134. // addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快,但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败
  135. // 应该通过handler在新线程中更新
  136. scrollView.fullScroll(ScrollView.FOCUS_UP);
  137. }
  138. });
  139. toTopBtn.setVisibility(View.GONE);
  140. break;
  141. }
  142. }
  143. }

好了,教程到此结束。如果此文章帮到了你,欢迎点赞。

源代码需要的可以去

(AndroidStudio版)github下载地址:

https://github.com/QQ986945193/DavidToTopScrollView

【Android】Scrollview返回顶部,快速返回顶部的功能实现,详解代码。的更多相关文章

  1. 【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...

  2. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  3. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  4. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  5. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  6. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  7. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

  8. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  9. HP电脑的增霸卡功能操作详解

    机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...

随机推荐

  1. Dynamics 365 CRM On premise Unable to Load plug-in assembly

    背景介绍: 本地部署Microsoft Dynamics CRM 9.0正常可用,后打补丁到9.0.16.7,打开系统quote报 “ Unable to Load plug-in assembly” ...

  2. [C#] (原创)一步一步教你自定义控件——01,TrackBar

    一.前言 技术没有先进落后之分,只有合不合适. WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素.或者功能上有些不如意,自然而然便想 ...

  3. 实用!一键生成数据库文档,堪称数据库界的Swagger

    本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 最近部门订单业务调整,收拢其他业务线的下单入口,做个统一大订单平台.需要梳理各业务线的数据表,但每个业务线库都有近百张 ...

  4. 【CSP2019】括号树 题解(递推+链表)

    前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...

  5. Elasticsearch权威指南(中文版)

    Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...

  6. VSCode C++环境配置(个人使用)

    tasks.json { "version": "2.0.0", "command": "g++", "arg ...

  7. Python使用Tornado+Redis维护ADSL拨号服务器代理池

    们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...

  8. Vue中v-model指令的常用修饰符

    v-model指令有三个可以选用的修饰符:.lazy..number以及.trim.vue官方对此的描述为: .number-输入字符串转为有效的数字 .lazy-取代input监听change事件 ...

  9. golang 整型

    目录 前言 整型 1.分类 2.类型 3.类型补充 4.补充: 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深 ...

  10. 每日一道 LeetCode (15):二进制求和

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...