精华内容
下载资源
问答
  • 安卓 返回顶部
    2021-06-02 22:30:01

    Android中使用FloatingActionButton实现一个点击按钮返回顶部功能

    发布时间:2020-11-24 15:49:29

    来源:亿速云

    阅读:148

    作者:Leah

    这期内容当中小编将会给大家带来有关Android中使用FloatingActionButton实现一个点击按钮返回顶部功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

    FloatingActionButton是Design Support库中提供的一个控件,这个控件可以轻松实现悬浮按钮的效果

    首先,要在项目中使用这个悬浮按钮就要先把design这个包导入项目

    gradle中加入依赖

    compile 'com.android.support:design:25.0.0'

    接下来就是在xml中使用:

    我这里是放置一个listView模拟返回顶部

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    xmlns:app="http://schemas.android.com/apk/res-auto">

    android:id="@+id/listview_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent" />

    android:id="@+id/floating_btn_main"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentRight="true"

    android:layout_alignParentBottom="true"

    android:src="@mipmap/top"

    app:elevation="10dp"

    android:layout_margin="15dp"/>

    其中 app:elevation=”10dp”是给FloatingActionButton指定一个高度,高度越高,投影的范围越大,但是投影效果越淡,反之则反

    接下来是MainActivity中的使用:

    package com.duanlian.floatingbtn;

    import android.support.design.widget.FloatingActionButton;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.webkit.WebView;

    import android.webkit.WebViewClient;

    import android.widget.ListView;

    import java.util.ArrayList;

    import java.util.List;

    public class MainActivity extends AppCompatActivity {

    private ListView mListView;

    private FloatingActionButton mFloatBtn;

    private MyListViewAdapter mAdapter;

    private List mList;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    initView();

    }

    private void initView() {

    mListView = (ListView) findViewById(R.id.listview_main);

    mFloatBtn = (FloatingActionButton) findViewById(R.id.floating_btn_main);

    mList = new ArrayList<>();

    for (int i = 0; i < 30; i++) {

    mList.add(i + "");

    }

    mAdapter = new MyListViewAdapter(this, mList);

    mListView.setAdapter(mAdapter);

    //悬浮按钮的点击事件的监听

    mFloatBtn.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

    //listView返回到顶部

    mListView.smoothScrollToPosition(0);

    }

    });

    }

    }

    上述就是小编为大家分享的Android中使用FloatingActionButton实现一个点击按钮返回顶部功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

    更多相关内容
  • 前言最近因为项目组需求,特研究了一下“回到顶部”效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久。我没有搜,或许网上有很多这样的例子,...

    前言

    最近因为项目组需求,特研究了一下“回到顶部”效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久。我没有搜,或许网上有很多这样的例子,此文写的不好的地方,望指点。

    效果图如下

    3720b4ad7a25f187fe4b18108f272bd7.png

    实现方法

    初一看是不是觉得很简答?没错,当时我也是这样想的页面内容很长,就弄个scrollview,回到顶部按钮需要固定在右下角,故大概的布局代码:

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="com.znke.pulltorefresh_top.MainActivity">

    android:id="@+id/scrollView"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_below="@+id/tv_top"

    android:scrollbars="none">

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="vertical">

    android:layout_width="match_parent"

    android:layout_height="50dp"

    android:gravity="center"

    android:text="111111111111"

    android:textSize="20sp" />

    ...........

    android:layout_width="match_parent"

    android:layout_height="2dp"

    android:background="#AAAAAA" />

    android:layout_width="match_parent"

    android:layout_height="80dp"

    android:gravity="center"

    android:text="12000000000000"

    android:textSize="20sp" />

    android:id="@+id/imageView_to_top"

    android:layout_width="50dp"

    android:layout_height="50dp"

    android:layout_alignParentBottom="true"

    android:layout_alignParentRight="true"

    android:layout_marginBottom="5dp"

    android:layout_marginRight="5dp"

    android:background="@drawable/to_top" />

    然后在activity中设置下面事件不就完了嘛!!!

    mScrollView.setOnScrollChangeListener();

    很遗憾,报错。alt+enter搞定错误不就完了嘛!很遗憾,运行继续报错,报空指针,神奇吧,找不出来。翻阅资料后发现,scrollview的onScrollChanged方法是受保护的。故按照网上的资料,自定义ScrollView类,暴露出onScrollChanged方法:

    public class ToTopScrollView extends ScrollView {

    private OnMyScrollListener onMyScrollListener;

    public void setOnMyScrollListener(OnMyScrollListener onMyScrollListener) {

    this.onMyScrollListener = onMyScrollListener;

    }

    ...

    @Override

    protected void onScrollChanged(int l, int t, int oldl, int oldt) {

    super.onScrollChanged(l, t, oldl, oldt);

    if(onMyScrollListener != null)

    onMyScrollListener.onScrollChanged(l,t,oldl,oldt);

    }

    public interface OnMyScrollListener{

    void onScrollChanged(int x, int y, int oldx, int oldy);

    }

    }

    然后在activity中设置setOnMyScrollListener()方法,就可以监控scrollview的状态了。剩下的就是自定义imageview的逻辑了。

    可是,自定义ToTopImageView里面怎么弄呢?它需要有一个高度临界值,与activity传递scrollview的scrollY值比较,来判定ToTopImageView是否显示。代码简单,搞定。

    只是这样有个小问题,onScrollChanged方法是监控滚动状态的,没有说停止。如果在里面判断超过临界值就显示与隐藏imageview,那么会一直设置imageview。这样肯定不是最佳的方法。如果能在滚动停止时再判定是否需要显示与隐藏imageview就好了。此时我还没有想太多,动手简单实现了刚才的分析。

    实现后,感觉挺爽。然而在准备加到项目中时发现,我们项目用了PullToRefresh刷新代码库,也简单,把自定义的Scrollview替换就可以了。运行,糟糕,没有效果,然后调试,事件没有处罚,可能是PullToRefresh库把事件屏蔽了,咋办?找onTouchListener监听方法呗。

    于是改用了测试:

    mScrollView.setOnTouchListener()

    我去,没有调佣,把pullToRefreshScrollView里面各种监听方法都试遍了,没用。他只提供了顶部和底部的上拉、下拉刷新监听,毛用。

    于是查看其源码,发现把事件拦截了。而且pullToRefreshScrollView根本就不是scrollview,看源码:

    @Override

    protected ScrollView createRefreshableView(Context context, AttributeSet attrs) {

    ScrollView scrollView;

    if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {

    scrollView = new InternalScrollViewSDK9(context, attrs);

    } else {

    scrollView = new ScrollView(context, attrs);

    }

    scrollView.setId(R.id.scrollview);

    return scrollView;

    }

    他里面提供了一个方法可以或得到Scrollview:

    final ScrollView scrollView = mScrollView.getRefreshableView();

    回想起了以前项目也这么用过,只是当时不明白这句话干啥的,白写。

    然后就用上面这种方法得到scrollview,再设置onscrollchanged方法监听滑动。运行报错,同样无效。于是只能换onTouchListener监听了。

    但是这样问题来了,我们只能监听到手势,即何时按下、移动和弹起。当快速滑动手指弹起后,scrollview还在滚动的,什么时候去拿到它的scrollY值呢?犯愁了。

    此时不得不用最开始分析的方法,在自定义imageview里面定义线程,扫描当前scrollY和上一次保存的对比,不一样即说明仍在滚动,一样即表明scrollview滚动停止了。

    什么时候开启线程呢?在onTouch回调中down、move或者up时调用。

    试想下:

    如果在down中调用时,用户只在scrollview上点击或短距离滑动,imageview里面要不停地开启线程?浪费资源。

    如果在up中调用时,当用户按着屏幕一口气滑过临界值,还不松手呢?还不显示imageview吗?也行,个人觉得不太好。

    于是,我选择在move中调用imageview地线程。有人会想,这样会不会启动N多个线程呢?move一直在移动呢。“在iamgeview判断下线程的状态即可,如果已经启动了,就不启动呗”。或许这么写不太好,但我认为是实时的,用户体验好。

    看代码:

    /**

    * 获取待监控的view对象

    * 实时调起线程,监控是否scroll停止,来判断是否需要显示imageView

    * @param targetView 需要监控的对象

    */

    public void tellMe(View targetView) {

    if (targetView == null)

    throw new IllegalArgumentException("please set targetView who to scrollTo");

    if (this.targetView == null)

    this.targetView = targetView;

    if (!isStarting) {

    new Thread(scanThread).start();

    }

    }

    此处注意,我偷懒了,没有单独设置方法传递需要滚动的scrollview,在此处引进来了。线程加了判断。此处不要传递scrollview的scrollY值进来。比喻当你手指离开屏幕后,之前传递进来的scrollY就已经过时了,scrollview仍在滑动。在消息回调里面实时获取再判断

    private class MyCallback implements Runnable {

    @Override

    public void run() {

    /**

    * 获取实时的卷动值,不要传递scroll值给我

    */

    endScrollX = targetView.getScrollX();

    int scrollY = targetView.getScrollY();

    if (endScrollY != scrollY) {

    endScrollY = scrollY;

    } else {

    if (endScrollY >= limitHeight) {

    if (!thisStateVisible)

    visible();

    } else {

    if (thisStateVisible)

    gone();

    }

    /**

    * 已判定,卷动停止,显示或隐藏当前view已完成

    * 退出监控scroll线程

    */

    clearCallBacks();

    }

    }

    }

    由于是用线程来检测scrollview的滚动状态,我用了延时消息。此时又有另外一个潜在bug。在自定义imageview中创建了handler属于主线程,子线程中需要发延时消息。如果延时消息发出后,activity退出了呢?反复这么弄呢?有人会说没谁会这么无聊的。但这毕竟还是潜在的OOM。于是我简单的做了线程控制和消息清除的代码,过于简单。感谢评论。

    主要思路和逻辑都分析完了,使用起来很简答,你不用关心自定义imageview里面的逻辑(除非你想改进)。

    在activity中

    private PullToRefreshScrollView mScrollView;

    private ToTopImageView imageView_to_top;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_pull_to_refresh_scroll_view);

    imageView_to_top = (ToTopImageView) findViewById(R.id.imageView_to_top);

    imageView_to_top.setLimitHeight(800);

    mScrollView = (PullToRefreshScrollView) findViewById(R.id.scrollView);

    final ScrollView scrollView = mScrollView.getRefreshableView();

    //mScrollView.setOnTouchListener(); 无效

    scrollView.setOnTouchListener(new View.OnTouchListener() {

    @Override

    public boolean onTouch(View v, MotionEvent event) {

    switch (event.getAction()){

    case MotionEvent.ACTION_MOVE:

    imageView_to_top.tellMe(scrollView);

    break;

    }

    return false;

    }

    });

    }

    @Override

    protected void onDestroy() {

    imageView_to_top.clearCallBacks();

    super.onDestroy();

    }

    页面上,在你觉得合适的位置:

    android:id="@+id/imageView_to_top"

    android:layout_width="50dp"

    android:layout_height="50dp"

    android:layout_alignParentBottom="true"

    android:layout_alignParentRight="true"

    android:layout_marginBottom="5dp"

    android:layout_marginRight="5dp"

    android:background="@drawable/to_top" />

    完事。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • 先看一下Android悬浮按钮点击回到顶部的效果: FloatingActionButton是Design ...我这里是放置一个listView模拟返回顶部 <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android=http://sc
  • 本篇文章主要介绍了android中LinearLayoutManager一键返回顶部,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • 点击按钮返回顶部,直接上代码吧 布局文件 <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android xmlns:app=http://schemas.android.com/apk/res-auto android:layout_width=match_parent ...
  • Android之双击回到顶部

    2021-06-07 04:06:07
    双击回到顶部Android应用中用的很多,众所周知的微信消息列表,朋友圈都提供这样的效果,下面我将自己自项目中的实践记录下来,分享给大家首先:获取双击事件网上有很多的获取双击事件的方法,这里我讲它稍加封装...

    双击回到顶部在Android应用中用的很多,众所周知的微信消息列表,朋友圈都提供这样的效果,下面我将自己自项目中的实践记录下来,分享给大家

    首先:获取双击事件

    网上有很多的获取双击事件的方法,这里我讲它稍加封装,整个工程也可以使用

    首先我们来定义双击事件的接口

    packagecom.....activity.info;

    importandroid.view.View;

    /**

    * @author wfy

    * 单击双击事件接口

    */

    publicinterfaceOnDoubleClickListener {

    publicvoidOnSingleClick(View v);

    publicvoidOnDoubleClick(View v);

    }

    下来定义一个DoubleClick类,它提供一个静态方法给一个view注册双击事件,注释我已经写的及其详细了,不再多说

    packagecom.....activity.info;

    importandroid.os.Handler;

    importandroid.os.Message;

    importandroid.view.View;

    /**

    * @author wfy

    * 消息列表+好友动态的双击回到顶部

    */

    publicclassDoubleClick {

    publicstaticvoidregisterDoubleClickListener(View view,finalOnDoubleClickListener listener){

    if(listener==null)return;

    view.setOnClickListener(newView.OnClickListener() {

    //双击间隔时间350毫秒

    privatestaticfinalintDOUBLE_CLICK_TIME =350;

    privatebooleanflag =true;

    privateHandler handler =newHandler(){

    @Override

    publicvoidhandleMessage(Message msg) {

    listener.OnSingleClick((View)msg.obj);

    }

    };

    //等待双击

    publicvoidonClick(finalView v) {

    if(flag){

    flag = false;//与执行双击事件

    newThread(){

    publicvoidrun() {

    try{

    Thread.sleep(DOUBLE_CLICK_TIME);

    //此时线程沉睡 而flag被修改为false  在DOUBLE_CLICK_TIME内点击则 进入else

    } catch(InterruptedException e) {

    e.printStackTrace();

    }    //等待双击时间,否则执行单击事件

    if(!flag){

    //睡醒了看一看flag被人动过没,没有人动,则认作单击事件

    //因此不建议用此方法执行单击事件 因为会等待睡醒,有点击延迟的存在

    //没有人动,自己把它改成true,以接受下次点击

    flag = true;

    Message msg = handler.obtainMessage();

    msg.obj = v;

    //发个消息,让执行单击

    handler.sendMessage(msg);

    }

    }

    }.start();

    }else{

    flag = true;

    listener.OnDoubleClick(v);    //执行双击

    }

    }

    });

    }

    }

    其次:给你要双击的组件注册双击事件,此处用button演示一下

    Button button=newButton(this);

    DoubleClick.registerDoubleClickListener(button, newOnDoubleClickListener() {

    @Override

    publicvoidOnSingleClick(View v) {

    // TODO Auto-generated method stub

    }

    @Override

    publicvoidOnDoubleClick(View v) {

    // TODO Auto-generated method stub

    GoTopTask task=newGoTopTask();

    task.execute(firstposition);

    }

    });

    最后:细心的会发现,在上面的OnDoubleClick方法中我启动了一个异步任务,下面贴出代码,这是一个内部类

    privateclassGoTopTaskextendsAsyncTask{

    @Override

    protectedvoidonPreExecute() {

    //回到顶部时间置0  此处的时间不是侠义上的时间

    time=0;

    super.onPreExecute();

    }

    @Override

    protectedString doInBackground(Integer... params) {

    // TODO Auto-generated method stub

    for(inti=params[0];i>=0;i--){

    publishProgress(i);

    //返回顶部时间耗费15个item还没回去,则直接去顶部

    //目的:要产生滚动的假象,但也不能耗时过多

    time++;

    if(time>15){

    publishProgress(0);

    returnnull;

    }

    try{

    Thread.sleep(5);

    } catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    returnnull;

    }

    @Override

    protectedvoidonProgressUpdate(Integer... values) {

    lv.setSelection(values[0]);

    super.onProgressUpdate(values);

    }

    @Override

    protectedvoidonPostExecute(String result) {

    super.onPostExecute(result);

    }

    @Override

    protectedvoidonCancelled() {

    // TODO Auto-generated method stub

    super.onCancelled();

    }

    }

    写到这里相信大家都明白思路了,就是用lv.setSelection(0)让list回到顶部,可是这里存在三个问题:1、直接闪回到顶部用户体验不是很好,很突兀   2、如1所说,那一个个往会显示,可是你有1000个item,我看到好几百个时,往回一个一个滚吗?相信没有人有那个耐心等   3、不能每次都从最后往会滚,从当前可见的第一个item滚,那么如何获取当前可见的第一个item?

    对于第一个问题和第二个问题:我在异步任务里已经做了判断,先一个一个滚,滚到第十五个(也就是异步任务里的time)还没回去则直接回顶部,这样既有了滚动的动作,也不会因为有好多item让用户等待太久

    对于第三个问题:首先在当前的activity里定义一个静态的变量,用来持续追踪当前可见的第一个item,然后通过监听lv滚动事件实时修改firstposition,这里贴出代码

    lv.setOnScrollListener(newOnScrollListener() {

    @Override

    publicvoidonScrollStateChanged(AbsListView view,intscrollState) {

    // TODO Auto-generated method stub

    }

    @Override

    publicvoidonScroll(AbsListView view,intfirstVisibleItem,

    intvisibleItemCount,inttotalItemCount) {

    // TODO Auto-generated method stub

    firstposition=firstVisibleItem;

    }

    });

    好了,到这里就大功告成了,是不是很简单,之所以写的很详细,是想让看的人理解,而不是仅仅copy我的code,理解了就是自己的,方法很重要。

    展开全文
  • //获取到第一个item的显示的下标 不等于0表示第一个item处于不可见状态 说明列表没有滑动到顶部 显示回到顶部按钮 int firstVisibleItemPosition = manager.findFirstVisibleItemPosition(); // 当不滚动时 if (new...

    1、添加悬浮按钮

    650e205f3355363dea077c626bad128a.png

    2、实例化

    returnTop = view.findViewById(R.id.fab);

    3、recycleView添加滑动事件

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override

    public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, int newState) {

    super.onScrollStateChanged(recyclerView, newState);

    //获得recyclerView的线性布局管理器

    LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();

    //获取到第一个item的显示的下标 不等于0表示第一个item处于不可见状态 说明列表没有滑动到顶部 显示回到顶部按钮

    int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();

    // 当不滚动时

    if (newState == RecyclerView.SCROLL_STATE_IDLE) {

    // 判断是否滚动超过一屏

    if (firstVisibleItemPosition == 0) {

    returnTop.hide();

    } else {

    //显示回到顶部按钮

    returnTop.show();

    returnTop.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

    recyclerView.scrollToPosition(0);

    }

    });

    }//获取RecyclerView滑动时候的状态

    }

    // else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖动中

    // returnTop.hide();

    // }

    }

    });

    RecyclerView有三个滑动状态:

    当前的recycleView不滑动(滑动已经停止时) public static final int SCROLL_STATE_IDLE = 0;

    当前的recycleView被拖动滑动 public static final int SCROLL_STATE_DRAGGING = 1;

    当前的recycleView在滚动到某个位置的动画过程,但没有被触摸滚动.调用 scrollToPosition(int) 应该会触发这个状态 public static final int SCROLL_STATE_SETTLING = 2;

    352c6e7bc67fc395fee7777c32cea450.png

    展开全文
  • Android】Listview返回顶部,快速返回顶部的功能实现,详解代码
  • 自己按照element-ui的思路写了一个返回顶部的公共居中,使用在移动端。在PC上的模拟器和IOS手机正常,在安卓上跑,居然没有效果。气死人了。 原因分析 document.documentElement.scrollTop在值,在安卓端,始终是0。...
  • Android返回顶部实现

    千次阅读 2017-02-17 09:36:50
    点击按钮返回顶部
  • 主要为大家详细介绍了Material Design系列之Behavior上滑显示返回顶部按钮的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 一、CoordinatorLayout返回顶部: CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) indexAppBar.getLayoutParams()).getBehavior(); if (behavior instanceof AppBarLa...
  • Android 回到顶部

    2021-07-23 20:20:30
    思路 这里以 RecyclerView为例,添加监听... 调用 public void updateUp(boolean flag) { if (flag) { //显示回到顶部按钮 test.setText("回顶部"); } else { //正常显示 test.setText("首页"); } }
  • 返回顶部按钮

    2019-10-28 15:51:45
    在浏览多条数据时,如果浏览到数据的顶部,想返回到数据的顶部,只需要单击返回顶部按钮。 本代码将实现在页面中添加“返回顶部”按钮。
  • 一直都是在PC端写返回顶部的按钮,今天的项目是移动端,页面内容比较多,也有滚动顶部的功能,于是一开始用了原生的的写法,没有用,经过调试,滚动时获取不到滚动的高度。接着又换了一个gototop.js插件,还是无效,...
  • 首先给大家看一下我们今天这个最终实现的效果图...我这里只是单纯的实现了ListView返回顶部的功能。具体效果大家可以适当地美化 在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。 好了,首先我们是当
  • 首先给大家看一下我们今天这个最终实现的效果...我这里只是单纯的实现了scrollview返回顶部的功能。具体效果大家可以适当地美化 在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。 好了,首先我们是当
  • 也即是在每个逻辑子屏幕的顶部添加返回到逻辑父屏幕的箭头: 这个按钮叫做:向上导航按钮 我们一起来看看官网是怎么说的: 要添加向上按钮,您需要在 AndroidManifest.xml 文件中声明哪个 Activity 是逻辑父级。打开...
  • js 返回顶部按钮

    2021-01-12 10:59:26
    要求:当鼠标从顶部滚动后,显示返回顶部按钮,点击按钮,页面平滑滚动到顶部,按钮隐藏。1.css#scrollTop{position:fixed;bottom:20px;right:20px;height:0px;width:45px;line-height:45px;text-align:center;...
  • NestedScrollView嵌套Recyclerview部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部 部分布局大致如下 <androidx.core.widget.NestedScrollView android:layout_width="match_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,215
精华内容 12,486
关键字:

安卓 返回顶部