Android custom elastic ListView control instance code of three methods

  • 2021-01-14 06:38:58
  • OfStack

There are many different ways to achieve the elastic effect of ListView in Android. There are also many ways to search on the Internet. The following are two ways to achieve the elastic effect of ListView that are often used in the project (basically you can use it), for your reference:

Elastic ListView

Method 1:


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, attrs, 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)mMaxYOverscrollDistance, isTouchEvent);
}
/**
*  Set up the App All of the ListView Flexible particle size 
* @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;
}
}

The second one is simple and easy to understand. It only dynamically changes the distance that ListView can move on the Y axis. The code is as follows:


import android.content.Context; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.widget.ListView; 
/** 
*  The elastic ListView .  
* @author E 
*/ 
public class FlexiListView extends ListView{ 
// Initial pullability Y Axial distance  
private static final int MAX_Y_OVERSCROLL_DISTANCE = 100; 
// Contextual environment  
private Context mContext; 
// Can actually pull up and down Y Distance along the axis  
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, AttributeSet attrs, int defStyle) { 
super(context, attrs, 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, int deltaY, int scrollX, int scrollY, int scrollRangeX, 
int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { 
// This is where the nature of the implementation changes dynamically maxOverScrollY The value of the  
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); 
} 
}

The third method, combined with gestures to achieve the elastic effect of ListView, here can be more extended according to gestures, the code is as follows:


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; 
/** 
*  Having an elastic effect ListView . The main thing is to implement the superclass dispatchTouchEvent Methods and OnGestureListener In the onScroll Methods.  
* @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, AttributeSet attrs) { 
super(context, attrs); 
this.context = context; 
} 
public FlexibleListView(Context context, AttributeSet attrs, int defStyle) { 
super(context, attrs, 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, 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, MotionEvent e2, float velocityX, 
float velocityY) { 
return false; 
} 
}

Above to share a few more commonly used methods, this site this site sorting out, I hope to be helpful to you.


Related articles: