Android UI- PullToRrefresh自定义下拉刷新动画

private CharSequence mReleaseLabel;

public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) {

super(context);

mMode = mode;

mScrollDirection = scrollDirection;

switch (scrollDirection) {

case HORIZONTAL:

LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this);

break;

case VERTICAL:

default:

// LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this);

// 修改代码

LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_simple, this);

break;

}

mInnerLayout = (FrameLayout) findViewById(R.id.fl_inner);

mHeaderText = (TextView) mInnerLayout.findViewById(R.id.pull_to_refresh_text);

mHeaderProgress = (ProgressBar) mInnerLayout.findViewById(R.id.pull_to_refresh_progress);

mSubHeaderText = (TextView) mInnerLayout.findViewById(R.id.pull_to_refresh_sub_text);

mHeaderImage = (ImageView) mInnerLayout.findViewById(R.id.pull_to_refresh_image);

FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInnerLayout.getLayoutParams();

switch (mode) {

case PULL_FROM_END:

lp.gravity = scrollDirection == Orientation.VERTICAL ? Gravity.TOP : Gravity.LEFT;

// Load in labels

mPullLabel = context.getString(R.string.pull_to_refresh_from_bottom_pull_label);

mRefreshingLabel = context.getString(R.string.pull_to_refresh_from_bottom_refreshing_label);

mReleaseLabel = context.getString(R.string.pull_to_refresh_from_bottom_release_label);

break;

case PULL_FROM_START:

default:

lp.gravity = scrollDirection == Orientation.VERTICAL ? Gravity.BOTTOM : Gravity.RIGHT;

// Load in labels

mPullLabel = context.getString(R.string.pull_to_refresh_pull_label);

mRefreshingLabel = context.getString(R.string.pull_to_refresh_refreshing_label);

mReleaseLabel = context.getString(R.string.pull_to_refresh_release_label);

break;

}

if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) {

Drawable background = attrs.getDrawable(R.styleable.PullToRefresh_ptrHeaderBackground);

if (null != background) {

ViewCompat.setBackground(this, background);

}

}

// if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextAppearance)) {

// TypedValue styleID = new TypedValue();

// attrs.getValue(R.styleable.PullToRefresh_ptrHeaderTextAppearance, styleID);

// setTextAppearance(styleID.data);

// }

// if (attrs.hasValue(R.styleable.PullToRefresh_ptrSubHeaderTextAppearance)) {

// TypedValue styleID = new TypedValue();

// attrs.getValue(R.styleable.PullToRefresh_ptrSubHeaderTextAppearance, styleID);

// setSubTextAppearance(styleID.data);

// }

//

// // Text Color attrs need to be set after TextAppearance attrs

// if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextColor)) {

// ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderTextColor);

// if (null != colors) {

// setTextColor(colors);

// }

// }

// if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderSubTextColor)) {

// ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderSubTextColor);

// if (null != colors) {

// setSubTextColor(colors);

// }

// }

// Try and get defined drawable from Attrs

Drawable imageDrawable = null;

if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawable)) {

imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawable);

}

// Check Specific Drawable from Attrs, these overrite the generic

// drawable attr above

switch (mode) {

case PULL_FROM_START:

default:

if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableStart)) {

imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableStart);

} else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop)) {

Utils.warnDeprecation(“ptrDrawableTop”, “ptrDrawableStart”);

imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop);

}

break;

case PULL_FROM_END:

if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableEnd)) {

imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableEnd);

} else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableBottom)) {

Utils.warnDeprecation(“ptrDrawableBottom”, “ptrDrawableEnd”);

imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableBottom);

}

break;

}

// If we don’t have a user defined drawable, load the default

if (null == imageDrawable) {

imageDrawable = context.getResources().getDrawable(getDefaultDrawableResId());

}

// Set Drawable, and save width/height

setLoadingDrawable(imageDrawable);

reset();

}

public final void setHeight(int height) {

ViewGroup.LayoutParams lp = getLayoutParams();

lp.height = height;

requestLayout();

}

public final void setWidth(int width) {

ViewGroup.LayoutParams lp = getLayoutParams();

lp.width = width;

requestLayout();

}

public final int getContentSize() {

switch (mScrollDirection) {

case HORIZONTAL:

return mInnerLayout.getWidth();

case VERTICAL:

default:

return mInnerLayout.getHeight();

}

}

public final void hideAllViews() {

// if (View.VISIBLE == mHeaderText.getVisibility()) {

// mHeaderText.setVisibility(View.INVISIBLE);

// }

// if (View.VISIBLE == mHeaderProgress.getVisibility()) {

// mHeaderProgress.setVisibility(View.INVISIBLE);

// }

// if (View.VISIBLE == mHeaderImage.getVisibility()) {

// mHeaderImage.setVisibility(View.INVISIBLE);

// }

// if (View.VISIBLE == mSubHeaderText.getVisibility()) {

// mSubHeaderText.setVisibility(View.INVISIBLE);

// }

}

public final void onPull(float scaleOfLayout) {

if (!mUseIntrinsicAnimation) {

onPullImpl(scaleOfLayout);

}

}

public final void pullToRefresh() {

// if (null != mHeaderText) {

// mHeaderText.setText(mPullLabel);

// }

// Now call the callback

pullToRefreshImpl();

}

public final void refreshing() {

if (null != mHeaderText) {

mHeaderText.setText(mRefreshingLabel);

}

if (mUseIntrinsicAnimation) {

((AnimationDrawable) mHeaderImage.getDrawable()).start();

} else {

// Now call the callback

refreshingImpl();

}

// if (null != mSubHeaderText) {

// mSubHeaderText.setVisibility(View.GONE);

// }

}

public final void releaseToRefresh() {

// if (null != mHeaderText) {

// mHeaderText.setText(mReleaseLabel);

// }

// Now call the callback

releaseToRefreshImpl();

}

public final void reset() {

// if (null != mHeaderText) {

// mHeaderText.setText(mPullLabel);

// }

mHeaderImage.setVisibility(View.VISIBLE);

if (mUseIntrinsicAnimation) {

((AnimationDrawable) mHeaderImage.getDrawable()).stop();

} else {

// Now call the callback

resetImpl();

}

// if (null != mSubHeaderText) {

// if (TextUtils.isEmpty(mSubHeaderText.getText())) {

// mSubHeaderText.setVisibility(View.GONE);

// } else {

// mSubHeaderText.setVisibility(View.VISIBLE);

// }

// }

}

@Override

public void setLastUpdatedLabel(CharSequence label) {

// setSubHeaderText(label);

}

@Override

public final void setLoadingDrawable(Drawable imageDrawable) {

// Set Drawable

mHeaderImage.setImageDrawable(imageDrawable);

mUseIntrinsicAnimation = (imageDrawable instanceof AnimationDrawable);

// Now call the callback

onLoadingDrawableSet(imageDrawable);

}

@Override

public void setPullLabel(CharSequence pullLabel) {

mPullLabel = pullLabel;

}

@Override

public void setRefreshingLabel(CharSequence refreshingLabel) {

mRefreshingLabel = refreshingLabel;

}

@Override

public void setReleaseLabel(CharSequence releaseLabel) {

mReleaseLabel = releaseLabel;

}

@Override

public void setTextTypeface(Typeface tf) {

mHeaderText.setTypeface(tf);

}

public final void showInvisibleViews() {

// if (View.INVISIBLE == mHeaderText.getVisibility()) {

// mHeaderText.setVisibility(View.VISIBLE);

// }

// if (View.INVISIBLE == mHeaderProgress.getVisibility()) {

// mHeaderProgress.setVisibility(View.VISIBLE);

// }

if (View.INVISIBLE == mHeaderImage.getVisibility()) {

mHeaderImage.setVisibility(View.VISIBLE);

}

// if (View.INVISIBLE == mSubHeaderText.getVisibility()) {

// mSubHeaderText.setVisibility(View.VISIBLE);

// }

}

/**

  • Callbacks for derivative Layouts

*/

protected abstract int getDefaultDrawableResId();

protected abstract void onLoadingDrawableSet(Drawable imageDrawable);

protected abstract void onPullImpl(float scaleOfLayout);

protected abstract void pullToRefreshImpl();

protected abstract void refreshingImpl();

protected abstract void releaseToRefreshImpl();

protected abstract void resetImpl();

private void setSubHeaderText(CharSequence label) {

if (null != mSubHeaderText) {

if (TextUtils.isEmpty(label)) {

mSubHeaderText.setVisibility(View.GONE);

} else {

mSubHeaderText.setText(label);

// Only set it to Visible if we’re GONE, otherwise VISIBLE will

// be set soon

if (View.GONE == mSubHeaderText.getVisibility()) {

mSubHeaderText.setVisibility(View.VISIBLE);

}

}

}

}

private void setSubTextAppearance(int value) {

if (null != mSubHeaderText) {

mSubHeaderText.setTextAppearance(getContext(), value);

}

}

private void setSubTextColor(ColorStateList color) {

if (null != mSubHeaderText) {

mSubHeaderText.setTextColor(color);

}

}

private void setTextAppearance(int value) {

if (null != mHeaderText) {

mHeaderText.setTextAppearance(getContext(), value);

}

if (null != mSubHeaderText) {

mSubHeaderText.setTextAppearance(getContext(), value);

}

}

private void setTextColor(ColorStateList color) {

if (null != mHeaderText) {

mHeaderText.setTextColor(color);

}

if (null != mSubHeaderText) {

mSubHeaderText.setTextColor(color);

}

}

}

最后就不要让我提供源码了,笔者这里只是提供一个思路,把刷新的头布局更改为我们的自定义布局就行了。

最终效果是下拉刷新的时候会有一个不停在闪的灯,这里没有录制gif动画,只提供一张截图吧:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

愿你有一天,真爱自己,善待自己。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-pdp0X6nJ-1711762594284)]

[外链图片转存中…(img-AyUwgbiv-1711762594285)]

[外链图片转存中…(img-iaf1fIQO-1711762594285)]

[外链图片转存中…(img-v9vIwdiF-1711762594285)]

[外链图片转存中…(img-shaX8Ku3-1711762594285)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

愿你有一天,真爱自己,善待自己。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值