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

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

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



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

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

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ScrollView
android:id="@+id/my_scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="Hello 程序员小冰"
android:textSize="20dp" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="Android Dev Team"
android:textSize="20dp" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="http://weibo.com/mcxiaobing"
android:textSize="20dp" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="qq986945193"
android:textSize="20dp" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="Hello IOS" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="java开发者"
android:textSize="20dp" /> <TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="Android开发者"
android:textSize="20dp" />
</LinearLayout>
</ScrollView> <Button
android:id="@+id/top_btn"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="6dp"
android:layout_marginRight="6dp"
android:background="@mipmap/top_btn_bg"
android:gravity="center"
android:text="顶"
android:visibility="gone" />
</RelativeLayout>

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

package davidtotopscrollview.qq986945193.davidtotopscrollview;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView; /**
* @author :程序员小冰
* @新浪微博 :http://weibo.com/mcxiaobing
* @GitHub: https://github.com/QQ986945193
* @CSDN博客: http://blog.csdn.net/qq_21376985
* @码云OsChina :http://git.oschina.net/MCXIAOBING
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ScrollView scrollView;// scrollView数据列表
private Button toTopBtn;// 返回顶部的按钮 private int scrollY = 0;// 标记上次滑动位置 private View contentView; private final String TAG = "qq986945193"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} /**
* 初始化视图
*/
private void initView() {
scrollView = (ScrollView) findViewById(R.id.my_scrollView);
if (contentView == null) {
contentView = scrollView.getChildAt(0);
} toTopBtn = (Button) findViewById(R.id.top_btn);
toTopBtn.setOnClickListener(this); //http://blog.csdn.net/qq_21376985
/******************** 监听ScrollView滑动停止 *****************************/
scrollView.setOnTouchListener(new View.OnTouchListener() {
private int lastY = 0;
private int touchEventId = -9983761;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
View scroller = (View) msg.obj;
if (msg.what == touchEventId) {
if (lastY == scroller.getScrollY()) {
handleStop(scroller);
} else {
handler.sendMessageDelayed(handler.obtainMessage(
touchEventId, scroller), 5);
lastY = scroller.getScrollY();
}
}
}
}; public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
handler.sendMessageDelayed(
handler.obtainMessage(touchEventId, v), 5);
}
return false;
} /**
* ScrollView 停止
*
* @param view
*/
private void handleStop(Object view) { Log.i(TAG, "handleStop");
ScrollView scroller = (ScrollView) view;
scrollY = scroller.getScrollY(); doOnBorderListener();
}
});
/***********************************************************/ } /**
* ScrollView 的顶部,底部判断:
* http://blog.csdn.net/qq_21376985
* <p/>
* 其中getChildAt表示得到ScrollView的child View, 因为ScrollView只允许一个child
* view,所以contentView.getMeasuredHeight()表示得到子View的高度,
* getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。
* 当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~
*
* @param
*/
private void doOnBorderListener() {
// 底部判断
if (contentView != null
&& contentView.getMeasuredHeight() <= scrollView.getScrollY()
+ scrollView.getHeight()) {
toTopBtn.setVisibility(View.VISIBLE);
Log.i(TAG, "bottom");
}
// 顶部判断
else if (scrollView.getScrollY() == 0) { Log.i(TAG, "top");
} else if (scrollView.getScrollY() > 30) {
toTopBtn.setVisibility(View.VISIBLE);
Log.i(TAG, "test");
} } /**
* 下面我们看一下这个函数: scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
* scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
* <p/>
* <p/>
* 需要注意的是,该方法不能直接被调用 因为Android很多函数都是基于消息队列来同步,所以需要一部操作,
* addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快, 但是如果立即调用fullScroll,
* view可能还没有显示出来,所以会失败 应该通过handler在新线程中更新
* <p/>
* http://blog.csdn.net/qq_21376985
* http://weibo.com/mcxiaobing
*/
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.top_btn:
scrollView.post(new Runnable() {
@Override
public void run() {
// scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
// scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
//
// 需要注意的是,该方法不能直接被调用
// 因为Android很多函数都是基于消息队列来同步,所以需要一部操作,
// addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快,但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败
// 应该通过handler在新线程中更新
scrollView.fullScroll(ScrollView.FOCUS_UP);
}
});
toTopBtn.setVisibility(View.GONE);
break;
}
} }

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

源代码需要的可以去

(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. 区块链钱包开发 - USDT - 三、实战(nodejs版本)

    一.安装钱包 请参考另一篇随笔: 入口 二.获取测试usdt(TestOmni)步骤: 1.导入地址到钱包,往该地址充值测试比特币, 2.然后往 moneyqMan7uh8FqdCA2BV5yZ8qV ...

  2. Python机器学习——预测分析核心算法PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:7qi1 在学习和研究机器学习的时候,面临令人眼花缭乱的算法,机器学习新手往往会不知所措.本书从算法和Python语言实现的角度,帮助读者认识机器学习. 本书专注于两类核心的" ...

  3. 40行Python制作超炫酷动态排序图,有了它高逼格PPT再也不愁!

        本文首发于量化投资与机器学习 转载于  https://mp.weixin.qq.com/s/KaB_7oXZf0_IV97y0pRPmQ 前言 最近,这种动态排序条形图视频超级火,如下图: ...

  4. 关于DateTimeOffset的爱恨情仇

    为什么要上DataTimeOffset?因为DateTime无法解决时区问题,经常需要时间戳转换日期,DateTimeOffset就是应运而生,数据格式储存了和UTC的时区差,C#几乎全几乎全版本支持 ...

  5. 2020牛客多校第八场K题

    __int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...

  6. 入门实践,Python数据分析

    1-2 Anaconda和Jupyter notebook介绍 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  7. 敏捷工具:Scrum板与Kanban如何抉择?敏捷工具:Scrum板与Kanban如何抉择?

    Scrum板作为一种工具,主要应用于Scrum团队的敏捷项目管理,能够帮助团队更新任务进度,促进团队信息共享,及时发现任务过程中的异常现象,从而查漏补缺.团队在每日站会时会通过Scrum板来直观地展示 ...

  8. C#LeetCode刷题之#496-下一个更大元素 I(Next Greater Element I)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4026 访问. 给定两个没有重复元素的数组 nums1 和 num ...

  9. 使用 VMware Workstation Pro 让 PC 提供云桌面服务——学习笔记(一)

    最终效果: 能够通过xshell等终端设备, 远程访问虚拟机 操作步骤 1. 安装VMware 网上自行下载VMware 软件,这里不给出详细操作 2. 下载安装系统 这里使用 Centos 的lin ...

  10. three.js 制作逻辑转体游戏(上)

    今天郭先生又出来制作游戏了,最近有小伙伴要做一个逻辑转体小游戏,我怎么能不先来试试呢.玩法可以看上面的连接,下面附几张图.线案例请点击博客原文. 游戏规则不懂得可以看自行百度哈,其实玩起来还挺有难度的 ...