Android开发中列表视图弹性效果的两种方法
来源:爱站网时间:2021-01-28编辑:网友分享
在Android开发中,listview的弹性实现效果的方法多种多样,但是在实际项目开发中,通常使用的就这几个,下面是爱站技术频道小编为大家带来的Android开发中列表视图弹性效果的两种方法,一起进入下文学习吧!
在Android开发中,listview的弹性实现效果的方法多种多样,但是在实际项目开发中,通常使用的就这几个,下面是爱站技术频道小编为大家带来的Android开发中列表视图弹性效果的两种方法,一起进入下文学习吧!
第一种比较简单,好容易理解,只是动态改变了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, 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) {
//实现的本质就是在这里动态改变了maxOverScrollY的值
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);
}
}
第二种方法,结合了手势来实现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, 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
以上便是爱站技术频道小编和大家分享的Android开发中列表视图弹性效果的两种方法,我们专业的技术和过硬的技巧,让大家一直支持我们。
上一篇:Android开发之合并布局技巧
