/* * Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.ui; import android.content.Context; import android.graphics.Color; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.TintTypedArray; import android.util.AttributeSet; import me.zhanghai.android.douya.R; import me.zhanghai.android.douya.util.ViewUtils; /** * Offers <code>app:progressOffset</code>, <code>app:progressDistanceOffset</code>, and defaults * progress color to <code>?colorPrimary</code>. */ public class FriendlySwipeRefreshLayout extends SwipeRefreshLayout { private static final int CIRCLE_DIAMETER_DP = 40; private static final int CIRCLE_DIAMETER_LARGE_DP = 56; private static final int CIRCLE_SHADOW_DP = 7; private static final int DEFAULT_CIRCLE_DISTANCE_DP = 64; private int mSize = DEFAULT; private int mCircleDiameter; private int mDefaultCircleDistance; private CanChildScrollUpCallback mCanChildScrollUpCallback; public FriendlySwipeRefreshLayout(Context context) { super(context); init(null); } public FriendlySwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); } @SuppressWarnings("RestrictedApi") private void init(AttributeSet attrs) { updateCircleDiameter(); Context context = getContext(); mDefaultCircleDistance = ViewUtils.dpToPxOffset(DEFAULT_CIRCLE_DISTANCE_DP, context); TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, R.styleable.FriendlySwipeRefreshLayout, 0, 0); int progressOffset = a.getDimensionPixelOffset( R.styleable.FriendlySwipeRefreshLayout_progressOffset, 0); int progressDistanceOffset = a.getDimensionPixelOffset( R.styleable.FriendlySwipeRefreshLayout_progressDistanceOffset, 0); a.recycle(); if (progressOffset != 0 || progressDistanceOffset != 0) { setProgressViewOffset(progressOffset, progressDistanceOffset); } setColorSchemeColors(ViewUtils.getColorFromAttrRes(R.attr.colorPrimary, Color.BLACK, context)); } @Override public void setSize(int size) { super.setSize(size); if (size == LARGE || size == DEFAULT) { mSize = size; updateCircleDiameter(); } } private void updateCircleDiameter() { int circleDiameterDp = mSize == DEFAULT ? CIRCLE_DIAMETER_DP : CIRCLE_DIAMETER_LARGE_DP; circleDiameterDp += CIRCLE_SHADOW_DP; mCircleDiameter = ViewUtils.dpToPxSize(circleDiameterDp, getContext()); } public void setProgressViewOffset(int offset, int distanceOffset) { int progressStart = offset - mCircleDiameter; int progressEnd = progressStart + mDefaultCircleDistance + distanceOffset; setProgressViewOffset(false, progressStart, progressEnd); } public void setProgressViewOffset(int offset) { setProgressViewOffset(offset, 0); } public CanChildScrollUpCallback getCanChildScrollUpCallback() { return mCanChildScrollUpCallback; } public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) { mCanChildScrollUpCallback = canChildScrollUpCallback; } @Override public boolean canChildScrollUp() { if (mCanChildScrollUpCallback != null) { return mCanChildScrollUpCallback.canChildScrollUp(); } return super.canChildScrollUp(); } public interface CanChildScrollUpCallback { boolean canChildScrollUp(); } }