安卓手势处理(一)view的位置信息

本文是安卓手势处理系列的第一篇,主要探讨View的位置信息。内容包括View的四个规定位置的成员变量,以及设置偏移量的方法。强调了translation在实际显示中的作用,指出点击事件参考的是显示区域而非layout区域。同时提到了获取显示区域左上点的便捷方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章:
安卓手势处理(一)view的位置信息
安卓手势处理(二) MotionEvent
安卓手势处理(三)之实现图片的放大和缩小
安卓手势处理(四)之Fling
安卓手势处理(五)案例

最近需要为项目加入手势处理,所以就有了这个系列,一来总结之前的知识,而来学习新东西,并记录之。

view的位置信息由这么几个成员变量规定:
mLeft mTop mRight mBottom 这四个变量规定了位于父view中的位置,分别表示距离父view 左上右下的距离。
另外还有设置三个方向上偏离的距离方法:

setTranslationX()
setTranslationY()
setTranslationZ()

这个偏移量是相对于mLeft mTop的,mLeft这些变量是由layout决定的,也就是由布局参数决定的,而translation是基于布局位置发生一定的偏移,而且要注意view显示的区域也是根据偏移决定的,我们在屏幕上看到的view的区域是经过偏移之后的区域,mLeft这些变量代表的区域可以通过开发者模式中的show layoutbounds查看,那么mLeft这些变量有什么用呢?毕竟,view最终是显示给我们看的,layout区域和显示区域不一致明显有违直觉。其实目前我还没发现layout区域的用处,就连点击事件所参考的点也是显示区域的左上点。所以目前不先纠结layout区域的用处了。

打开setTranslationX这个方法的源码,可以发现最终是由mRenderNode这个变量设置的,这个变量是RenderNode对象,render node就是渲染点的意思,所以更加确认了translation和显示的关系。

View为我们提供了两个方法getX()getY()方法获取显示区域的左上点,这样就不用我们自己去计算了。

view随手指移动的例子:

tv.setOnTouchListener(new View.OnTouchListener() {
            int mOldX;
            int mOldY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                int currX = (int) event.getRawX();
                int currY = (int) event.getRawY();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        mOldX = currX;
                        mOldY = currY;
                        break;
                    case MotionEvent.ACTION_MOVE:
                            int offsetX = currX - mOldX;
                            int offsetY = currY - mOldY;
                            //也可以使用layout重新布局来写,这两种方式实际含义不同
//                            tv.layout(
//                                    tv.getLeft() + offsetX,
//                                    tv.getTop() + offsetY,
//                                    tv.getRight() + offsetX,
//                                    tv.getBottom() + offsetY);
                            tv.setTranslationX(tv.getTranslationX() + offsetX);
                            tv.setTranslationY(tv.getTranslationY() + offsetY);
                            mOldX = currX;
                            mOldY = currY;
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        break;
                }
                return true;
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值