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(); } }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦