package com.marshalchen.common.uimodule.flipViews.flipview; import android.graphics.Canvas; import android.support.v4.widget.EdgeEffectCompat; public class GlowOverFlipper implements OverFlipper { private EdgeEffectCompat mTopEdgeEffect; private EdgeEffectCompat mBottomEdgeEffect; private FlipView mFlipView; private float mTotalOverFlip; public GlowOverFlipper(FlipView v) { mFlipView = v; mTopEdgeEffect = new EdgeEffectCompat(v.getContext()); mBottomEdgeEffect = new EdgeEffectCompat(v.getContext()); } @Override public float calculate(float flipDistance, float minFlipDistance, float maxFlipDistance) { float deltaOverFlip = flipDistance - (flipDistance < 0 ? minFlipDistance : maxFlipDistance); mTotalOverFlip += deltaOverFlip; if (deltaOverFlip > 0) { mBottomEdgeEffect.onPull(deltaOverFlip / (mFlipView.isFlippingVertically() ? mFlipView.getHeight() : mFlipView.getWidth())); } else if (deltaOverFlip < 0) { mTopEdgeEffect.onPull(-deltaOverFlip / (mFlipView.isFlippingVertically() ? mFlipView.getHeight() : mFlipView.getWidth())); } return flipDistance < 0 ? minFlipDistance : maxFlipDistance; } @Override public boolean draw(Canvas c) { return drawTopEdgeEffect(c) | drawBottomEdgeEffect(c); } private boolean drawTopEdgeEffect(Canvas canvas) { boolean needsMoreDrawing = false; if (!mTopEdgeEffect.isFinished()) { canvas.save(); if (mFlipView.isFlippingVertically()) { mTopEdgeEffect.setSize(mFlipView.getWidth(), mFlipView.getHeight()); canvas.rotate(0); } else { mTopEdgeEffect.setSize(mFlipView.getHeight(), mFlipView.getWidth()); canvas.rotate(270); canvas.translate(-mFlipView.getHeight(), 0); } needsMoreDrawing = mTopEdgeEffect.draw(canvas); canvas.restore(); } return needsMoreDrawing; } private boolean drawBottomEdgeEffect(Canvas canvas) { boolean needsMoreDrawing = false; if (!mBottomEdgeEffect.isFinished()) { canvas.save(); if (mFlipView.isFlippingVertically()) { mBottomEdgeEffect.setSize(mFlipView.getWidth(), mFlipView.getHeight()); canvas.rotate(180); canvas.translate(-mFlipView.getWidth(), -mFlipView.getHeight()); } else { mBottomEdgeEffect.setSize(mFlipView.getHeight(), mFlipView.getWidth()); canvas.rotate(90); canvas.translate(0, -mFlipView.getWidth()); } needsMoreDrawing = mBottomEdgeEffect.draw(canvas); canvas.restore(); } return needsMoreDrawing; } @Override public void overFlipEnded() { mTopEdgeEffect.onRelease(); mBottomEdgeEffect.onRelease(); mTotalOverFlip = 0; } @Override public float getTotalOverFlip() { return mTotalOverFlip; } }