zoukankan      html  css  js  c++  java
  • android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面

    关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等。第一:大多数实现库都难以进行动画和样式的自己定义。

    第二:不能非常好的兼容多种滚动控件,它们都对listView、RecyclerView等进行了不同程度的又一次实现,你在项目中就得使用库提供的PullToRefreshListView、PullToRefreshRecyclerView等来取代源生的listView、RecyclerView等。这种方式事实上并不好,随着android版本号的不断升级源生的listView、RecyclerView也不断加入新特性和对之前bug的改动,这使得三方实现的控件非常难跟上google的节奏,当源生listView已经更新多个版本号之后,三方的ListView可能还在使用低版本号的实现方式。

    基于如上两个原因。我開始着手开发SpringView(弹性View)

    SpringView有哪些长处?

    1. 能对header/footer(头部/尾部)的样式和动画进行高度自己定义,单独将header/footer独立出来。差点儿能够实现不论什么你想要的效果,仅仅须要继承BaseHeader/BaseFooter实现相应接口就能够。

    2. 能动态地替换header/footer。仅仅须要设置不同的头尾就可以:springView.setHeader(MyHeader());

    3. 在不重写源生控件的情况下。完美支持系统源生的listView、RecyclerView、ScrollView、WebView等,你依旧使用google提供的官方控件,SpringView全然不做干涩。

    4. 使用简单。对于简单的需求甚至不用写不论什么代码。仅仅须要在布局中为SpringView设置header=”@layout/…”属性就可以。

    5. SpringView是非常轻量级的实现。提供了非常easy拓展的对外接口

    6. SpringView支持多点触控,能够两仅仅手连续拖拽。你能够定制一些趣味的动画(比如demo5的仿acfun效果)

    7. SpringView提供了2种拖拽方式(重叠和尾随)。能够动态地切换

    8. SpringView为不想去自己定义头/尾的懒人提供了7种默认的实现(模仿了阿里。腾讯,美团等多种风格)例如以下。还会继续添加

    DefaultHeader GearHeader

    WebHeader AcfunHeader

    QQHeader MeituanHeader

    AliHeader

    怎样使用 SpringView?

    源代码及demo下载 gitbub: 下载地址

    在布局文件里加入SpringView,并把你想要拖拽的控件放在SpringView中,给SpringView加入app:header=”@layout/…”属性。设置一个自己编写的头部的布局就可以(footer同理):

        <com.liaoinstan.springview.widget.SpringView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:header="@layout/myheader"
                app:footer="@layout/myfooter">
    
                <listView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>
    
         </com.liaoinstan.springview.widget.SpringView>

    这样,最主要的实现就完毕了,执行看看吧。

    当然,你也能够不再布局中设置,使用代码动态加入:

        //DefaultHeader/Footer是SpringView已经实现的默认头/尾之中的一个
        //很多其它还有MeituanHeader、AliHeader、RotationHeader等如上图7种
        springView.setHeader(new DefaultHeader(this));
        springView.setFooter(new DefaultFooter(this));

    刷新和载入很多其它的事件处理

    假设须要处理的话,仅仅需在代码中加入监听:

    springView.setListener(new SpringView.OnFreshListener() {
          @Override
          public void onRefresh() {
          }
          @Override
          public void onLoadmore() {
          }
    });

    怎样自己定义一个Header或Footer

    具体的你能够看下几种默认实现的Header源代码,这里仅仅简介下:

    我们要做一个简单的能够记录拖拽了多少次的Header。

    首先新建一个自己定义头部布局。就是在RelativeLayout中放一个TextView啦:

    这里写图片描写叙述

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="@drawable/view_post_comment_bg"
        android:layout_gravity="top">
    
        <TextView
            android:layout_width="120dp"
            android:gravity="center"
            android:layout_height="wrap_content"
            android:text="this is TextView  "
            android:background="#ff0000"
            android:textColor="#ffffff"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:id="@+id/textView" />
    </RelativeLayout>
    

    接着,新建一个MyHeader基础自BaseHeader:

    public class MyHeader extends BaseHeader{
        //获取Header
        @Override
        public View getView(LayoutInflater inflater, ViewGroup viewGroup) {}
    
        //拖拽開始前回调
        @Override
        public void onPreDrag(View rootView) {}
    
        //手指拖拽过程中不断回调。dy为拖拽的距离,能够依据拖动的距离加入拖动过程动画
        @Override
        public void onDropAnim(View rootView, int dy) {}
    
        //手指拖拽过程中每次经过临界点时回调。upORdown是向上经过还是向下经过
        @Override
        public void onLimitDes(View rootView, boolean upORdown) {}
    
        //拉动超过临界点后松开时回调
        @Override
        public void onStartAnim() {}
    
        //头部已经所有弹回时回调
        @Override
        public void onFinishAnim() {}
    }

    凝视已经非常清楚了。当中必须实现的方法是getView(),将头部的View实例返回给SpringView。其余方法有需求就实现。

    实现getView()方法,加入一个成员变量保存头部中的TextView:

        private TextView textView;
        @Override
        public View getView(LayoutInflater inflater, ViewGroup viewGroup) {
            View view = inflater.inflate(R.layout.header_my, viewGroup, true);
            textView = (TextView)view.findViewById(R.id.textView);
            return view;
        }

    实现onLimitDes方法。在每次经过临界点时改变TextView的内容:

        private int i = 0;
        @Override
        public void onLimitDes(View rootView, boolean upORdown) {
            i++;
            textView.setText("this is TextView "+i);
        }

    OK,在Activity中为SpringView设置我们自己定义的MyHeader就能够了。再设置一个监听器,在刷新和载入很多其它的时候等待1秒调用onFinishFreshAndLoad()结束刷新动作。

            springView = (SpringView) findViewById(R.id.springview);
            springView.setHeader(new MyHeader());
    
            springView.setListener(new SpringView.OnFreshListener() {
                @Override
                public void onRefresh() {
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            springView.onFinishFreshAndLoad();
                        }
                    }, 1000);
                }
                @Override
                public void onLoadmore() {
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            springView.onFinishFreshAndLoad();
                        }
                    }, 1000);
                }
            });

    这里写图片描写叙述

    这样就完毕了一个简单的自己定义Header,Footer同理。

    怎样自己定义最大下拉高度,临界高度。和回弹高度

    在BaseHeader(BaseFooter同理)中默认已经实现3个方法。分别返回的是临界高度(limit hight),下拉最大高度(max height)。下拉弹动高度(spring height):
    假设有更加复杂的需求,须要更改这些高度的话。就在自己的Header中重写这些方法。凝视已经非常清楚了:

    public abstract class BaseHeader implements SpringView.DragHander{
        /**
         * 这种方法用于设置当前View的临界高度(limit hight),即拉动到多少会被认定为刷新超作,而没到达该高度则不会执行刷新
         * 返回值大于0才有效,假设<=0 则设置为默认header的高度
         * 默认返回0
         */
        @Override
        public int getDragLimitHeight(View rootView) {
            return 0;
        }
    
        /**
         * 这种方法用于设置下拉最大高度(max height),不管怎么拉动都不会超过这个高度
         * 返回值大于0才有效,假设<=0 则默认600px
         * 默认返回0
         */
        @Override
        public int getDragMaxHeight(View rootView) {
            return 0;
        }
    
        /**
         * 这种方法用于设置下拉弹动高度(spring height),即弹动后停止状态的高度
         * 返回值大于0才有效,假设<=0 则设置为默认header的高度
         * 默认返回0
         */
        @Override
        public int getDragSpringHeight(View rootView) {
            return 0;
        }
    }

    到这里,SpringView的用法基本介绍完了,后面的文章会陆续从源代码介绍SpringView的实现,和自带的各种默认Header的实现

    下载请移步gitbub:

    我的github

    认为不错的话。以下有个赞能够点一下:)

  • 相关阅读:
    b_zj_最大点集(排序+小思维)
    b_zj_推箱子(记录人与箱子状态)
    b_zj_头条校招(分类讨论)
    Mybatis基础:缓存
    MyBatis嵌套查寻&嵌套结果查询--复杂查询
    MyBatis报错: java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.wang.da
    log4j.properties详细配置 超干净!
    mybatis事务处理
    第一次使用MyBatis
    什么是MyBatis?它是用来做什么的?
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7263690.html
Copyright © 2011-2022 走看看