package com.lcodecore.tkrefreshlayout.header.bezierlayout; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.support.annotation.ColorInt; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import com.lcodecore.tkrefreshlayout.OnAnimEndListener; import com.lcodecore.tkrefreshlayout.R; import com.lcodecore.tkrefreshlayout.IHeaderView; /** * Created by lcodecore on 2016/10/2. */ public class BezierLayout extends FrameLayout implements IHeaderView { public BezierLayout(Context context) { this(context, null); } public BezierLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BezierLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs); } View headView; WaveView waveView; RippleView rippleView; RoundDotView r1; RoundProgressView r2; private void init(AttributeSet attrs) { /** * attrs 需要在xml设置什么属性 自己自定义吧 啊哈哈 */ /** * 初始化headView */ headView = LayoutInflater.from(getContext()).inflate(R.layout.view_bezier, null); waveView = (WaveView) headView.findViewById(R.id.draweeView); rippleView = (RippleView) headView.findViewById(R.id.ripple); r1 = (RoundDotView) headView.findViewById(R.id.round1); r2 = (RoundProgressView) headView.findViewById(R.id.round2); r2.setVisibility(View.GONE); addView(headView); } public void setWaveColor(@ColorInt int color) { waveView.setWaveColor(color); } public void setRippleColor(@ColorInt int color) { rippleView.setRippleColor(color); } /** * 限定值 * * @param a * @param b * @return */ public float limitValue(float a, float b) { float valve = 0; final float min = Math.min(a, b); final float max = Math.max(a, b); valve = valve > min ? valve : min; valve = valve < max ? valve : max; return valve; } private ValueAnimator waveAnimator, circleAnimator; @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (waveAnimator != null) waveAnimator.cancel(); if (circleAnimator != null) circleAnimator.cancel(); } @Override public View getView() { return this; } @Override public void onPullingDown(float fraction, float maxHeadHeight, float headHeight) { if (rippleView.getVisibility() == VISIBLE) rippleView.setVisibility(GONE); waveView.setHeadHeight((int) (headHeight * limitValue(1, fraction))); waveView.setWaveHeight((int) (maxHeadHeight * Math.max(0, fraction - 1))); waveView.invalidate(); /*处理圈圈**/ r1.setCir_x((int) (30 * limitValue(1, fraction))); r1.setVisibility(View.VISIBLE); r1.invalidate(); r2.setVisibility(View.GONE); r2.animate().scaleX((float) 0.1); r2.animate().scaleY((float) 0.1); } @Override public void onPullReleasing(float fraction, float maxHeadHeight, float headHeight) { waveView.setHeadHeight((int) (headHeight * limitValue(1, fraction))); waveView.setWaveHeight((int) (maxHeadHeight * Math.max(0, fraction - 1))); waveView.invalidate(); r1.setCir_x((int) (30 * limitValue(1, fraction))); r1.invalidate(); } @Override public void startAnim(float maxHeadHeight, float headHeight) { waveView.setHeadHeight((int) headHeight); waveAnimator = ValueAnimator.ofInt(waveView.getWaveHeight(), 0, -300, 0, -100, 0); waveAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { waveView.setWaveHeight((int) animation.getAnimatedValue() / 2); waveView.invalidate(); } }); waveAnimator.setInterpolator(new DecelerateInterpolator()); waveAnimator.setDuration(800); waveAnimator.start(); /*处理圈圈进度条**/ circleAnimator = ValueAnimator.ofFloat(1, 0); circleAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); r1.setVisibility(GONE); r2.setVisibility(View.VISIBLE); r2.animate().scaleX((float) 1.0); r2.animate().scaleY((float) 1.0); r2.postDelayed(new Runnable() { @Override public void run() { r2.startAnim(); } }, 200); } }); circleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); r1.setCir_x((int) (-value * 40)); r1.invalidate(); } }); circleAnimator.setInterpolator(new DecelerateInterpolator()); circleAnimator.setDuration(300); circleAnimator.start(); } @Override public void onFinish(final OnAnimEndListener animEndListener) { r2.stopAnim(); r2.animate().scaleX((float) 0.0); r2.animate().scaleY((float) 0.0); rippleView.setRippleEndListener(new RippleView.OnRippleEndListener() { @Override public void onRippleEnd() { animEndListener.onAnimEnd(); } }); rippleView.startReveal(); } @Override public void reset() { if (waveAnimator != null && waveAnimator.isRunning()) waveAnimator.cancel(); waveView.setWaveHeight(0); if (circleAnimator != null && circleAnimator.isRunning()) circleAnimator.cancel(); r1.setVisibility(VISIBLE); r2.stopAnim(); r2.setScaleX(0); r2.setScaleY(0); r2.setVisibility(View.GONE); rippleView.stopAnim(); rippleView.setVisibility(GONE); } }