mirror of https://github.com/kurisufriend/Clover
parent
4ef7916d68
commit
0566c89093
@ -0,0 +1,136 @@ |
||||
/* |
||||
* Clover - 4chan browser https://github.com/Floens/Clover/
|
||||
* Copyright (C) 2014 Floens |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
package org.floens.chan.ui.view; |
||||
|
||||
import android.content.Context; |
||||
import android.support.design.widget.CoordinatorLayout; |
||||
import android.support.design.widget.FloatingActionButton; |
||||
import android.support.design.widget.Snackbar; |
||||
import android.util.AttributeSet; |
||||
import android.view.ViewGroup; |
||||
import android.view.animation.DecelerateInterpolator; |
||||
|
||||
import org.floens.chan.ui.toolbar.Toolbar; |
||||
|
||||
public class HidingFloatingActionButton extends FloatingActionButton implements Toolbar.ToolbarCollapseCallback { |
||||
private boolean attachedToWindow; |
||||
private Toolbar toolbar; |
||||
private boolean attachedToToolbar; |
||||
private CoordinatorLayout coordinatorLayout; |
||||
private int currentCollapseTranslation; |
||||
|
||||
public HidingFloatingActionButton(Context context) { |
||||
super(context); |
||||
} |
||||
|
||||
public HidingFloatingActionButton(Context context, AttributeSet attrs) { |
||||
super(context, attrs); |
||||
} |
||||
|
||||
public HidingFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { |
||||
super(context, attrs, defStyleAttr); |
||||
} |
||||
|
||||
public void setToolbar(Toolbar toolbar) { |
||||
this.toolbar = toolbar; |
||||
|
||||
if (attachedToWindow && !attachedToToolbar) { |
||||
toolbar.addCollapseCallback(this); |
||||
attachedToToolbar = true; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void onAttachedToWindow() { |
||||
super.onAttachedToWindow(); |
||||
attachedToWindow = true; |
||||
|
||||
if (!(getParent() instanceof CoordinatorLayout)) { |
||||
throw new IllegalArgumentException("HidingFloatingActionButton must be a parent of CoordinatorLayout"); |
||||
} |
||||
|
||||
coordinatorLayout = (CoordinatorLayout) getParent(); |
||||
|
||||
if (toolbar != null && !attachedToToolbar) { |
||||
toolbar.addCollapseCallback(this); |
||||
attachedToToolbar = true; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void onDetachedFromWindow() { |
||||
super.onDetachedFromWindow(); |
||||
attachedToWindow = false; |
||||
if (attachedToToolbar) { |
||||
toolbar.removeCollapseCallback(this); |
||||
attachedToToolbar = false; |
||||
} |
||||
coordinatorLayout = null; |
||||
} |
||||
|
||||
@Override |
||||
public void onCollapseTranslation(float offset) { |
||||
if (isSnackbarShowing()) { |
||||
currentCollapseTranslation = -1; |
||||
return; |
||||
} |
||||
|
||||
// Logger.test("onCollapseTranslation " + offset);
|
||||
|
||||
int translation = (int) (getTotalHeight() * offset); |
||||
if (translation != currentCollapseTranslation) { |
||||
currentCollapseTranslation = translation; |
||||
float diff = Math.abs(translation - getTranslationY()); |
||||
if (diff >= getHeight()) { |
||||
animate().translationY(translation).setDuration(300).setStartDelay(0).setInterpolator(new DecelerateInterpolator(2f)).start(); |
||||
} else { |
||||
setTranslationY(translation); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCollapseAnimation(boolean collapse) { |
||||
if (isSnackbarShowing()) { |
||||
currentCollapseTranslation = -1; |
||||
return; |
||||
} |
||||
|
||||
// Logger.test("onCollapseAnimation " + collapse);
|
||||
|
||||
int translation = collapse ? getTotalHeight() : 0; |
||||
if (translation != currentCollapseTranslation) { |
||||
currentCollapseTranslation = translation; |
||||
animate().translationY(translation).setDuration(300).setStartDelay(0).setInterpolator(new DecelerateInterpolator(2f)).start(); |
||||
} |
||||
} |
||||
|
||||
private int getTotalHeight() { |
||||
return getHeight() + ((ViewGroup.MarginLayoutParams) getLayoutParams()).bottomMargin; |
||||
} |
||||
|
||||
private boolean isSnackbarShowing() { |
||||
for (int i = 0; i < coordinatorLayout.getChildCount(); i++) { |
||||
if (coordinatorLayout.getChildAt(i) instanceof Snackbar.SnackbarLayout) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
Loading…
Reference in new issue