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

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

我的解决方法如下:

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,这就解决了问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值