大佬教程收集整理的这篇文章主要介绍了Android 自定义弹性ListView控件实例代码(三种方法),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
import android.content.Context; import android.content.res.Configuration; import android.util.AttributeSet; import android.util.Displaymetrics; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * Created by Noah on 2016/1/16. */ public class BounceListView extends ListView { private static final float MAX_Y_OVERSCROLL_DISTANCE = 200; private float mMaxYOverscrollDistance; public BounceListView(Context context) { this(context,null); } public BounceListView(Context context,AttributeSet attrs) { this(context,attrs,0); } public BounceListView(Context context,AttributeSet attrs,int defStyleAttr) { super(context,defStyleAttr); initBounceListView(); } private void initBounceListView(){ final Displaymetrics metrics = getContext().getresources().getDisplaymetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected Boolean overScrollBy(int deltaX,int deltaY,int scrollX,int scrollY,int scrollRangeX,int scrollRangeY,int maxOverScrollX,int maxOverScrollY,Boolean isTouchEvent) { return super.overScrollBy(deltaX,deltaY,scrollX,scrollY,scrollRangeX,scrollRangeY,maxOverScrollX,(int)R_382_11845@MaxYOverscrollDistance,isTouchEvent); } /** * 设置本App所有的ListView弹性粒度 * @param ctx * @param size * @return */ public Boolean configGlobalMaxOverScrollDistance(Context ctx,int sizE) { try { final Displaymetrics metrics = ctx.getresources().getDisplaymetrics(); final float density = metrics.density; int value = (int) (density * sizE); mMaxYOverscrollDistance = value; ViewConfiguration config = ViewConfiguration.get(ctX); Field mOverscrollDistance = ViewConfiguration.class.getDeclaredField("mOverscrollDistance"); if(!mOverscrollDistance.isAccessible() || !Modifier.isPublic(mOverscrollDistance.getModifiers())) { mOverscrollDistance.setAccessible(true); } mOverscrollDistance.seTint(config,value); } catch (Exception E) { e.printStackTrace(); return false; } return true; } }
import android.content.Context; import android.util.AttributeSet; import android.util.Displaymetrics; import android.widget.ListView; /** * 弹性ListView。 * @author E */ public class FlexiListView extends ListView{ //初始可拉动Y轴方向距离 private static final int MAX_Y_OVERSCROLL_DISTANCE = 100; //上下文环境 private Context mContext; //实际可上下拉动Y轴上的距离 privatE int mMaxYOverscrollDistance; public FlexiListView(Context context){ super(context); mContext = context; initBounceListView(); } public FlexiListView(Context context,AttributeSet attrs) { super(context,attrs); mContext = context; initBounceListView(); } public FlexiListView(Context context,int defStylE) { super(context,defStylE); mContext = context; initBounceListView(); } private void initBounceListView(){ final Displaymetrics metrics = mContext.getresources().getDisplaymetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected Boolean overScrollBy(int deltaX,Boolean isTouchEvent) { //实现的本质就是在这里动态改变了maxOverScrollY的值 return super.overScrollBy(deltaX,mMaxYOverscrollDistance,isTouchEvent); } }
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.onGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ListView; /** * 具有弹性效果的ListView。主要是实现父类dispatchTouchEvent方法和OnGestureListener中onScroll方法。 * @author E */ public class FlexibleListView extends ListView implements OnGestureListener{ private Context context = null; private Boolean outBound = false; privatE int distance; privatE int firstOut; public FlexibleListView(Context context,attrs); this.context = context; } public FlexibleListView(Context context,defStylE); this.context = context; } public FlexibleListView(Context context) { super(context); this.context = context; } GestureDetector lisGestureDetector = new GestureDetector(context,this); @Override public Boolean dispatchTouchEvent(MotionEvent event) { int act = event.getAction(); if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL) && outBound) { outBound = false; // scroll BACk } if (!lisGestureDetector.onTouchEvent(event)) { outBound = false; } else { outBound = true; } Rect rect = new Rect(); getLocalVisibleRect(rect); TranslateAnimation am = new TranslateAnimation( 0,-rect.top,0); am.setDuration(300); startAnimation(am); scrollTo(0,0); return super.dispatchTouchEvent(event); } @Override public Boolean onDown(MotionEvent E) { return false; } @Override public void onShowPress(MotionEvent E) { } @Override public Boolean onSingleTapUp(MotionEvent E) { return false; } @Override public Boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY) { int firstPos = getFirstVisiblePosition(); int lastPos = getLastVisiblePosition(); int itemCount = getCount(); // outbound Top if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) { scrollTo(0,0); return false; } View firstView = getChildAt(firstPos); if (!outBound) firstOut = (int) e2.getRawY(); if (firstView != null&& (outBound || (firstPos == 0 && firstView.getTop() == 0 && distanceY < 0))) { // Record the length of each slide distance = firstOut - (int) e2.getRawY(); scrollTo(0,distance / 2); return true; } // outbound Bottom return false; } @Override public void onLongPress(MotionEvent E) { } @Override public Boolean onFling(MotionEvent e1,float veLocityX,float veLocityY) { return false; } }
以上是大佬教程为你收集整理的Android 自定义弹性ListView控件实例代码(三种方法)全部内容,希望文章能够帮你解决Android 自定义弹性ListView控件实例代码(三种方法)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。