记安卓开发中监听左右手势滑动

来源:互联网 发布:linux grub.cfg 编辑:程序博客网 时间:2024/05/29 14:41

在开发中,遇到了一个需求,就是左右滑动的时候无限的滑动,没有张数限制。

我的解决方法如下:

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坐标无需改变,始终是09      //动画时间2s10       -->    <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,这就解决了问题

原创粉丝点击