2 qq 32360535 qq_32360535 于 2016.03.03 17:00 提问

关于ontouchlistener的监听滑动问题

relativeLayout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                x=event.getX();
                y=event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mx=event.getX();
                my=event.getY();
                rx=mx-x;
                ry=my-y;
                mParams.x =(int) rx;
                mParams.y =(int)ry;
                mWM.updateViewLayout(ivCursor, mParams);
                break;
            case MotionEvent.ACTION_UP:

                break;
            }
            return true;
        }
    });

    浮动框的代码

    mWM = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
ivCursor = new ImageView(getBaseContext());
ivCursor.setImageResource(R.drawable.ic_launcher);
mParams = new WindowManager.LayoutParams();// 对ivCursor对象的参数描述对象
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 宽度自适应
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;// 高度自适应
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 设置成不能获取焦点
mParams.type = LayoutParams.TYPE_PHONE;
// 设置图片格式,效果为背景透明
mParams.format = PixelFormat.RGBA_8888;
mParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;

mParams.x = 0;
mParams.y = 0;
mWM.addView(ivCursor, mParams);

当我手指滑动的时候 浮动框是跟着动的 松开后 再去滑动 浮空框就又从原点开始滑动了 有什么办法能让浮动框不从原点开始 就从停止的地方开始滑动啊

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.03.03 17:03

relativeLayout外层再套一个relativelayout布局。
然后内层relativeLayout就可以拖动更新了

qq_32360535
qq_32360535 是可以拖动更新 就是第二次再去拖动的时候 那个会移动的view 又从原点开始移动 不是在第一次被移动的基础上移动的
2 年多之前 回复
danielinbiti
danielinbiti   Ds   Rxr 2016.03.03 17:37
 case MotionEvent.ACTION_DOWN:
                x=event.getX();//点击的时候坐标,假如是50
                y=event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mx=event.getX(); //这里一移动,还是获取的还是50
                my=event.getY();
                rx=mx-x;   //rx就是0或者比0大点
                ry=my-y;
                mParams.x =(int) rx;  //屏幕的上坐标就是0了,
                mParams.y =(int)ry;
                mWM.updateViewLayout(ivCursor, mParams); //更新后回到屏幕左上角原点
                break;

                改成类似
                int mx0 = 0;
int my0 = 0;
case MotionEvent.ACTION_MOVE:

                mx=event.getX();
                my=event.getY();
                mx0=mx0==0?mx:mx0;
                my0=my0==0?my:my0;
                rx=mx-mx0+x;
                ry=my-my0+y;
                my0=my;
                mParams.x =(int) rx;
                mParams.y =(int)ry;
                mWM.updateViewLayout(ivCursor, mParams);
                break;
danielinbiti
danielinbiti 回复xiaojiangren: 这不是上面代码给你写的嘛。保留手指按下时的坐标,移动时都基于这个坐标算移动距离。
2 年多之前 回复
qq_32360535
qq_32360535 回复danielinbiti: 是不是只要我在第二次移动的时候 加上第一次移动时候的x和y 就可以让他不回原点了啊!
2 年多之前 回复
danielinbiti
danielinbiti 回复xiaojiangren: 只是说按照这个算法,每次到第二次开始移动的时候,坐标都会变成0,0或者接近0,0,然后再相对0,0开始移动
2 年多之前 回复
qq_32360535
qq_32360535 回复danielinbiti: 也就是说其实第二次开始 那个会移动的view 其实没有回到原点 只是离原点很近 而且这个view 每次move的时候 参照物都是原点 是这样吗
2 年多之前 回复
danielinbiti
danielinbiti 回复xiaojiangren: ,当第二次down的时候,这时候的mParams的x,y是1,1了,假设down的时候getX和gety的值是(15,15),你move时,手指不会抬起,也就是移动,比如移动到(16,16),那就是便宜的位置还是1,1,不动,或者可以这么说,手指稍微动一下。mParams的x,y的值就是0,0了。
2 年多之前 回复
danielinbiti
danielinbiti 回复xiaojiangren: 你可以分析一下,第一次的时候,mParams的x,y都是0,0,假设第一次down的时候getX和gety的值是(10,10),你move到(11,11),那就是便宜了1,1,肯定是移动了。
2 年多之前 回复
qq_32360535
qq_32360535 回复danielinbiti: 在action-move那边获取到的x怎么会和down那边获取到的一样呢? 我打印出来的log里面显示出来的是不一样的啊 如果是一样的话 第一次滑动 那个view就不会被更新位置了 是在第二次滑动发生move事件的时候 view就回到了原点
2 年多之前 回复
lxk_1993
lxk_1993   Rxr 2016.03.04 11:09
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用OnTouchListener监听滑动事件
OnTouchListener可以实现简单的滑动事件监听。 实现思路: 当按下手指的时候记录手指的坐标作为起始坐标,当手指抬起的时候把当前手指坐标与起始坐标对比,由此可以判断手指滑动的方向。 import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListen
关于 Recycleview 的item 怎么监听手势操作
最近公司的App2.4版本升级中有个滑动功能,但是我用的是Recycleview ,用过recycleview的同学都知道 这家伙的监听是在 Adapter 里面写回调函数,然后调用才能起到点击监听的,但是怎么给每一个item增加手势呢?我之前也有写过一篇博客关于 点击监听的。这次和大家分享一下 Recycleview 的item怎么增加 手势监听。 直接上代码: public c
安卓 listView的点击监听和滑动监听 setOnScrollListener   setOnTouchListener
第一次使用此方法是获取Y轴的滑动距离动态设置组件隐藏还是显示 通过onTouch的Down和Up的方法获取Y轴的距离  判断两者大小  然后让setOnScrollListener中的三个方法去处理  三个方法分别为快速滑动/空闲/滑动状态去处理
android ViewPager 不能响应onTouchListener的问题
解决思路主要是复写了ViewPager中的dispatchTouchEvent函数,然后在分发之前,先自己做点事情,具体代码如下: package com.xiaowu.banner.demo; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.Attrib
Android Fragment中监听onTouch事件
问题: Fragment中没有提供监听touch事件的方法。 解决方案: Activity中能够监听touch事件。 于是在FragmentActivity中写一个接口,MyOnTouchListener,在需要监听touch事件的fragment中实现这个窗口。 在FragmentActivity中实现如下方法(一下代码可以直接复制粘贴到FragmentActivity中):/** *
Android iew 的onTouch事件中,长按、左右滑动和点击判断
在Android的开发中要对一个View长按、滑动、和点击同时进行,在View的onTouch事件中做了以下的工作:  float xDown,yDown;   boolean isLongClickModule = false; boolean isLongClicking = false; myView.setOnTouchListener(new OnTouc
android onTouchListener中滑动时,x坐标和y坐标如何分布——轮播制作(二)
android onTouchListener中滑动时,x坐标和y坐标如何分布——轮播制作(二)
使用OnTouchListener()的一个坑,监听不到MotionEvent.ACTION_UP
OnTouchListener()
Android中GridView中onTouch监听(1)item实现触摸执行缩放动画的功能
功能:当用户点击元素,执行图片缩放动画,当按住元素并且移开位置离开该元素,之前元素将执行放大回到原状,而新选中的元素将进行缩放。 即:gridview中的元素按住就会下陷变小,移动离开就会变回原样,点击就会进入跳转界面 由于为了完整的监听ontouch事件,即能监听ACTION_DOWN,MOVE,UP返回值必须为true 但是由于为true导致事件被拦截了,之后的自带的onItemClic
Android中onTouch与onClick两种监听的完全解析
之前项目中做一个竖直方向的ViewPager效果(详见我的另一篇博文),这几天做了几个改动,突然发现我设置的OnTouchListener对触摸事件的监听突然不起作用了,琢磨了半天觉得问题就出在onTouch的返回值true还是false上,后来自己测试的时候发现不光与这个有关,与OnClickListener也有关,我自己做了一些测试并尝试来进行源码的分析,解析真正的规律和原因所在。