• 自定义下拉刷新组件


    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();


    }
    }
  • 相关阅读:
    设计模式之策略设计模式
    我的Java编码规范
    Jvm中的垃圾回收
    Jvm运行时内存解析
    SSH框架的搭建
    xshell5运行hadoop集群
    安装虚拟机和网络配置
    大数据技术原理与运用知识
    Redis高级应用解析:缓存穿透、击穿、雪崩
    B+Tree原理及mysql的索引分析
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5177524.html
Copyright © 2020-2023  润新知