Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android——实现酷炫的RecyclerView心形交错下拉刷新动画

$
0
0

最近好久没发博客了啊...虽然工作比较忙,但还是懈怠了。

简介:

本文介绍实现的一个带动效的RecyclerView下拉刷新动画,效果如下图: 


往下拉时会有两个爱心从左边和上方聚合到中心,然后自动弹回时他们又回复原位。


实现原理:

1.基于Aspsine的上拉加载下拉刷新的RecycerView库实现HeadView的添加。

2.自定义HeadView,根据measureRlLength中的参数变化实现心形动画的效果。


代码实现:

1.首先需要引入IRecyclerView的库,地址:https://github.com/Aspsine/IRecyclerView

我这里图方便就直接把整个源码copy进来了。

2.首先我们需要实现基本的下拉刷新:

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<com.ng.ngtestrvrefresh.irecyclerview.IRecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/irv_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    app:loadMoreEnabled="true"
    app:loadMoreFooterLayout="@layout/layout_irecyclerview_load_more_footer"
    app:refreshEnabled="true"
    app:refreshHeaderLayout="@layout/layout_irecyclerview_refresh_header"
    tools:context=".MainActivity"
    />
主Aty:MainActivity.java

public class MainActivity extends AppCompatActivity
        implements OnRefreshListener {

    IRecyclerView irv_main;
    MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        irv_main = (IRecyclerView) findViewById(R.id.irv_main);
        irv_main.setLayoutManager(new LinearLayoutManager(this));

        myAdapter = new MyAdapter(this);
         irv_main.setIAdapter(myAdapter);
        irv_main.setOnRefreshListener(this);

    }

    @Override
    public void onRefresh() {
        testHandler.sendMessageDelayed(new Message(), 500);
    }

    Handler testHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            irv_main.setRefreshing(false);
        }
    };
}
其他配置文件和资源我就不一一发上来了,文末可以下载源代码大家可以去里面找。

3.这里重点要讲的是HeadView的实现:

LoveIconHeaderView.java

public class LoveIconHeaderView extends FrameLayout implements RefreshTrigger {

    //private ImageView ivIh;

    private TextView tv_mih;

    private RelativeLayout rv_ih;

    private int defaultLengthDp = 80;

    public LoveIconHeaderView(Context context) {
        this(context, null);
    }

    public LoveIconHeaderView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LoveIconHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        inflate(context, R.layout.layout_irecyclerview_love_icon_refresh_header_view, this);
        tv_mih = (TextView) findViewById(R.id.tv_mih);
        rv_ih = (RelativeLayout) findViewById(R.id.rv_ih);
    }

    @Override
    public void onStart(boolean automatic, int headerHeight, int finalHeight) {
        tv_mih.setText("下拉刷新");
    }

    @Override
    public void onMove(boolean finished, boolean automatic, int moved) {
        if (!finished) {
            measureRlLength(DensityUtils.px2dip(getContext(), moved), rv_ih);
        } else {
            measureRlLength(DensityUtils.px2dip(getContext(), moved), rv_ih);
        }
    }

    //得到爱心RelativeLayout的边长
    private void measureRlLength(int movedDp, RelativeLayout rv) {
        if (defaultLengthDp >= movedDp) {
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) rv.getLayoutParams();
            layoutParams.width = DensityUtils.dip2px(getContext(),defaultLengthDp - movedDp* 40/defaultLengthDp  );
            layoutParams.height = DensityUtils.dip2px(getContext(),defaultLengthDp - movedDp* 40/defaultLengthDp );
            rv.setLayoutParams(layoutParams);
        }
    }

    @Override
    public void onRefresh() {
        tv_mih.setText("正在锁定...");
    }

    @Override
    public void onRelease() {
        tv_mih.setText("正在锁定...");
    }

    @Override
    public void onComplete() {
        tv_mih.setText("正在锁定...");
    }

    @Override
    public void onReset() {
        //ivIh.setRotationY(0);
    }
}
可以看到重点是在measureRlLength类中根据移动的RelativeLayout边长动态改变心形边框的大小,造成一种移动重合的效果,因为弹回时刚好相反,就能形成离散的效果。

结合布局文件就更加清晰了:



最后是源码下载地址,欢迎下载,有什么问题随时问我哈,原理上各种随着滑动实现的动画都能用这一套机制实现的。

源码下载

最近想找实现自己封装一套RecyclerView的各种效果组件,但是又各种事情冲突- -哎还是不够努力。

作者:qq_22770457 发表于2017/1/8 16:31:53 原文链接
阅读:343 评论:1 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>