为了账号安全,请及时绑定邮箱和手机立即绑定

自定义下拉刷新组件

标签:
Android
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();


    }
}

原文链接:http://www.apkbus.com/blog-653697-59927.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消