自定义下拉刷新组件

package com.example.customclass;

import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.ScrollView;import android.widget.Scroller;

import com.example.test.R;

/** * Created by LI on 2016/1/5. */public class RefershLinearLayout extends LinearLayout {    ImageView direction;    ProgressBar bar;    Scroller scroller;    View header;    Context mContext;    int headerHeightPix;    int lastY;    FreshListener freshListener;    enum Status{        refreshing,normal,pulldown    }    public int status;    public RefershLinearLayout(Context context) {        super(context);    }

    public RefershLinearLayout(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        scroller = new Scroller(mContext);        init();    }

    private void init() {        header = LayoutInflater.from(mContext).inflate(R.layout.header,null);        bar = (ProgressBar) header.findViewById(R.id.bar);        direction = (ImageView) header.findViewById(R.id.direction);        headerHeightPix = (int) (50*mContext.getResources().getDisplayMetrics().density);        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,headerHeightPix);        params.topMargin = (0-headerHeightPix);        addView(header, params);        status = 0;    }

    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        int y= (int) ev.getRawY();        Log.i("LIJILONG", "onInterceptTouchEvent()");        switch(ev.getAction()){            case MotionEvent.ACTION_DOWN:                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int m = y - lastY;                lastY = y;                if(m>=2.0 &&canScroll()) {                    Log.i("LIJILONG" ,"canScroll() true");                    return true;                }                break;        }        return false;    }

    @Override    public boolean onTouchEvent(MotionEvent event) {        if(status == 2){            Log.i("lijilong", "onTouchEvent status = "+status);            return false;        }        int y = (int) event.getRawY();        switch(event.getAction()){            case MotionEvent.ACTION_DOWN:                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int m = y - lastY;                lastY = y;                moveLayout(m);                break;            case MotionEvent.ACTION_UP:                flying();                break;        }

        return true;    }

    private void flying() {        LayoutParams params = (LayoutParams) header.getLayoutParams();        int marginTop = params.topMargin;        if(marginTop >= 0){            //refresh();            bar.setVisibility(View.VISIBLE);            direction.setVisibility(View.GONE);            scroller.startScroll(0, marginTop, 0, 0 - marginTop);            invalidate();//            params.topMargin = 0;//            header.setLayoutParams(params);//            header.invalidate();//            invalidate();//            invalidate();            status = 2;            if(freshListener !=null){                freshListener.onFresh();            }        }else{            //returnInit();            scroller.startScroll(0, marginTop, 0 ,0-(headerHeightPix+marginTop));            invalidate();            status = 0;

        }    }    public void finishFresh(){        status = 0;        bar.setVisibility(View.GONE);        scroller.startScroll(0, 0, 0, (0 - headerHeightPix));//        LayoutParams params = (LayoutParams) header.getLayoutParams();//        int marginTop = params.topMargin;//        params.topMargin = (0-headerHeightPix);//        header.setLayoutParams(params);//        header.invalidate();

    }

    private void moveLayout(int m) {        Log.i("lijilong","moveLayout");        LayoutParams params = (LayoutParams) header.getLayoutParams();        int margintop = params.topMargin;            direction.setVisibility(View.VISIBLE);            bar.setVisibility(View.GONE);            if(margintop >= 0){                direction.setImageResource(R.drawable.refresh_arrow_up);            }else{                direction.setImageResource(R.drawable.refresh_arrow_down);            }            int position_y = (int) (margintop + m*0.3);            params.topMargin = position_y;            header.setLayoutParams(params);           // header.invalidate();            //invalidate();            status = 1;    }

    @Override    public void computeScroll() {        super.computeScroll();        if (scroller.computeScrollOffset()) {//scroll 动作还未结束

            int i = this.scroller.getCurrY();            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.header                    .getLayoutParams();            int k = Math.max(i, (0-headerHeightPix));            lp.topMargin = k;            this.header.setLayoutParams(lp);            postInvalidate();        }    }

    private boolean canScroll() {        // TODO Auto-generated method stub        View childView;        if (getChildCount() > 1) {            Log.e("lijilong","getChildCount="+getChildCount());            for(int i=0;i<getChildCount();i++){                Log.e("lijilong",getChildAt(i).toString());            }            childView = this.getChildAt(1);            if (childView instanceof ListView) {                int top = ((ListView) childView).getChildAt(0).getTop();                int pad = ((ListView) childView).getListPaddingTop();                if ((Math.abs(top - pad)) < 3                        && ((ListView) childView).getFirstVisiblePosition() == 0) {                    return true;                } else {                    return false;                }            } else if (childView instanceof ScrollView) {                if (((ScrollView) childView).getScrollY() == 0) {                    return true;                } else {                    return false;                }            }

        }        Log.i("LIJILONG","canScroll false");        return false;    }

    public void setListener(FreshListener listener){        freshListener = listener;    }   public interface FreshListener{        public void onFresh();

    }}
时间: 2025-01-20 06:28:39

自定义下拉刷新组件的相关文章

SuperSwipeRefreshLayout 一个功能强大的自定义下拉刷新组件

SuperSwipeRefreshLayout 一个功能强大的自定义下拉刷新组件. Why? 下拉刷新这种控件,想必大家用的太多了,比如使用很多的XListView等.最近,项目中很多列表都是使用ReyclerView实现的,代替了原有的ListView,原有下拉刷新方式遭到挑战.本来Google推出的SwipeRefreshLayout已经能够满足大部分的需求了.然而,由于其定制性较差,下拉刷新的样式无法修改,而且被嵌套的View也无法跟随手指的滑动而滑动.基于以上考虑,定制自己强大的Supe

自定义View——利用下拉刷新组件实现上拉加载

注:本文demo已经提交github,地址完整代码如下,demo工程已经上传至GitHub, github地址https://github.com/wsclwps123/UpLoadSwipeRefreshLayout 感谢大家支持! 在Android开发中,我们经常会用到列表下拉刷新和上拉加载的功能. Google在support.v4包中提供了一个组件可以用来进行下来刷新,这个组件是SwipeRefreshLayout. 下面我们来看一下这个组件的使用: 在布局文件中加上xml代码 <and

打造通用的Android下拉刷新组件(适用于ListView、GridView等各类View)

前言 最近在做项目时,使用了一个开源的下拉刷新ListView组件,极其的不稳定,bug还多.稳定的组件又写得太复杂了,jar包较大.在我的一篇博客中也讲述过下拉刷新的实现,即Android打造(ListView.GridView等)通用的下拉刷新.上拉自动加载的组件.但是这种通过修改Margin的形式感觉不是特别的流畅,因此在这漫长的国庆长假又花了点时间用另外的原理实现了一遍,特此分享出来. 基本原理 原理就是自定义一个ViewGroup,将Header View, Content View,

Android打造通用的下拉刷新组件

还记得上一篇 blog 的内容吗?如果不记得建议先去了解一下,Android 事件处理全面剖析 ,因为下拉刷新需要用到手势的处理,而上一篇文章中,对事件处理做了很详细的说明,了解了事件的处理机制,对理解本篇文章有很大的帮助.好了,这里就当大家都已经对事件处理有了一定的了解,开始我们的下拉刷新征程. 还是老规矩,先上效果图,再根据效果图来分析实现的原理: 一 .分析原理 我们都知道,listView 控件为我们提供了 addHeaderView.和 addFootView 的方法,我们通过此方法可

Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一个,做完了和QQ的对比了一下,并没有太大区别,今天分享给大家,其实并不难,但是不知道为什么网上没有比较好的Demo,当你的项目真的很急的时候,又没有比较好的Demo,那么"那条友谊的小船儿真是说翻就翻啊",好了,下面先来具体看一下实现后的效果吧: 代码已经上传到Github上了,小伙伴们记

Android自定义下拉刷新动画--仿百度外卖下拉刷新

好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了"百度外卖"的下拉刷新,今天的主题就是它–自定义下拉刷新动画. 看一下实现效果吧: 动画 我们先来看看Android中的动画吧: Android中的动画分为三种: Tween动画,这一类的动画提供了旋转.平移.缩放等效果. Alpha – 淡入淡出 Scale

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属

React Native控件之PullToRefreshViewAndroid下拉刷新组件讲解

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50664323 本文出自:[江清清的博客] (一)前言 今天我们一起来看一下PullToRefreshViewAndroid下拉刷新组件讲解以及使用实例 刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同时博客左侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该PullToRefr

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

Android UI- PullToRrefresh自定义下拉刷新动画 如果觉得本文不错,麻烦投一票,2014年博客之星投票地址:http://vote.blog.csdn.net/blogstar2014/details?username=wwj_748#content 本篇博文要给大家分享的是如何使用修改开源项目PullToRrefresh下拉刷新的动画,来满足我们开发当中特定的需求,我们比较常见的一种下拉刷新样式可能是以下这种: 就是下拉列表的时候两个箭头上下翻转,更改日期文本和刷新状态,