/**
* Copyright 2015 bingoogolapple
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cheng.animationstudy.customview.bagrefresh;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.cheng.animationstudy.R;
/**
* 作者:王浩 邮件:bingoogolapple@gmail.com
* 创建时间:15/5/21 12:56
* 描述:继承该抽象类实现响应的抽象方法,做出各种下拉刷新效果。参考BGANormalRefreshViewHolder、BGAStickinessRefreshViewHolder、BGAMoocStyleRefreshViewHolder
*/
public abstract class BGARefreshViewHolder {
/**
* 手指移动距离与下拉刷新控件paddingTop移动距离的比值
*/
private static final float PULL_DISTANCE_SCALE = 1.8f;
/**
* 手指移动距离与下拉刷新控件paddingTop移动距离的比值,默认1.8f
*/
private float mPullDistanceScale = PULL_DISTANCE_SCALE;
/**
* 下拉刷新控件paddingTop的弹簧距离与下拉刷新控件高度的比值
*/
private static final float SPRING_DISTANCE_SCALE = 0.4f;
/**
* 下拉刷新控件paddingTop的弹簧距离与下拉刷新控件高度的比值,默认0.4f
*/
private float mSpringDistanceScale = SPRING_DISTANCE_SCALE;
protected Context mContext;
/**
* 下拉刷新上拉加载更多控件
*/
protected BGARefreshLayout mRefreshLayout;
/**
* 下拉刷新控件
*/
protected View mRefreshHeaderView;
/**
* 上拉加载更多控件
*/
protected View mLoadMoreFooterView;
/**
* 底部加载更多提示控件
*/
protected TextView mFooterStatusTv;
/**
* 底部加载更多菊花控件
*/
protected ImageView mFooterChrysanthemumIv;
/**
* 底部加载更多菊花drawable
*/
protected AnimationDrawable mFooterChrysanthemumAd;
/**
* 正在加载更多时的文本
*/
protected String mLodingMoreText = "加载中...";
/**
* 是否开启加载更多功能
*/
private boolean mIsLoadingMoreEnabled = true;
/**
* 整个加载更多控件的背景颜色资源id
*/
private int mLoadMoreBackgroundColorRes = -1;
/**
* 整个加载更多控件的背景drawable资源id
*/
private int mLoadMoreBackgroundDrawableRes = -1;
/**
* 下拉刷新控件的背景颜色资源id
*/
protected int mRefreshViewBackgroundColorRes = -1;
/**
* 下拉刷新控件的背景drawable资源id
*/
protected int mRefreshViewBackgroundDrawableRes = -1;
/**
* 头部控件移动动画时常
*/
private int mTopAnimDuration = 500;
/**
* @param context
* @param isLoadingMoreEnabled 上拉加载更多是否可用
*/
public BGARefreshViewHolder(Context context, boolean isLoadingMoreEnabled) {
mContext = context;
mIsLoadingMoreEnabled = isLoadingMoreEnabled;
}
/**
* 设置正在加载更多时的文本
*
* @param loadingMoreText
*/
public void setLoadingMoreText(String loadingMoreText) {
mLodingMoreText = loadingMoreText;
}
/**
* 设置整个加载更多控件的背景颜色资源id
*
* @param loadMoreBackgroundColorRes
*/
public void setLoadMoreBackgroundColorRes(@ColorRes int loadMoreBackgroundColorRes) {
mLoadMoreBackgroundColorRes = loadMoreBackgroundColorRes;
}
/**
* 设置整个加载更多控件的背景drawable资源id
*
* @param loadMoreBackgroundDrawableRes
*/
public void setLoadMoreBackgroundDrawableRes(@DrawableRes int loadMoreBackgroundDrawableRes) {
mLoadMoreBackgroundDrawableRes = loadMoreBackgroundDrawableRes;
}
/**
* 设置下拉刷新控件的背景颜色资源id
*
* @param refreshViewBackgroundColorRes
*/
public void setRefreshViewBackgroundColorRes(@ColorRes int refreshViewBackgroundColorRes) {
mRefreshViewBackgroundColorRes = refreshViewBackgroundColorRes;
}
/**
* 设置下拉刷新控件的背景drawable资源id
*
* @param refreshViewBackgroundDrawableRes
*/
public void setRefreshViewBackgroundDrawableRes(@DrawableRes int refreshViewBackgroundDrawableRes) {
mRefreshViewBackgroundDrawableRes = refreshViewBackgroundDrawableRes;
}
/**
* 获取顶部未满足下拉刷新条件时回弹到初始状态、满足刷新条件时回弹到正在刷新状态、刷新完毕后回弹到初始状态的动画时间,默认为500毫秒
*
* @return
*/
public int getTopAnimDuration() {
return mTopAnimDuration;
}
/**
* 设置顶部未满足下拉刷新条件时回弹到初始状态、满足刷新条件时回弹到正在刷新状态、刷新完毕后回弹到初始状态的动画时间,默认为300毫秒
*
* @param topAnimDuration
*/
public void setTopAnimDuration(int topAnimDuration) {
mTopAnimDuration = topAnimDuration;
}
/**
* 获取上拉加载更多控件,如果不喜欢这种上拉刷新风格可重写该方法实现自定义LoadMoreFooterView
*
* @return
*/
public View getLoadMoreFooterView() {
if (!mIsLoadingMoreEnabled) {
return null;
}
if (mLoadMoreFooterView == null) {
mLoadMoreFooterView = View.inflate(mContext, R.layout.view_normal_refresh_footer, null);
mLoadMoreFooterView.setBackgroundColor(Color.TRANSPARENT);
if (mLoadMoreBackgroundColorRes != -1) {
mLoadMoreFooterView.setBackgroundResource(mLoadMoreBackgroundColorRes);
}
if (mLoadMoreBackgroundDrawableRes != -1) {
mLoadMoreFooterView.setBackgroundResource(mLoadMoreBackgroundDrawableRes);
}
mFooterStatusTv = (TextView) mLoadMoreFooterView.findViewById(R.id.tv_normal_refresh_footer_status);
mFooterChrysanthemumIv = (ImageView) mLoadMoreFooterView.findViewById(R.id.iv_normal_refresh_footer_chrysanthemum);
mFooterChrysanthemumAd = (AnimationDrawable) mFooterChrysanthemumIv.getDrawable();
mFooterStatusTv.setText(mLodingMoreText);
}
return mLoadMoreFooterView;
}
/**
* 获取头部下拉刷新控件
*
* @return
*/
public abstract View getRefreshHeaderView();
/**
* 下拉刷新控件可见时,处理上下拉进度
*
* @param scale 下拉过程0 到 1,回弹过程1 到 0,没有加上弹簧距离移动时的比例
* @param moveYDistance 整个下拉刷新控件paddingTop变化的值,如果有弹簧距离,会大于整个下拉刷新控件的高度
*/
public abstract void handleScale(float scale, int moveYDistance);
/**
* 进入到未处理下拉刷新状态
*/
public abstract void changeToIdle();
/**
* 进入下拉状态
*/
public abstract void changeToPullDown();
/**
* 进入释放刷新状态
*/
public abstract void changeToReleaseRefresh();
/**
* 进入正在刷新状态
*/
public abstract void changeToRefreshing();
/**
* 结束下拉刷新
*/
public abstract void onEndRefreshing();
/**
* 手指移动距离与下拉刷新控件paddingTop移动距离的比值
*
* @return
*/
public float getPaddingTopScale() {
return mPullDistanceScale;
}
/**
* 设置手指移动距离与下拉刷新控件paddingTop移动距离的比值
*
* @param pullDistanceScale
*/
public void setPullDistanceScale(float pullDistanceScale) {
mPullDistanceScale = pullDistanceScale;
}
/**
* 下拉刷新控件paddingTop的弹簧距离与下拉刷新控件高度的比值
*
* @return
*/
public float getSpringDistanceScale() {
return mSpringDistanceScale;
}
/**
* 设置下拉刷新控件paddingTop的弹簧距离与下拉刷新控件高度的比值,不能小于0,如果刷新控件比较高,建议将该值设置小一些
*
* @param springDistanceScale
*/
public void setSpringDistanceScale(float springDistanceScale) {
if (springDistanceScale < 0) {
throw new RuntimeException("下拉刷新控件paddingTop的弹簧距离与下拉刷新控件高度的比值springDistanceScale不能小于0");
}
mSpringDistanceScale = springDistanceScale;
}
/**
* 是处于能够进入刷新状态
*
* @return
*/
public boolean canChangeToRefreshingStatus() {
return false;
}
/**
* 进入加载更多状态
*/
public void changeToLoadingMore() {
if (mIsLoadingMoreEnabled && mFooterChrysanthemumAd != null) {
mFooterChrysanthemumAd.start();
}
}
/**
* 结束上拉加载更多
*/
public void onEndLoadingMore() {
if (mIsLoadingMoreEnabled && mFooterChrysanthemumAd != null) {
mFooterChrysanthemumAd.stop();
}
}
/**
* 获取下拉刷新控件的高度,如果初始化时的高度和最后展开的最大高度不一致,需重写该方法返回最大高度
*
* @return
*/
public int getRefreshHeaderViewHeight() {
if (mRefreshHeaderView != null) {
// 测量下拉刷新控件的高度
mRefreshHeaderView.measure(0, 0);
return mRefreshHeaderView.getMeasuredHeight();
}
return 0;
}
/**
* 改变整个下拉刷新头部控件移动一定的距离(带动画),自定义刷新控件进入刷新状态前后的高度有变化时可以使用该方法(参考BGAStickinessRefreshView)
*
* @param distance
*/
public void startChangeWholeHeaderViewPaddingTop(int distance) {
mRefreshLayout.startChangeWholeHeaderViewPaddingTop(distance);
}
/**
* 设置下拉刷新上拉加载更多控件,该方法是设置BGARefreshViewHolder给BGARefreshLayout时由BGARefreshLayout调用
*
* @param refreshLayout
*/
public void setRefreshLayout(BGARefreshLayout refreshLayout) {
mRefreshLayout = refreshLayout;
}
}