在开发中,遇到了一个需求,就是左右滑动的时候无限的滑动,没有张数限制。
我的解决方法如下:
1,一个listview列表监听手势左右滑动。
2,在左右滑动的时候加一个左进右出的动画效果,给人的感觉就是在翻页。
接下来就是代码的实现:
1,重写listview
public class HSlidableListView extends ListView { Context context; GestureDetector gestureDetector; OnFlingListener mListener; /* * 设置左右滑动监听 * */ public void setOnFlingListener(OnFlingListener listener) { this.mListener = listener; gestureDetector = new GestureDetector(context, new Gesture(context, mListener)); } public HSlidableListView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public HSlidableListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public HSlidableListView(Context context) { super(context); this.context = context; } @Override public boolean onTouchEvent(MotionEvent ev) { if (gestureDetector.onTouchEvent(ev)) return true;//当左右滑动时自己处理 return super.onTouchEvent(ev); } /* * 滑动监听 * */ public class Gesture implements GestureDetector.OnGestureListener { Context context; OnFlingListener mListener; public Gesture(Context context, OnFlingListener listener) { this.context = context; this.mListener = listener; } @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) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override /** * */ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY() - e2.getY())) {//当左右滑动距离大于上下滑动距离时才认为是左右滑 // 左滑 if (e1.getX() - e2.getX() > 100) { mListener.onLeftFling(); return true; } // 右滑 else if (e1.getX() - e2.getX() < -100) { mListener.onRightFling(); return true; } } return true; } } /* * 左右滑动时调用的监听接口 * */ public interface OnFlingListener { public void onLeftFling(); public void onRightFling(); } }2,布局中引用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.administrator.student.util.HSlidableListView android:id="@+id/lv_schedule" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>3,在界面中调用:
/* * 给该listview设置监听,做出相应操作 * */ mLvSchedule.setOnFlingListener(new OnFlingListener() { @Override public void onLeftFling() { Log.e("y-p", "left"); Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.in_from_right); Animation animation1 = AnimationUtils.loadAnimation(getActivity(), R.anim.out_to_left); AnimationSet set = new AnimationSet(true); set.addAnimation(animation); set.addAnimation(animation1); set.setDuration(1000); mLvSchedule.startAnimation(set); initData(2); } @Override public void onRightFling() { Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.in_from_left); Animation animation1 = AnimationUtils.loadAnimation(getActivity(), R.anim.out_to_right); AnimationSet set = new AnimationSet(true); set.addAnimation(animation); set.addAnimation(animation1); set.setDuration(1000); mLvSchedule.startAnimation(set); initData(1); } }); }根据左滑还是右滑去请求数据:
in_from_right:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:Android="http://schemas.android.com/apk/res/android"> <!-- 6 //动画对象的起始X坐标 7 //动画对象的结束X坐标 8 //这里是横向移动,所以Y坐标无需改变,始终是0 9 //动画时间2s 10 --> <translate Android:duration="500" Android:fromXDelta="100%p" Android:fromYDelta="0" Android:toXDelta="0" Android:toYDelta="0" /> </set>in_from_left:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:Android="http://schemas.android.com/apk/res/android" > <!-- //动画对象的起始X坐标 //动画对象的结束X坐标 //这里是横向移动,所以Y坐标无需改变,始终是0 //动画时间2s --> <translate Android:fromXDelta="-100%p" Android:toXDelta="0" Android:fromYDelta="0" Android:toYDelta="0" Android:duration="500" /> </set>out_to_left:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:Android="http://schemas.android.com/apk/res/android" > <!--动画对象的起始X坐标 //动画对象的结束X坐标 //这里是横向移动,所以Y坐标无需改变,始终是0 //动画时间2s --> <translate Android:fromXDelta="0" Android:toXDelta="-100%p" Android:fromYDelta="0" Android:toYDelta="0" Android:duration="500" /> </set>out_to_right:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:Android="http://schemas.android.com/apk/res/android" > <!--动画对象的起始X坐标 //动画对象的结束X坐标 //这里是横向移动,所以Y坐标无需改变,始终是0 //动画时间2s --> <translate Android:fromXDelta="0" Android:toXDelta="100%p" Android:fromYDelta="0" Android:toYDelta="0" Android:duration="500" /> </set>ok,这就解决了问题