FloatingActionButton(悬浮按钮)使用学习<一>

 
FloatingActionButton简称FAB。
 

一. 对于App或某个页面中是否要使用FloatingActionButton必要性:

    FAB代表一个App或一个页面中最主要的操作,如果一个App的每个页面都有FAB,则通常表示该App最主要的功能是通过该FAB操作的。

    为了突出FAB的重要性,一个页面最好只有一个FAB
   
二. FloatingActionButton大小
    通常有两种尺寸
    1. 56 * 56dp :默认的大小,最常用的尺寸。
    2. 40 * 40 dp :Mini版。
    当然也可以改它的大小。


    FAB中间的图标,google推荐的大小是:24 * 24dp
 
三. 哪些操作推荐使用FloatingActionButton
   如: 添加,收藏,编辑,分享,导航等,如下图:
   
   而如:删除,警告,错误,剪切等操作,则不推荐使用FloatingActionButton
 
 
 
四. FAB的使用
 Android 5.0 中引入Material DesignFAB为Android Design Support Library支持包中的中Material Design控件,要使用FAB,先要引入Design Support Library包,如:在build.gradle中加入: compile 'com.android.support:design:X.X.X',X为支持包版本号,如下图:

 
 FAB的继承关系:
    
 
 FAB的XMl属性除了继承自View,ImageView的属性外,Android 5.0后引入的常用新属性如下:
    注:使用下面属性,先要引入命名空间:xmlns:app="http://schemas.android.com/apk/res-auto"
      1>   app:elevation="50dp":阴影的高度,elevation是Android 5.0中引入的新属性,设置该属性使控件有一个阴影,感觉该控件像是“浮”起来一样,这样达到3D效果。对应的方法:setCompatElevation(float)
      2>   app:fabSize="normal":FAB的大小,为normal时,大小为:56 * 56dp ,为mini时,大小为: 40 * 40 dp。
     3>  app:backgroundTint="#31bfcf":FAB的背景颜色。
     4>  app:rippleColor="#e7d16b":点击FAB时,形成的波纹颜色。
 
    <一> 使用例子1: 简单使用FAB
     点击“+”悬浮按钮,弹出悬浮按钮菜单,效果如下:
     代码如下
     XMl布局:
  1 <?xml version="1.0" encoding="utf-8"?>
  2 <RelativeLayout
  3     xmlns:android="http://schemas.android.com/apk/res/android"
  4     xmlns:app="http://schemas.android.com/apk/res-auto"
  5     android:layout_width="match_parent"
  6     android:layout_height="match_parent"
  7     >
  8     <CheckBox
  9         android:id="@+id/cbDelay"
 10         android:layout_width="wrap_content"
 11         android:layout_height="wrap_content"
 12         android:text="delay"
 13         android:layout_marginTop="10dp"
 14         android:layout_marginLeft="10dp"
 15         />
 16     <RelativeLayout
 17         android:id="@+id/rlAddBill"
 18         android:layout_width="match_parent"
 19         android:layout_height="match_parent"
 20         android:background="#80000000"
 21         android:visibility="gone"
 22         >
 23             <LinearLayout
 24                 android:id="@+id/ll01"
 25                 android:layout_width="match_parent"
 26                 android:layout_height="wrap_content"
 27                 android:layout_alignParentBottom="true"
 28                 android:layout_marginBottom="100dp"
 29                 android:orientation="horizontal"
 30                 >
 31                     <TextView
 32                         android:layout_toLeftOf="@+id/miniFab01"
 33                         android:layout_width="0dp"
 34                         android:layout_height="wrap_content"
 35                         android:layout_weight="1"
 36                         android:text="销售单"
 37                         android:textSize="15sp"
 38                         android:textColor="@android:color/white"
 39                         android:layout_gravity="center_vertical"
 40                         android:gravity="right"
 41                         android:paddingBottom="5dp"
 42                        />
 43                     <android.support.design.widget.FloatingActionButton
 44                         android:id="@+id/miniFab01"
 45                         android:layout_width="wrap_content"
 46                         android:layout_height="wrap_content"
 47                         android:src="@mipmap/ic_list_white_24dp"
 48                         android:layout_marginRight="25dp"
 49                         app:fabSize="mini"
 50                         app:elevation="5dp"
 51                         app:backgroundTint="@color/color_XSD"
 52                         />
 53             </LinearLayout>
 54            <LinearLayout
 55                 android:id="@+id/ll02"
 56                 android:layout_width="match_parent"
 57                 android:layout_height="wrap_content"
 58                 android:orientation="horizontal"
 59                 android:layout_above="@+id/ll01"
 60                 >
 61             <TextView
 62                 android:layout_toLeftOf="@+id/miniFab02"
 63                 android:layout_width="0dp"
 64                 android:layout_height="wrap_content"
 65                 android:layout_weight="1"
 66                 android:text="销售退货"
 67                 android:textSize="15sp"
 68                 android:textColor="@android:color/white"
 69                 android:layout_gravity="center_vertical"
 70                 android:gravity="right"
 71                 android:paddingBottom="5dp"
 72                 />
 73             <android.support.design.widget.FloatingActionButton
 74                 android:id="@+id/miniFab02"
 75                 android:layout_width="wrap_content"
 76                 android:layout_height="wrap_content"
 77                 android:src="@mipmap/ic_list_white_24dp"
 78                 android:layout_marginRight="25dp"
 79                 app:fabSize="mini"
 80                 app:elevation="5dp"
 81                 app:backgroundTint="@color/color_XSTH"
 82                 />
 83         </LinearLayout>
 84         <LinearLayout
 85             android:id="@+id/ll03"
 86             android:layout_width="match_parent"
 87             android:layout_height="wrap_content"
 88             android:orientation="horizontal"
 89             android:layout_above="@+id/ll02"
 90             >
 91             <TextView
 92                 android:layout_toLeftOf="@+id/miniFab02"
 93                 android:layout_width="0dp"
 94                 android:layout_height="wrap_content"
 95                 android:layout_weight="1"
 96                 android:text="收款单"
 97                 android:textSize="15sp"
 98                 android:textColor="@android:color/white"
 99                 android:layout_gravity="center_vertical"
100                 android:gravity="right"
101                 android:paddingBottom="5dp"
102                 />
103             <android.support.design.widget.FloatingActionButton
104                 android:id="@+id/miniFab03"
105                 android:layout_width="wrap_content"
106                 android:layout_height="wrap_content"
107                 android:src="@mipmap/ic_list_white_24dp"
108                 android:layout_marginRight="25dp"
109                 app:fabSize="mini"
110                 app:elevation="5dp"
111                 app:backgroundTint="@color/color_SKD"
112                 />
113         </LinearLayout>
114         <LinearLayout
115             android:id="@+id/ll04"
116             android:layout_width="match_parent"
117             android:layout_height="wrap_content"
118             android:orientation="horizontal"
119             android:layout_above="@+id/ll03"
120             >
121             <TextView
122                 android:layout_toLeftOf="@+id/miniFab02"
123                 android:layout_width="0dp"
124                 android:layout_height="wrap_content"
125                 android:layout_weight="1"
126                 android:text="进货单"
127                 android:textSize="15sp"
128                 android:textColor="@android:color/white"
129                 android:layout_gravity="center_vertical"
130                 android:gravity="right"
131                 android:paddingBottom="5dp"
132                 />
133             <android.support.design.widget.FloatingActionButton
134                 android:id="@+id/miniFab04"
135                 android:layout_width="wrap_content"
136                 android:layout_height="wrap_content"
137                 android:src="@mipmap/ic_list_white_24dp"
138                 android:layout_marginRight="25dp"
139                 app:fabSize="mini"
140                 app:elevation="5dp"
141                 app:backgroundTint="@color/color_JHD"
142                 />
143         </LinearLayout>
144         <LinearLayout
145             android:id="@+id/ll05"
146             android:layout_width="match_parent"
147             android:layout_height="wrap_content"
148             android:orientation="horizontal"
149             android:layout_above="@+id/ll04"
150             >
151             <TextView
152                 android:layout_toLeftOf="@+id/miniFab02"
153                 android:layout_width="0dp"
154                 android:layout_height="wrap_content"
155                 android:layout_weight="1"
156                 android:text="采购退货"
157                 android:textSize="15sp"
158                 android:textColor="@android:color/white"
159                 android:layout_gravity="center_vertical"
160                 android:gravity="right"
161                 android:paddingBottom="5dp"
162                 />
163             <android.support.design.widget.FloatingActionButton
164                 android:id="@+id/miniFab05"
165                 android:layout_width="wrap_content"
166                 android:layout_height="wrap_content"
167                 android:src="@mipmap/ic_list_white_24dp"
168                 android:layout_marginRight="25dp"
169                 app:fabSize="mini"
170                 app:elevation="5dp"
171                 app:backgroundTint="@color/color_CGTH"
172                 />
173         </LinearLayout>
174         <LinearLayout
175             android:id="@+id/ll06"
176             android:layout_width="match_parent"
177             android:layout_height="wrap_content"
178             android:orientation="horizontal"
179             android:layout_above="@+id/ll05"
180             >
181             <TextView
182                 android:layout_toLeftOf="@+id/miniFab02"
183                 android:layout_width="0dp"
184                 android:layout_height="wrap_content"
185                 android:layout_weight="1"
186                 android:text="付款单"
187                 android:textSize="15sp"
188                 android:textColor="@android:color/white"
189                 android:layout_gravity="center_vertical"
190                 android:gravity="right"
191                 android:paddingBottom="5dp"
192                 />
193             <android.support.design.widget.FloatingActionButton
194                 android:id="@+id/miniFab06"
195                 android:layout_width="wrap_content"
196                 android:layout_height="wrap_content"
197                 android:src="@mipmap/ic_list_white_24dp"
198                 android:layout_marginRight="25dp"
199                 app:fabSize="mini"
200                 app:elevation="5dp"
201                 app:backgroundTint="@color/color_FKD"
202                 />
203         </LinearLayout>
204     </RelativeLayout>
205     <android.support.design.widget.FloatingActionButton
206         android:id="@+id/fab01Add"
207         android:layout_width="wrap_content"
208         android:layout_height="wrap_content"
209         android:layout_alignParentRight="true"
210         android:layout_alignParentBottom="true"
211         android:src="@mipmap/ic_add_white_24dp"
212         android:layout_marginRight="15dp"
213         android:layout_marginBottom="20dp"
214         app:fabSize="normal"
215         app:elevation="5dp"
216         app:backgroundTint="#31bfcf"
217         app:rippleColor="#e7d161"
218         />
219 </RelativeLayout>

  Java代码:

  1 package com.zst.floatactionbutton;
  2 import android.animation.Animator;
  3 import android.animation.AnimatorInflater;
  4 import android.animation.AnimatorSet;
  5 import android.content.Intent;
  6 import android.content.res.ColorStateList;
  7 import android.os.Bundle;
  8 import android.support.annotation.Nullable;
  9 import android.support.design.widget.FloatingActionButton;
 10 import android.support.v7.app.AppCompatActivity;
 11 import android.view.View;
 12 import android.view.WindowManager;
 13 import android.widget.CheckBox;
 14 import android.widget.LinearLayout;
 15 import android.widget.RelativeLayout;
 16 /**
 17  * Created by shengtao_zeng on 2016/11/10.
 18  */
 19 public class BasicFABActivity extends AppCompatActivity implements View.OnClickListener{
 20     private CheckBox cbDelay;
 21     private FloatingActionButton fab01Add;
 22     private boolean isAdd = false;
 23     private RelativeLayout rlAddBill;
 24     private int[] llId = new int[]{R.id.ll01,R.id.ll02,R.id.ll03,R.id.ll04,R.id.ll05,R.id.ll06};
 25     private LinearLayout[] ll = new LinearLayout[llId.length];
 26     private int[] fabId = new int[]{R.id.miniFab01,R.id.miniFab02,R.id.miniFab03,R.id.miniFab04,R.id.miniFab05,R.id.miniFab06};
 27     private FloatingActionButton[] fab = new FloatingActionButton[fabId.length];
 28     private AnimatorSet addBillTranslate1;
 29     private AnimatorSet addBillTranslate2;
 30     private AnimatorSet addBillTranslate3;
 31     private AnimatorSet addBillTranslate4;
 32     private AnimatorSet addBillTranslate5;
 33     private AnimatorSet addBillTranslate6;
 34     @Override
 35     protected void onCreate(@Nullable Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.basic_fab_activity);
 38         initView();
 39         setDefaultValues();
 40         bindEvents();
 41     }
 42     private void initView(){
 43         cbDelay  = (CheckBox)findViewById(R.id.cbDelay);
 44         fab01Add = (FloatingActionButton)findViewById(R.id.fab01Add);
 45         rlAddBill = (RelativeLayout)findViewById(R.id.rlAddBill);
 46         for (int i = 0; i < llId.length;i++){
 47             ll[i] = (LinearLayout)findViewById(llId[i]);
 48         }
 49         for (int i = 0;i < fabId.length; i++){
 50             fab[i] = (FloatingActionButton)findViewById(fabId[i]);
 51         }
 52     }
 53     private void setDefaultValues(){
 54         addBillTranslate1 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 55         addBillTranslate2 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 56         addBillTranslate3 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 57         addBillTranslate4 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 58         addBillTranslate5 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 59         addBillTranslate6 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.add_bill_anim);
 60     }
 61     private void bindEvents(){
 62         fab01Add.setOnClickListener(this);
 63         for (int i = 0;i < fabId.length; i++){
 64             fab[i].setOnClickListener(this);
 65         }
 66     }
 67     @Override
 68     public void onClick(View v) {
 69         switch (v.getId()) {
 70             case R.id.fab01Add:
 71                 fab01Add.setImageResource(isAdd ? R.mipmap.ic_add_white_24dp:R.mipmap.ic_close_white_24dp);
 72                 isAdd = !isAdd;
 73                 rlAddBill.setVisibility(isAdd ? View.VISIBLE : View.GONE);
 74                 if (isAdd) {
 75                     addBillTranslate1.setTarget(ll[0]);
 76                     addBillTranslate1.start();
 77                     addBillTranslate2.setTarget(ll[1]);
 78                     addBillTranslate2.setStartDelay(cbDelay.isChecked() ? 150 : 0);
 79                     addBillTranslate2.start();
 80                     addBillTranslate3.setTarget(ll[2]);
 81                     addBillTranslate3.setStartDelay(cbDelay.isChecked() ? 200 : 0);
 82                     addBillTranslate3.start();
 83                     addBillTranslate4.setTarget(ll[3]);
 84                     addBillTranslate4.setStartDelay(cbDelay.isChecked() ? 250 : 0);
 85                     addBillTranslate4.start();
 86                     addBillTranslate5.setTarget(ll[4]);
 87                     addBillTranslate5.setStartDelay(cbDelay.isChecked() ? 300 : 0);
 88                     addBillTranslate5.start();
 89                     addBillTranslate6.setTarget(ll[5]);
 90                     addBillTranslate6.setStartDelay(cbDelay.isChecked() ? 350 : 0);
 91                     addBillTranslate6.start();
 92                 }
 93                 break;
 94             case R.id.miniFab01:
 95                 hideFABMenu();
 96                 break;
 97             case R.id.miniFab02:
 98                 hideFABMenu();
 99                 break;
100             case R.id.miniFab03:
101                 hideFABMenu();
102                 break;
103             case R.id.miniFab04:
104                 hideFABMenu();
105                 break;
106             case R.id.miniFab05:
107                 hideFABMenu();
108                 break;
109             case R.id.miniFab06:
110                 hideFABMenu();
111                 break;
112             default:
113                 break;
114         }
115     }
116     private void hideFABMenu(){
117         rlAddBill.setVisibility(View.GONE);
118         fab01Add.setImageResource(R.mipmap.ic_add_white_24dp);
119         isAdd = false;
120     }
121 }

  Property Animation定义:

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:ordering="sequentially"
 4     >
 5     <set
 6         android:ordering="together"
 7         >
 8         <objectAnimator
 9             android:propertyName="translationY"
10             android:valueFrom="100.00"
11             android:valueTo="-50.00"
12             android:duration="100"
13             android:startOffset="0"
14             android:repeatCount="0"
15             android:valueType="floatType"
16             />
17         <objectAnimator
18             android:propertyName="alpha"
19             android:valueFrom="0.00"
20             android:valueTo="1.00"
21             android:duration="100"
22             android:startOffset="0"
23             android:valueType="floatType"
24             android:repeatCount="0"
25             />
26         <objectAnimator
27             android:propertyName="scaleY"
28             android:valueFrom="0.00"
29             android:valueTo="1.50"
30             android:duration="100"
31             android:startOffset="0"
32             android:valueType="floatType"
33             android:repeatCount="0"
34             />
35     </set>
36     <set
37         android:ordering="together"
38         >
39         <objectAnimator
40             android:propertyName="translationY"
41             android:valueTo="0.00"
42             android:duration="100"
43             android:startOffset="0"
44             android:repeatCount="0"
45             android:valueType="floatType"
46             />
47         <objectAnimator
48             android:propertyName="scaleY"
49             android:valueTo="1.0"
50             android:duration="100"
51             android:startOffset="0"
52             android:valueType="floatType"
53             android:repeatCount="0"
54             />
55     </set>
56 </set>

 

 

 

 
 
    <二> 使用例子2: FAB和ListView 的结合使用
           效果如下:
                        
 
 
                            a>  ListView向下滚动时,添加联系人的悬浮按钮隐藏。
                            b>  ListView向上滚动时,添加联系人的悬浮按钮显示。
                            c>  ListView向下滚动1/4时,会显示“回到顶部”的悬浮按钮,点击该按钮,ListView显示的顶部Item返回到第一个Item。
                
       ListView滚动和FAB的隐藏/显示的关系逻辑如下图:
                            
     代码如下:
      XML布局:
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:app="http://schemas.android.com/apk/res-auto"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     >
 8     <ListView
 9         android:id="@+id/lvContacts"
10         android:layout_width="match_parent"
11         android:layout_height="match_parent"
12         android:divider="#80000000"
13         android:dividerHeight="1px"
14         >
15     </ListView>
16     <android.support.design.widget.FloatingActionButton
17         android:id="@+id/fabAddContact"
18         android:layout_width="wrap_content"
19         android:layout_height="wrap_content"
20         android:layout_marginBottom="16dp"
21         android:layout_marginRight="8dp"
22         android:src="@mipmap/ic_person_add_white_24dp"
23         app:fabSize="normal"
24         android:layout_alignParentBottom="true"
25         android:layout_alignParentRight="true"
26         />
27     <android.support.design.widget.FloatingActionButton
28         android:id="@+id/fabUp"
29         android:layout_above="@+id/fabAddContact"
30         android:layout_width="wrap_content"
31         android:layout_height="wrap_content"
32         android:layout_marginBottom="16dp"
33         android:layout_marginRight="20dp"
34         android:src="@mipmap/ic_keyboard_arrow_up_white_24dp"
35         app:fabSize="mini"
36         android:layout_alignParentRight="true"
37         app:backgroundTint="#92be0a"
38         android:visibility="gone"
39         />
40 </RelativeLayout>
    主逻辑代码:
  1 package com.zst.floatactionbutton;
  2 import android.animation.AnimatorInflater;
  3 import android.animation.AnimatorSet;
  4 import android.content.Context;
  5 import android.os.Bundle;
  6 import android.support.annotation.Nullable;
  7 import android.support.design.widget.FloatingActionButton;
  8 import android.support.v7.app.AppCompatActivity;
  9 import android.view.LayoutInflater;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.AbsListView;
 13 import android.widget.BaseAdapter;
 14 import android.widget.ListView;
 15 import android.widget.TextView;
 16 import java.util.ArrayList;
 17 import java.util.List;
 18 
 19 public class FABInListViewActivity extends AppCompatActivity implements View.OnClickListener{
 20     private ListView lvContacts;
 21     private ContactsAdapter adapter;
 22     private List<String> list = new ArrayList<>();
 23     private long  mNumber = 13812007799L;
 24     private FloatingActionButton fabAddContact;
 25     private FloatingActionButton fabUp;
 26     private AnimatorSet mHideFAB;
 27     private AnimatorSet mShowFAB;
 28     private boolean FAB_VISIBLE = true;
 29     private int mPreviousFirstVisibleItem;   //记录前面第一个Item
 30     private int mLastScrollY;            //记录ListView中最上面的Item(View)的上一次顶部Y坐标()
 31     private int mScrollThreshold = 2;   //阈值:单位px
 32     @Override
 33     protected void onCreate(@Nullable Bundle savedInstanceState) {
 34         super.onCreate(savedInstanceState);
 35         setContentView(R.layout.fab_in_listview_activity);
 36         initView();
 37         setDefaultValues();
 38         bindEvents();
 39     }
 40     private void initView(){
 41         lvContacts = (ListView)findViewById(R.id.lvContacts);
 42         fabAddContact = (FloatingActionButton)findViewById(R.id.fabAddContact);
 43         fabUp = (FloatingActionButton)findViewById(R.id.fabUp);
 44     }
 45     private void setDefaultValues(){
 46         for (int i = 0; i < 100;i++){
 47             list.add("Contact" + i + "+" + (mNumber + i));
 48         }
 49         adapter = new ContactsAdapter(this,list);
 50         lvContacts.setAdapter(adapter);
 51         initAnimation();
 52     }
 53     private void initAnimation(){
 54         mHideFAB = (AnimatorSet)AnimatorInflater.loadAnimator(this,R.animator.scroll_hide_fab);
 55         mShowFAB = (AnimatorSet)AnimatorInflater.loadAnimator(this,R.animator.scroll_show_fab);
 56         mHideFAB.setTarget(fabAddContact);
 57         mShowFAB.setTarget(fabAddContact);
 58     }
 59     private void bindEvents(){
 60         fabUp.setOnClickListener(this);
 61         lvContacts.setOnScrollListener(new AbsListView.OnScrollListener() {
 62             @Override
 63             public void onScrollStateChanged(AbsListView view, int scrollState) {
 64 //                if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {  //停止滚动
 65                     //showFAB();
 66 //                }
 67             }
 68             @Override
 69             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
 70                 if(totalItemCount == 0) {
 71                     showFAB();
 72                     return;
 73                 }
 74                 //滚动过程中:ListView中最上面一个Item还是同一个Item
 75                 if(isSameRow(firstVisibleItem)) {
 76                     int newScrollY = getTopItemScrollY();
 77                     boolean isExceedThreshold = Math.abs(mLastScrollY - newScrollY) > mScrollThreshold;
 78                     if (isExceedThreshold) {
 79                         if (mLastScrollY > newScrollY && FAB_VISIBLE == true) {
 80                             FAB_VISIBLE = false;
 81                             hideFAB();
 82                         } else if(mLastScrollY < newScrollY && FAB_VISIBLE == false){
 83                             FAB_VISIBLE = true;
 84                             showFAB();
 85                         }
 86                     }
 87                     mLastScrollY = newScrollY;
 88                 } else {
 89                     if (firstVisibleItem > mPreviousFirstVisibleItem && FAB_VISIBLE == true){  //向下滚动
 90                         FAB_VISIBLE = false;
 91                         hideFAB();
 92                     } else if(firstVisibleItem < mPreviousFirstVisibleItem && FAB_VISIBLE == false){ //向上滚动
 93                         FAB_VISIBLE = true;
 94                         showFAB();
 95                     }
 96                     mLastScrollY = getTopItemScrollY();
 97                     mPreviousFirstVisibleItem = firstVisibleItem;
 98                 }
 99                 if (firstVisibleItem > (totalItemCount/4)) {
100                     fabUp.setVisibility(View.VISIBLE);
101                 } else {
102                     fabUp.setVisibility(View.GONE);
103                 }
104             }
105         });
106     }
107     private boolean isSameRow(int firstVisisbleItem){
108         return mPreviousFirstVisibleItem == firstVisisbleItem;
109     }
110     /**
111      * 滚动过程中,获得当前ListView中最上面的Item(View)的顶部的Y坐标(以px为单位)
112      * @return
113      */
114     private int getTopItemScrollY() {
115         if (lvContacts == null || lvContacts.getChildAt(0) == null) return 0;
116         View topChild = lvContacts.getChildAt(0);
117         return topChild.getTop();
118     }
119     @Override
120     public void onClick(View v) {
121         switch (v.getId()) {
122             case R.id.fabUp:
123                 lvContacts.setSelection(0);
124                 fabUp.setVisibility(View.GONE);
125                 break;
126             default:
127                 break;
128         }
129     }
130     private void hideFAB() {
131         mHideFAB.start();
132     }
133     private void showFAB(){
134         mShowFAB.start();
135     }
136     class ContactsAdapter extends BaseAdapter {
137         private Context mContext;
138         private List<String> list;
139         public ContactsAdapter(Context mContext,List<String> list) {
140             this.mContext = mContext;
141             this.list = list;
142         }
143         @Override
144         public int getCount() {
145             return list.size();
146         }
147         @Override
148         public Object getItem(int position) {
149             return list.get(position);
150         }
151         @Override
152         public long getItemId(int position) {
153             return position;
154         }
155         @Override
156         public View getView(int position, View convertView, ViewGroup parent) {
157             convertView = LayoutInflater.from(mContext).inflate(R.layout.contacts_item,null);
158             TextView tvName = (TextView)convertView.findViewById(R.id.tvName);
159             TextView tvNumber = (TextView)convertView.findViewById(R.id.tvNumber);
160             tvName.setText((list.get(position).split("\\+"))[0]);
161             tvNumber.setText((list.get(position).split("\\+"))[1]);
162             return convertView;
163         }
164     }
165 }

   Property Animation定义如下

   scroll_hide_fab.xml:
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:ordering="together"
 4     >
 5     <objectAnimator
 6         android:propertyName="translationY"
 7         android:valueTo="500.00"
 8         android:duration="200"
 9         android:startOffset="0"
10         android:repeatCount="0"
11         android:valueType="floatType"
12         />
13     <objectAnimator
14         android:propertyName="alpha"
15         android:valueFrom="1.00"
16         android:valueTo="0.00"
17         android:duration="200"
18         android:startOffset="0"
19         android:valueType="floatType"
20         android:repeatCount="0"
21         />
22 </set>

 scroll_show_fab.xml: 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:ordering="together"
 4     >
 5     <objectAnimator
 6         android:propertyName="translationY"
 7         android:valueTo="0.0"
 8         android:duration="100"
 9         android:startOffset="0"
10         android:repeatCount="0"
11         android:valueType="floatType"
12         />
13     <objectAnimator
14         android:propertyName="alpha"
15         android:valueFrom="0.00"
16         android:valueTo="1.00"
17         android:duration="100"
18         android:startOffset="0"
19         android:valueType="floatType"
20         android:repeatCount="0"
21         />
22 </set>

 

  
 
 



posted @ 2016-11-29 09:31  zeng三寿  阅读(36303)  评论(2编辑  收藏  举报