关于ontouchlistener的监听问题 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

关于ontouchlistener的监听问题

2016-03-12 09:55:28 2211 1

写了一个类似鼠标的东西 在屏幕上有个view 然后加一个ontouchlistener(不是加给view的) 以下是部分代码 一个浮动框的代码 和 ontouch事件的代码

 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.TOP | Gravity.LEFT;
 mParams.x = 0;// 相对于屏幕原点的x轴距离
 mParams.y = 0;// 相对于屏幕原点的y轴距离
 mWM.addView(ivCursor, mParams);
    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.getRawX();
                y=event.getRawY();          
                break;
            case MotionEvent.ACTION_MOVE:
                mx=event.getRawX();
                my=event.getRawY();
                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;
        }
    });
然后问题就出现了 第一次去 down --move -- up 很正常 那个浮动框也跟着动 up之后也就停在了移动过后的位置 但是第二次 再去 down -- move 的时候 当出现move事件的时候那个浮动框就回到了刚开始的初始位置 然后再去跟着移动再停止  这是怎么回事啊 为什么会出现这样的情况啊 
取消 提交回答
全部回答(1)
  • 爵霸
    2019-07-17 19:00:12

    这个是因为你在回调MotionEvent.ACTION_MOVE的方法里,mParams.x和mParams.y每次都是以原点为基准进行移动的,请用以下代码试试:

     private int mParamsX, mParamsY;
                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.getRawX();
                    y=event.getRawY();  
    
                                    // 先记录一下在手指按下时view所在位置
                                    mParamsX = mParams.x;
                                    mParamsX = mParams.x;
                    break;
                case MotionEvent.ACTION_MOVE:
                    mx=event.getRawX();
                    my=event.getRawY();
                    rx=mx-x;
                    ry=my-y;
                    mParams.x = mParamsX + (int) rx;
                    mParams.y = mParamsY + (int) ry;
                    mWM.updateViewLayout(ivCursor, mParams);
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                }
                return true;
            }
        });
    0 0
相关问答

0

回答

监听相关API:CreateLoadBalancerHTTPListener

2017-10-18 10:53:20 2094浏览量 回答数 0

0

回答

监听相关API:CreateLoadBalancerHTTPSListener

2017-10-18 10:54:18 1703浏览量 回答数 0

0

回答

监听相关API:StopLoadBalancerListener

2017-10-18 14:24:45 1573浏览量 回答数 0

1

回答

问一下关于OSSopenAPI的一个问题

2016-07-11 20:32:13 2738浏览量 回答数 1

1

回答

关于一个jquery实时监听的问题

2016-06-17 17:08:54 1394浏览量 回答数 1

1

回答

一条关于安卓开发Intent的问题

2016-05-30 10:10:35 1529浏览量 回答数 1

1

回答

一条关于安卓开发Intent的问题

2016-05-30 09:56:25 1752浏览量 回答数 1

1

回答

不能继承OnTouchListener类?

2016-02-15 11:38:49 1669浏览量 回答数 1

1

回答

在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同

2016-03-12 10:49:49 2024浏览量 回答数 1

1

回答

关于 tableView自定义Header出现个问题

2016-03-06 14:47:16 1651浏览量 回答数 1
+关注
2
文章
9426
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载