android新特性:商城首页一键回到顶部功能实现(包括ListView, RecyclerView 和 ScrollView)

一般只要做商城的大家都知道或都见过有个悬浮按钮,当你向下滑动到一定的位置的时候他就会乖乖的弹出了!当你点击一下他就会跳转到页面的顶部(其实可以是任何位置的),在顶部的时候他就会乖乖的消失。

当然大家自己可以写一个,但是需要自己处理但各种触摸事件和动画效果,我建议大家有时间自己写写,也不难的!

说道难的一点,其实就是选择器比较难写一点,这里提供了鸿洋大神一篇自己写的drawable/fab.xml看着真心都有点辛苦。

博客地址为:http://blog.csdn.net/lmj623565791/article/details/46678867

在这里我使用的是FloatingActionButton这个库,推荐以后多使用CoordinatorLayout这个库让你的APP提示一个档次

先看看效果怎么样:ListView, RecyclerView效果差不多

20161217160340960.gif

ScrollView效果


20161217160513564.gif

首先先介绍一下FloatingActionButton的该怎么用

导入FloatingActionButton ,在你的app.build进行引入:

 dependencies {
compile 'com.melnykov:floatingactionbutton:1.3.0'
}

FloatingActionButton 的属性信息

 <com.melnykov.fab.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_margin="15dp"
            android:src="@mipmap/ic_launcher"
            fab:fab_colorNormal="@color/pink"
            fab:fab_colorPressed="@color/pink_pressed"
            fab:fab_colorRipple="@color/ripple" />

正常使用的FloatingActionButton 大小为56dp
如果设置为mini类型的话就是40dp

如果想直接设置他的属性就在跟布局下添加:

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

设置大小的话:

fab:fab_type="mini"

or

fab.setType(FloatingActionButton.TYPE_MINI);

设置颜色的话:

fab:fab_colorNormal="@color/primary"
fab:fab_colorPressed="@color/primary_pressed"

or

fab.setColorNormal(getResources().getColor(R.color.primary));
fab.setColorPressed(getResources().getColor(R.color.primary_pressed));

设置是否显示就用:

fab:fab_shadow="false"

or

fab.setShadow(false);
一般页面初始化onCreate方法中就设置,不然你会发现,刚进入页面FloatingActionButton 会闪现。

设置显示和隐藏

fab.show();
fab.hide();
上面两有动画
fab.show(false); 
fab.hide(false); 
这两个不会显示动画了

设置渐变色,就是点击的时候:

fab:fab_colorRipple="@color/ripple"

or

fab.setColorRipple(getResources().getColor(R.color.ripple));

在FloatingActionButton 上面添加个图片(例如向上的箭头)

在xml使用android:src即可,主要不要太大,你懂得...

好了进入正题:

第一、先看看FloatingActionButton在Listview中使用:

1、布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_floating_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.hnshangyu.floatingactionbuttondemo.FloatingListViewActivity">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.melnykov.fab.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="15dp"
        android:src="@mipmap/ic_launcher"
        fab:fab_colorNormal="@color/pink"
        fab:fab_colorPressed="@color/pink_pressed"
        fab:fab_colorRipple="@color/ripple" />

</RelativeLayout>

2、然后为listview填充数据,我就不写了,直接看操作

private void initView() {
        list = (ListView) findViewById(R.id.list);
        fab = (FloatingActionButton) findViewById(R.id.fab);
        //首先隐藏防止FloatingActionButton闪屏
        fab.hide(false);
        list.setAdapter(new myAdapter());
        //设置为小图
        //fab.setType(FloatingActionButton.TYPE_MINI);或布局中:fab:fab_type="mini"
        fab.attachToListView(list, new ScrollDirectionListener() {
            @Override
            public void onScrollDown() {
                fab.hide();
            }

            @Override
            public void onScrollUp() {
                fab.show();
            }
        }, new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int position) {
            }

            @Override
            public void onScroll(AbsListView absListView, int position, int positiontwo, int i2) {
                if (position > 5) {
                    fab.show();
                } else {
                    fab.hide();
                }
            }
        });

    }

    private void initListener() {
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.setSelection(0);
            }
        });
    }

第二、FloatingActionButton在RecyclerView中使用:

1、布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:fab="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/activity_floating_recycler_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="cn.hnshangyu.floatingactionbuttondemo.FloatingRecyclerViewActivity">

   <android.support.v7.widget.RecyclerView
       android:id="@+id/recyclerview"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

   <com.melnykov.fab.FloatingActionButton
       android:id="@+id/fab"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:layout_margin="15dp"
       android:src="@mipmap/ic_launcher"
       fab:fab_colorNormal="@color/pink"
       fab:fab_colorPressed="@color/pink_pressed"
       fab:fab_colorRipple="@color/ripple" />
</RelativeLayout>

2、实现方法:

private void initView() {
       fab.hide(false);
       recyclerview.setAdapter(new RecyclerViewAdapter(mContext, nameList));
       //设置为小图
       //fab.setType(FloatingActionButton.TYPE_MINI);或布局中:fab:fab_type="mini"
       fab.attachToRecyclerView(recyclerview, new ScrollDirectionListener() {
           @Override
           public void onScrollDown() {
               fab.hide();
           }

           @Override
           public void onScrollUp() {
               fab.show();
           }
       }, new RecyclerView.OnScrollListener() {
           @Override
           public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
               super.onScrolled(recyclerView, dx, dy);
               RecyclerView.LayoutManager layoutManager = recyclerview.getLayoutManager();
               if (layoutManager instanceof LinearLayoutManager) {
                   LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                   int firstVisibleItemPosition = linearManager.findFirstVisibleItemPosition();
                   if (firstVisibleItemPosition > 5) {
                       fab.show();
                   } else {
                       fab.hide();
                   }
               }
           }

           @Override
           public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
               super.onScrollStateChanged(recyclerView, newState);
           }
       });
   }

   private void initListener() {
       fab.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               UIUtils.MoveToPosition(manager,0);
//                UIUtils.MoveToPosition(new LinearLayoutManager(mContext), recyclerview, 0);

               fab.hide();

           }
       });
   }

3、跳转的两种方式:

package cn.hnshangyu.floatingactionbuttondemo.utils;

import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class UIUtils {

   /**
    * RecyclerView 移动到当前位置,
    *
    * @param manager
    * @param mRecyclerView
    * @param n
    */
   public static void MoveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int n) {


       int firstItem = manager.findFirstVisibleItemPosition();
       int lastItem = manager.findLastVisibleItemPosition();
       if (n <= firstItem) {
           mRecyclerView.scrollToPosition(n);
       } else if (n <= lastItem) {
           int top = mRecyclerView.getChildAt(n - firstItem).getTop();
           mRecyclerView.scrollBy(0, top);
       } else {
           mRecyclerView.scrollToPosition(n);
       }

   }

   /**
    * RecyclerView 移动到当前位置,
    *
    * @param manager
    * @param n
    */
   public static void MoveToPosition(LinearLayoutManager manager, int n) {
       manager.scrollToPositionWithOffset(n, 0);
       manager.setStackFromEnd(true);
   }
}

第二、FloatingActionButton在ScrollView中使用:

在这里大家注意的是:这里的ScrollView类库中重写了,用他的ObservableScrollView,他实现了后面我们需要的接口
1、布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:fab="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/activity_floating_scroll_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="cn.hnshangyu.floatingactionbuttondemo.FloatingScrollViewActivity">
   <com.melnykov.fab.ObservableScrollView
       android:id="@+id/scrollview"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <LinearLayout
           android:id="@+id/ll_scrollView"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:orientation="vertical">

           <ImageView
               android:id="@+id/iv_pic"
               android:layout_width="match_parent"
               android:layout_height="220dp"
              android:background="@mipmap/pic2" />
       </LinearLayout>
   </com.melnykov.fab.ObservableScrollView>

   <com.melnykov.fab.FloatingActionButton
       android:id="@+id/fab"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:layout_margin="15dp"
       android:src="@mipmap/ic_launcher"
       fab:fab_colorNormal="@color/pink"
       fab:fab_colorPressed="@color/pink_pressed"
       fab:fab_colorRipple="@color/ripple" />
</RelativeLayout>

2、实现方法:

private void initView() {
       fab.hide(false);
       fab.attachToScrollView(scrollview, new ScrollDirectionListener() {
           @Override
           public void onScrollDown() {
               fab.hide();
           }

           @Override
           public void onScrollUp() {
               fab.show();
           }
       }, new ObservableScrollView.OnScrollChangedListener() {
           @Override
           public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
               if (t > ivPic.getHeight()) {
                   fab.show();
               } else {
                   fab.hide();
               }
           }
       });
   }

//    滚到到底部:
//            mRootScrollView.fullScroll(ScrollView.FOCUS_DOWN);
//    滚动到顶部:
//            mRootScrollView.fullScroll(ScrollView.FOCUS_UP);
//    直接跳到某一位置
//    scrollView.scrollTo(0, 300);
//    滚动到某一位置
//     scrollView.smoothScrollTo(0, offset);

   private void initListener() {
       fab.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               scrollview.fullScroll(ScrollView.FOCUS_UP);
           }
       });
   }

到此就基本实现了,有什么指教欢迎指出,谢谢…..
demo下载地址:http://download.csdn.net/download/huangxiaoguo1/9714115

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容