美文网首页
android新特性:商城首页一键回到顶部功能实现(包括List

android新特性:商城首页一键回到顶部功能实现(包括List

作者: 黄晓果 | 来源:发表于2017-02-10 23:24 被阅读0次

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

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

    说道难的一点,其实就是选择器比较难写一点,这里提供了鸿洋大神一篇自己写的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

    相关文章

      网友评论

          本文标题:android新特性:商城首页一键回到顶部功能实现(包括List

          本文链接:https://www.haomeiwen.com/subject/fmunittx.html