`
qq986945193
  • 浏览: 90439 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

作者:程序员小冰,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

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    Android ScrollView向上滑动控件顶部悬浮效果实现

    通过以上步骤,我们就成功实现了Android ScrollView向上滑动时控件顶部悬浮的效果。这种效果不仅提高了用户的操作便利性,也使界面设计更加美观和统一。在实际开发中,还可以根据项目需求进行适当的调整和优化,比如...

    android ScrollView顶部使用Viewpager的轮播图,下拉图片能放大效果

    综上所述,实现这样一个功能需要对Android的基础控件有深入的理解,包括ScrollView的滚动事件处理、ViewPager的使用以及自定义动画的实现。通过这些技术的结合,我们可以为用户提供一个既美观又具有互动性的界面。在...

    android scrollview顶部悬浮demo

    而“android scrollview顶部悬浮demo”则是一个实现特定功能的示例项目,它旨在展示如何在ScrollView内创建一个始终保持在顶部的悬浮元素。这种设计常见于许多应用,如聊天界面中的输入框或导航栏,即使在用户滚动...

    Android ScrollView子控件滑动顶部悬浮

    通过以上步骤,我们就能够实现一个基本的Android ScrollView子控件滑动到顶部悬浮的功能。在实际项目中,还可以根据需求进行更复杂的设计,比如添加更多交互效果,或者将此功能封装成一个可复用的库组件。对于...

    android ScrollView嵌套demo

    在实际的代码实现中,通常会结合以上一种或多种方法来确保嵌套ScrollView的滑动流畅。通过分析和修改`InnerScrollView`的源码,我们可以看到它是如何处理滑动事件和避免冲突的。同时,这个demo也可能是展示了如何在...

    android scrollview 下拉刷新

    综上所述,要在Android的ScrollView中实现下拉刷新功能,可以利用SwipeRefreshLayout组件或者自定义ScrollView。通过这种方式,用户可以轻松地在应用中触发数据的刷新,提高用户体验。同时,这也可以作为提升开发者...

    Android ScrollView自动滑动

    总结,Android中的ScrollView自动滑动功能可以通过scrollTo()方法实现,特别是在创建"关于我们"页面时,这一特性能够帮助用户快速获取页面底部的信息。然而,实际应用中需要注意性能优化和用户体验,确保自动滑动既...

    Android ScrollView 嵌套解决方案

    在给定的文件"ScrollViewInnerScrollView"中,可能包含了如何实现ScrollView与InnerScrollView(即NestedScrollView)结合使用的示例代码。通过分析和学习这个例子,开发者可以更好地理解和应用上述提到的解决方案。

    安卓scrollview动画滚动到顶部

    本文将深入探讨如何实现一个ScrollView动画滚动到顶部的功能,这在很多应用场景中都非常有用,例如用户需要回到页面顶部查看新的信息或者刷新内容。 首先,我们需要了解ScrollView的基本用法。ScrollView是...

    android ScrollVIew中控件滑动顶端固定

    在给定的标题“android ScrollView中控件滑动顶端固定”中,我们讨论的是如何实现一个特定的效果:当ScrollView中的某个子控件(如操作按钮)滚动到顶部时,该控件会固定在顶部,保持可见,以便用户随时可以进行操作...

    Android Scrollview上滑停靠—悬浮框停靠在标题栏下方(防微博详情页)

    在这个特定的案例中,"Android Scrollview上滑停靠—悬浮框停靠在标题栏下方(防微博详情页)" 是一个功能实现,它模拟了类似微博详情页的效果,即当用户在ScrollView中向上滑动时,一个悬浮框(通常是包含操作或...

    Android双向滚动ScrollView

    在Android开发中,ScrollView是常用的布局控件,用于实现单向滚动,但有时我们需要实现一个可以双向滚动的视图,这就涉及到了自定义组件的知识。本文将深入解析如何实现一个支持垂直和水平双向滚动的ScrollView。 ...

    android ScrollView弹性控件,横向和纵向滑动

    这个自定义控件不仅具备了ScrollView的基本功能,还额外添加了横向弹性滑动的能力,解决了网络上其他类似实现可能存在的滑动bug,提高了用户体验。 首先,让我们了解一下Rebound库。Facebook的Rebound是一个用于...

    Android ScrollView嵌套TabLayout+ViewPager

    亲测成功,可以直接嵌套项目中 ScrollView嵌套TabLayout+ViewPager解决滑动冲突,已进行重点标注 ViewPager会根据frament的界面高度进行展示,进行framnet的高度测量 嵌套冲突已全部解决

    android ScrollView 上下左右任意滑动

    "android ScrollView 上下左右任意滑动"这个标题所指的,是一种特殊的ScrollView实现,它不仅支持常规的垂直滚动,还支持水平滚动,使得用户可以自由地在四个方向上浏览内容,特别是对于大图片展示有很好的适应性。...

    Android ScrollView反弹效果

    在Android开发中,ScrollView是一个非常常见的布局容器,它允许用户滚动其内容,特别是当内容超出屏幕范围时。本文将深入探讨如何实现一个自定义的ScrollView,以添加上、下拉的反弹效果,从而提高用户的交互体验。 ...

    Android scrollview ListView GridView上拉下拉刷新

    总结来说,Android中的ScrollView、ListView和GridView上拉下拉刷新功能的实现涉及到自定义视图、滑动事件监听、数据加载逻辑和缓冲效果优化。熟练掌握这些技术,能有效提升应用的用户体验,使用户在浏览大量数据时...

    android scrollView 拉到最低和最顶端 反弹效果

    当用户滚动到ScrollView的顶部或底部时,有时我们希望实现一个反弹效果,即滚动条会在到达边界后短暂地回弹,增加用户体验的流畅感。这个效果通常被称为“橡皮筋效果”或“弹簧效果”,在iOS中称为“弹性滚动”,在...

    Android ScrollView截图涂鸦.rar

    (代码中没有提供截取ScrollView的方法,只提供了一张长图)主要是通过在imageView外包裹一层ScrollView,通过点击按钮切换判断手势,是传给ScrollView还是ImageView,并且添加了切换画笔颜色、清屏、画笔粗细的功能

    Android 通过ScrollView实现的渐变导航栏

    在这个主题中,我们将深入探讨如何利用ScrollView来实现这样一个功能。ScrollView是Android提供的一个可滚动视图容器,它可以包含一个或多个视图,并允许用户垂直滚动内容。 首先,让我们理解什么是渐变导航栏。...

Global site tag (gtag.js) - Google Analytics