前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >getX和getRawX

getX和getRawX

作者头像
提莫队长
发布2019-03-01 09:44:38
7900
发布2019-03-01 09:44:38
举报
文章被收录于专栏:刘晓杰刘晓杰

今天在做一个关于拖动button的小demo,看到里面有getX和getRawX。就写了个测试来看看两者有什么区别。 布局文件就一个button 代码如下:

代码语言:javascript
复制
        button.setOnTouchListener(new OnTouchListener() {
            int lastX, lastY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int dx = (int) event.getRawX() - lastX;
                    int dy = (int) event.getRawY() - lastY;

                    int l = v.getLeft() + dx;
                    int b = v.getBottom() + dy;
                    int r = v.getRight() + dx;
                    int t = v.getTop() + dy;

                    if (l < 0) {
                        l = 0;
                        r = l + v.getWidth();
                    }
                    if (t < 0) {
                        t = 0;
                        b = t + v.getHeight();
                    }
                    if (r > width) {
                        r = width;
                        l = r - v.getWidth();
                    }
                    if (b > height) {
                        b = height;
                        t = b - v.getHeight();
                    }

                    v.layout(l, t, r, b);
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    v.postInvalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    // Log.i("getRawX", (int)event.getRawX()+"");
                    // Log.i("getRawY", (int)event.getRawY()+"");
                    // Log.i("getX", (int)event.getX()+"");
                    // Log.i("getY", (int)event.getY()+"");
                    // Log.i("getWidth", v.getWidth()+"");
                    // Log.i("getHeight", v.getHeight()+"");
                    break;
                }
                return false;
            }
        });

getX()是表示组件相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕) 如果你的某个Activity中实现OnTouchListener接口,需要重写onTouch(View view,MotionEvent event) 这个方法,getRawX()和getRawY()获得的是相对屏幕的位置,getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和宽度)。

这里写图片描述
这里写图片描述

当然,如果重写Activity的onTouchEvent(MotionEvent event) ,这个时候获得的是屏幕点击位置的坐标。event.getX() 与 event.getRawX()获取的值是一样的,event.getY() 与 event.getRawY()获取的值是一样

这里写图片描述
这里写图片描述

下面简单来讲讲onTouch和onTouchEvent的区别 onTouch:属于某个组件的OnTouchListener接口,点击组件有效 onTouchEvent:属于Activity,点击全屏幕有效 onTouchEvent可以用来实现雷霆战机之类的游戏的飞机移动的效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年03月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档