package com.diandi.view; import android.content.Context; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.AbsListView; import com.diandi.listener.ScrollDirectionDetector; import com.diandi.listener.ScrollDirectionListener; import com.gc.materialdesign.views.ButtonFloat; /** * ******************************************************************************* * ********* Author : klob(kloblic@gmail.com) . * ********* Date : 2014-11-28 . * ********* Time : 18:39 . * ********* Project name : Diandi1.18 . * ********* Version : 1.0 * ********* Copyright @ 2014, klob, All Rights Reserved * ******************************************************************************* */ public class ListviewButton extends ButtonFloat { private static final int TRANSLATE_DURATION_MILLIS = 200; private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator(); protected AbsListView mListView; private boolean mVisible; private FabOnScrollListener mOnScrollListener; public ListviewButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void init() { mVisible = true; } private int getMarginBottom() { int marginBottom = 0; final ViewGroup.LayoutParams layoutParams = getLayoutParams(); if (layoutParams instanceof ViewGroup.MarginLayoutParams) { marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin; } return marginBottom; } protected AbsListView.OnScrollListener getOnScrollListener() { return mOnScrollListener; } public void show() { show(true); } public void hide() { hide(true); } public void show(boolean animate) { toggle(true, animate, false); } public void hide(boolean animate) { toggle(false, animate, false); } private void toggle(final boolean visible, final boolean animate, boolean force) { if (mVisible != visible || force) { mVisible = visible; int height = getHeight(); if (height == 0 && !force) { ViewTreeObserver vto = getViewTreeObserver(); if (vto.isAlive()) { vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { ViewTreeObserver currentVto = getViewTreeObserver(); if (currentVto.isAlive()) { currentVto.removeOnPreDrawListener(this); } toggle(visible, animate, true); return true; } }); return; } } int translationY = visible ? 0 : height + getMarginBottom(); if (animate) { animate().setInterpolator(mInterpolator) .setDuration(TRANSLATE_DURATION_MILLIS) .translationY(translationY); } else { setTranslationY(translationY); } } } public void attachToListView(AbsListView listView) { attachToListView(listView, new FabOnScrollListener()); } public void attachToListView(AbsListView listView, FabOnScrollListener onScrollListener) { mListView = listView; mOnScrollListener = onScrollListener; onScrollListener.setFloatingActionButton(this); onScrollListener.setListView(listView); mListView.setOnScrollListener(onScrollListener); } public static class FabOnScrollListener extends ScrollDirectionDetector { private ListviewButton mListviewButton; public FabOnScrollListener() { setScrollDirectionListener(new ScrollDirectionListener() { @Override public void onScrollDown() { mListviewButton.show(); } @Override public void onScrollUp() { mListviewButton.hide(); } }); } public void setFloatingActionButton(ListviewButton listviewButton) { mListviewButton = listviewButton; } } }