package com.gh.common.view; import android.content.Context; import android.graphics.drawable.Animatable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.scwang.smartrefresh.layout.api.RefreshInternal; import com.scwang.smartrefresh.layout.api.RefreshKernel; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.constant.SpinnerStyle; import com.scwang.smartrefresh.layout.internal.ArrowDrawable; import com.scwang.smartrefresh.layout.internal.InternalAbstract; import com.scwang.smartrefresh.layout.internal.ProgressDrawable; import com.scwang.smartrefresh.layout.util.DensityUtil; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static com.scwang.smartrefresh.layout.util.SmartUtil.getColor; public abstract class AbstractSwipeRefreshHeader extends InternalAbstract implements RefreshInternal { public static final byte ID_TEXT_TITLE = 1; public static final byte ID_IMAGE_ARROW = 2; public static final byte ID_IMAGE_PROGRESS = 3; protected TextView mTitleText; protected ImageView mArrowView; protected ImageView mProgressView; protected LinearLayout mCenterLayout; protected RefreshKernel mRefreshKernel; protected ArrowDrawable mArrowDrawable; protected ProgressDrawable mProgressDrawable; protected Integer mAccentColor; protected Integer mPrimaryColor; protected int mBackgroundColor; protected int mFinishDuration = 500; private DensityUtil mDensityUtil = new DensityUtil(); public AbstractSwipeRefreshHeader(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mSpinnerStyle = SpinnerStyle.Translate; mArrowView = new ImageView(context); mProgressView = new ImageView(context); mTitleText = new TextView(context); mTitleText.setTextColor(0xff5d5d5d); mCenterLayout = new LinearLayout(context); mCenterLayout.setGravity(Gravity.CENTER_HORIZONTAL); mCenterLayout.setOrientation(LinearLayout.VERTICAL); final View thisView = this; final ViewGroup thisGroup = this; final View arrowView = mArrowView; final View titleView = mTitleText; final View progressView = mProgressView; final ViewGroup centerLayout = mCenterLayout; titleView.setId(ID_TEXT_TITLE); arrowView.setId(ID_IMAGE_ARROW); progressView.setId(ID_IMAGE_PROGRESS); centerLayout.setId(android.R.id.widget_frame); LinearLayout.LayoutParams lpHeaderText = new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); centerLayout.addView(titleView, lpHeaderText); RelativeLayout.LayoutParams lpHeaderLayout = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); lpHeaderLayout.addRule(CENTER_IN_PARENT); thisGroup.addView(centerLayout, lpHeaderLayout); RelativeLayout.LayoutParams lpArrow = new RelativeLayout.LayoutParams(mDensityUtil.dip2px(15), mDensityUtil.dip2px(15)); lpArrow.addRule(CENTER_VERTICAL); lpArrow.addRule(LEFT_OF, android.R.id.widget_frame); thisGroup.addView(arrowView, lpArrow); RelativeLayout.LayoutParams lpProgress = new RelativeLayout.LayoutParams((ViewGroup.LayoutParams) lpArrow); lpProgress.addRule(CENTER_VERTICAL); lpProgress.addRule(LEFT_OF, android.R.id.widget_frame); progressView.animate().setInterpolator(new LinearInterpolator()); thisGroup.addView(progressView, lpProgress); if (thisView.isInEditMode()) { arrowView.setVisibility(GONE); } else { progressView.setVisibility(GONE); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { final View arrowView = mArrowView; final View progressView = mProgressView; arrowView.animate().cancel(); progressView.animate().cancel(); } final Drawable drawable = mProgressView.getDrawable(); if (drawable instanceof Animatable) { if (((Animatable) drawable).isRunning()) { ((Animatable) drawable).stop(); } } } protected T self() { //noinspection unchecked return (T) this; } @Override public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { mRefreshKernel = kernel; mRefreshKernel.requestDrawBackgroundFor(this, mBackgroundColor); } @Override public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { if (mProgressView.getVisibility() != VISIBLE) { mProgressView.setVisibility(VISIBLE); Drawable drawable = mProgressView.getDrawable(); if (drawable instanceof Animatable) { ((Animatable) drawable).start(); } else { mProgressView.animate().rotation(36000).setDuration(100000); } } } @Override public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { onStartAnimator(refreshLayout, height, maxDragHeight); } @Override public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) { Drawable drawable = mProgressView.getDrawable(); if (drawable instanceof Animatable) { if (((Animatable) drawable).isRunning()) { ((Animatable) drawable).stop(); } } else { mProgressView.animate().rotation(0).setDuration(0); } mProgressView.setVisibility(GONE); return mFinishDuration; } @Override @Deprecated public void setPrimaryColors(@ColorInt int... colors) { if (colors.length > 0) { final View thisView = this; if (!(thisView.getBackground() instanceof BitmapDrawable) && mPrimaryColor == null) { setPrimaryColor(colors[0]); mPrimaryColor = null; } if (mAccentColor == null) { if (colors.length > 1) { setAccentColor(colors[1]); } mAccentColor = null; } } } public T setProgressDrawable(Drawable drawable) { mProgressDrawable = null; mProgressView.setImageDrawable(drawable); return self(); } public T setProgressResource(@DrawableRes int resId) { mProgressDrawable = null; mProgressView.setImageResource(resId); return self(); } public T setArrowDrawable(Drawable drawable) { mArrowDrawable = null; mArrowView.setImageDrawable(drawable); return self(); } public T setArrowResource(@DrawableRes int resId) { mArrowDrawable = null; mArrowView.setImageResource(resId); return self(); } public T setSpinnerStyle(SpinnerStyle style) { this.mSpinnerStyle = style; return self(); } public T setPrimaryColor(@ColorInt int primaryColor) { mBackgroundColor = mPrimaryColor = primaryColor; if (mRefreshKernel != null) { mRefreshKernel.requestDrawBackgroundFor(this, mPrimaryColor); } return self(); } public T setAccentColor(@ColorInt int accentColor) { mAccentColor = accentColor; mTitleText.setTextColor(accentColor); if (mArrowDrawable != null) { mArrowDrawable.setColor(accentColor); } if (mProgressDrawable != null) { mProgressDrawable.setColor(accentColor); } return self(); } public T setPrimaryColorId(@ColorRes int colorId) { final View thisView = this; setPrimaryColor(getColor(thisView.getContext(), colorId)); return self(); } public T setAccentColorId(@ColorRes int colorId) { final View thisView = this; setAccentColor(getColor(thisView.getContext(), colorId)); return self(); } public T setFinishDuration(int delay) { mFinishDuration = delay; return self(); } public T setTextSizeTitle(float size) { mTitleText.setTextSize(size); if (mRefreshKernel != null) { mRefreshKernel.requestRemeasureHeightFor(this); } return self(); } public T setDrawableMarginRight(float dp) { final View arrowView = mArrowView; final View progressView = mProgressView; MarginLayoutParams lpArrow = (MarginLayoutParams) arrowView.getLayoutParams(); MarginLayoutParams lpProgress = (MarginLayoutParams) progressView.getLayoutParams(); lpArrow.rightMargin = lpProgress.rightMargin = DensityUtil.dp2px(dp); arrowView.setLayoutParams(lpArrow); progressView.setLayoutParams(lpProgress); return self(); } public T setDrawableSize(float dp) { final View arrowView = mArrowView; final View progressView = mProgressView; ViewGroup.LayoutParams lpArrow = arrowView.getLayoutParams(); ViewGroup.LayoutParams lpProgress = progressView.getLayoutParams(); lpArrow.width = lpProgress.width = DensityUtil.dp2px(dp); lpArrow.height = lpProgress.height = DensityUtil.dp2px(dp); arrowView.setLayoutParams(lpArrow); progressView.setLayoutParams(lpProgress); return self(); } public T setDrawableArrowSize(float dp) { final View arrowView = mArrowView; ViewGroup.LayoutParams lpArrow = arrowView.getLayoutParams(); lpArrow.height = lpArrow.width = DensityUtil.dp2px(dp); arrowView.setLayoutParams(lpArrow); return self(); } public T setDrawableProgressSize(float dp) { final View progressView = mProgressView; ViewGroup.LayoutParams lpProgress = progressView.getLayoutParams(); lpProgress.height = lpProgress.width = DensityUtil.dp2px(dp); progressView.setLayoutParams(lpProgress); return self(); } }