Android:实现一个酷炫的中秋主题上下拉自定义效果

大家好,我是似曾相识2022。不喜欢唱跳篮球,但对杰伦的Rap却情有独钟。

由于中秋将至,今天就给大家带来一款以中秋为主题的上下拉加载动画效果,咱们废话不多说直接上效果图:

效果是不是很熟悉?没错这里采用了一个备受欢迎的三方轮子: SmartRefreshLayout,在很多项目中相信都使用过它但基本都是使用轮子中自带的HeaderFooter,今天咱们就简单讲讲如何实现属于自己的上下拉效果。

既然脚手架别人已经给我们搭好了,那我们就站在巨人的肩膀上继续发光发彩。布局中仍然使用SmartRefreshLayout 作为父布局,我们只需要自定义HeaderFooter,那么如何实现呢?

通过熟读三方库文档得知SmartRefreshLayout具有非常高得自定义和扩展性,其中包含了如下结构:

  • RefreshLayout 下拉的基本功能,包括布局测量、滑动事件处理、参数设定等等
  • RefreshHeader 下拉头部的事件处理和显示接口
  • RefreshFooter 上拉底部的事件处理和显示接口
  • RefreshContent 对不同内容的统一封装,包括判断是否可滚动、回弹判断、智能识别

虽说我们可以直接在SmartRefreshLayout内部直接添加控件的方式达到效果,但缺少很多时机去控制动效或文字更改。我们需要去继承RefreshHeader接口以便更好的时机去控制各状态的效果。

ini 复制代码
<com.scwang.smart.refresh.layout.SmartRefreshLayout
    android:id="@+id/smart"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    //第一个控件被认为是Header
     <TextView
         android:text="header"
         android:gravity="center"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>
      ......
</com.scwang.smart.refresh.layout.SmartRefreshLayout>

咱们来看看RefreshHeader中都有哪些重要的方法:

java 复制代码
public interface RefreshHeader {
    //获取真实视图(必须返回,不能为null)
    @NonNull
    View getView();

    //获取变换方式(必须指定一个:平移、拉伸、固定、全屏)
    SpinnerStyle getSpinnerStyle();

    // 设置主题颜色 (如果自定义的Header没有注意颜色,本方法可以什么都不处理)
    void setPrimaryColors(@ColorInt int ... colors);

    // 尺寸定义初始化完成
    void onInitialized(RefreshKernel kernel, int height, int maxDragHeight);

    //开始动画(开始刷新或者开始加载动画)
    void onStartAnimator(RefreshLayout layout, int height, int maxDragHeight);

    //动画结束
    int onFinish(RefreshLayout layout, boolean success);

    //手指拖动下拉(会连续多次调用,用于实时控制动画关键帧)
    void onPulling(float percent, int offset, int headerHeight, int maxDragHeight);

    //手指释放之后的持续动画(会连续多次调用,用于实时控制动画关键帧)
    void onReleasing(float percent, int offset, int headerHeight, int maxDragHeight);
}

这里咱们通过继承LinearLayout 再实现RefreshHeader来自定义头部效果:

kotlin 复制代码
class MidAutumnHeader constructor(context: Context, attrs: AttributeSet) :LinearLayout(context, attrs),RefreshHeader{

//内部添加一个gif展示控件
private val img by lazy { GifImageView(context).apply {
      setImageResource(R.mipmap.threes)
} }

//初始化就添加
init {
    addView(img)
}

 //下拉效果分为Translate(平行移动)、Scale(拉伸形变)、FixedBehind(固定在背后)、FixedFront(固定在前面)、MatchLayout(填满布局)
 override fun getSpinnerStyle() = SpinnerStyle.Translate

//开始动画 下拉的时候开始触发
override fun onStartAnimator(refreshLayout: RefreshLayout, height: Int, maxDragHeight: Int) {
}


//动画结束后
override fun onFinish(refreshLayout: RefreshLayout, success: Boolean): Int {
     //这里我们可以操作一些动画结束后的状态
    return 1000
}
 ......
}

就这样一个简单的Header 就实现了,Footer 的实现也是一样,只是为了方便使用了另一个三方库GifImageView 来加载Gif动画。我们只需要将MidAutumnHeader 替换掉XML 中的TextView 就完成了Header的配置。本以为这样就完美了,谁知道一运行下拉的时候动画瞬间即逝。

最后找了半天原因才发现需要给SmartRefreshLayout添加上下拉监听,默认是3秒结束:

scss 复制代码
smart.setOnRefreshListener {
    smart.finishRefresh(20000)
}
smart.setOnLoadMoreListener {
    smart.finishLoadMore(10000)
}

总结:

  • 为了能更好的管控下拉动画的时机,在自定义的时候一定要去实现RefreshHeaderRefreshFooter接口,在对应的回调处理对应的逻辑可以使动画效果更加丰富。
  • 配合类似GifImageViewLottie等三方库来加载动画可以使我们的效果看起来更酷炫且非常简单。当然也可以自己使用属性动画来实现。

好了以上便是实现一个酷炫的中秋主题上下拉自定义效果的全部内容,实现起来是不是很简单?在此也提前祝大家双节快乐!如果对你有帮助的话千万别忘记一键三连哦!

相关推荐
木易 士心8 分钟前
MVC、MVP 与 MVVM:Android 架构演进之路
android·架构·mvc
百锦再10 分钟前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟13 分钟前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
介一安全40 分钟前
【Frida Android】实战篇15:Frida检测与绕过——基于/proc/self/maps的攻防实战
android·网络安全·逆向·安全性测试·frida
hhy_smile1 小时前
Android 与 java 设计笔记
android·java·笔记
laocooon5238578861 小时前
C#二次开发中简单块的定义与应用
android·数据库·c#
似霰2 小时前
传统 Hal 开发笔记5 —— 添加硬件访问服务
android·framework·hal
恋猫de小郭2 小时前
Android 宣布 Runtime 编译速度史诗级提升:在编译时间上优化了 18%
android·前端·flutter
csj502 小时前
安卓基础之《(4)—Activity组件》
android
游戏开发爱好者82 小时前
H5 混合应用加密 Web 资源暴露到 IPA 层防护的完整技术方案
android·前端·ios·小程序·uni-app·iphone·webview