Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android 自定义弹性ListView控件实例代码(三种方法)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_675_0@关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果方法(基本上拿来就可以用),供大家参:

@H_675_0@弹性ListView

@H_675_0@第一种方法

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;
}
}
@H_675_0@第二种比较简单,好容易理解,只是动态改变了ListView在Y轴上的可移动距离,代码如下:

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); 
} 
}
@H_675_0@第三种方法,结合了手势来实现ListView的弹性效果,这里可以根据手势来进行更多的扩展,代码如下:

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; 
} 
}
@H_675_0@以上给大家分享了几种比较常用的方法,编程小技巧小编整理出来的,希望对大家有所帮助。

大佬总结

以上是大佬教程为你收集整理的Android 自定义弹性ListView控件实例代码(三种方法)全部内容,希望文章能够帮你解决Android 自定义弹性ListView控件实例代码(三种方法)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。