package com.tiger.quicknews.wedget.discrollview; import android.animation.ArgbEvaluator; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.widget.FrameLayout; /** * */ 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; @SuppressLint("NewApi") 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; } @SuppressLint("NewApi") @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); } @SuppressLint("NewApi") @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; } }