package com.marshalchen.common.uimodule.discrollview;
import android.animation.ArgbEvaluator;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
/**
*
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class DiscrollvableView extends FrameLayout implements Discrollvable {
private static final int TRANSLATION_FROM_TOP = 0x01;
private static final int TRANSLATION_FROM_BOTTOM = 0x02;
private static final int TRANSLATION_FROM_LEFT = 0x04;;
private static final int TRANSLATION_FROM_RIGHT = 0x08;
private static ArgbEvaluator sArgbEvaluator = new ArgbEvaluator();
private float mDiscrollveThreshold;
private int mDiscrollveFromBgColor;
private int mDiscrollveToBgColor;
private boolean mDiscrollveAlpha;
private int mDiscrollveTranslation;
private boolean mDiscrollveScaleX;
private boolean mDiscrollveScaleY;
private int mWidth;
private int mHeight;
public DiscrollvableView(Context context) {
super(context);
}
public DiscrollvableView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DiscrollvableView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
onResetDiscrollve();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
public void setDiscrollveTranslation(int discrollveTranslation) {
mDiscrollveTranslation = discrollveTranslation;
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM) && isDiscrollveTranslationFrom(TRANSLATION_FROM_TOP)) {
throw new IllegalArgumentException("cannot translate from bottom and top");
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT) && isDiscrollveTranslationFrom(TRANSLATION_FROM_RIGHT)) {
throw new IllegalArgumentException("cannot translate from left and right");
}
}
public void setDiscrollveThreshold(float discrollveThreshold) {
if(discrollveThreshold < 0.0f || discrollveThreshold > 1.0f) {
throw new IllegalArgumentException("threshold must be >= 0.0f and <= 1.0f");
}
mDiscrollveThreshold = discrollveThreshold;
}
public void setDiscrollveFromBgColor(int discrollveFromBgColor) {
mDiscrollveFromBgColor = discrollveFromBgColor;
}
public void setDiscrollveToBgColor(int discrollveToBgColor) {
mDiscrollveToBgColor = discrollveToBgColor;
}
public void setDiscrollveAlpha(boolean discrollveAlpha) {
mDiscrollveAlpha = discrollveAlpha;
}
public void setDiscrollveScaleX(boolean discrollveScaleX) {
mDiscrollveScaleX = discrollveScaleX;
}
public void setDiscrollveScaleY(boolean discrollveScaleY) {
mDiscrollveScaleY = discrollveScaleY;
}
@Override
public void onDiscrollve(float ratio) {
if(ratio >= mDiscrollveThreshold) {
ratio = withThreshold(ratio);
float ratioInverse = 1 - ratio;
if(mDiscrollveAlpha) {
setAlpha(ratio);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM)) {
setTranslationY(mHeight * ratioInverse);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_TOP)) {
setTranslationY(-mHeight * ratioInverse);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT)) {
setTranslationX(-mWidth * ratioInverse);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_RIGHT)) {
setTranslationX(mWidth * ratioInverse);
}
if(mDiscrollveScaleX) {
setScaleX(ratio);
}
if(mDiscrollveScaleY) {
setScaleY(ratio);
}
if(mDiscrollveFromBgColor != -1 && mDiscrollveToBgColor != -1) {
setBackgroundColor((Integer) sArgbEvaluator.evaluate(ratio, mDiscrollveFromBgColor, mDiscrollveToBgColor));
}
}
}
private float withThreshold(float ratio) {
return (ratio - mDiscrollveThreshold) / (1.0f - mDiscrollveThreshold);
}
@Override
public void onResetDiscrollve() {
if(mDiscrollveAlpha) {
setAlpha(0.0f);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM)) {
setTranslationY(mHeight);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_TOP)) {
setTranslationY(-mHeight);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT)) {
setTranslationX(-mWidth);
}
if(isDiscrollveTranslationFrom(TRANSLATION_FROM_RIGHT)) {
setTranslationX(mWidth);
}
if(mDiscrollveScaleX) {
setScaleX(0.0f);
}
if(mDiscrollveScaleY) {
setScaleY(0.0f);
}
if(mDiscrollveFromBgColor != -1 && mDiscrollveToBgColor != -1) {
setBackgroundColor(mDiscrollveFromBgColor);
}
}
private boolean isDiscrollveTranslationFrom(int translationMask) {
if(mDiscrollveTranslation == -1) {
return false;
}
return (mDiscrollveTranslation & translationMask) == translationMask;
}
}