Android中View的getX,getY...

Android坐标系的理解直接关系到后面你Android进阶部分的学习,如果没有夯实的基础,你自定义View时就会有种欲求不满,欲罢不能——想搞懂却又觉得难,想放弃又觉得舍不得。

Android中的坐标系以及获取坐标的方法 

Android中有两种坐标系,分别称之为Android坐标系和视图坐标系。而对应的也有一些相关的方法可以获取坐标系中的坐标值。只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果。

一、Android坐标系和视图坐标系

    (1)Android坐标系

      先来看一看Android坐标系是个什么样子的。贴一张图来说明,如下:


 

     如上图所示,Android坐标系以手机屏幕左上角的顶点为坐标原点,从该点向右为x轴正方向,从该点向下为y轴正方向。而触控事件中,使用getRawX()和getRawY()方法

获取的坐标就是以这个坐标系为标准下的坐标值。

    (2)视图坐标系

    android中的另外一个坐标系叫做视图坐标系,它描述的是子视图在父视图中的位置。再贴一张图来说明,如下:


 

      如上图所示,视图坐标系是以父视图的左上角为坐标原点的。相应的原点向右为x轴正方向,原点向下为y轴正方向。在触控中,通过

getX()和getY()来获取的坐标值就是视图坐标系中的坐标值。

 

 

二、获取坐标值以及相对距离的那些方法

      在android中,提供了非常丰富的方法来获得坐标值和相对距离。但是在使用这些方法的时候,一定要清楚是以哪个坐标系为标准来获取的。

为了将这些方法一一说明清楚,我也准备了一张图,如下:

     上面的那张图很好的说明了每个方法获得的坐标值或者距离都是从哪里到哪里的。说明一下,图中有三个黑色的框框,最外层的是手机屏幕,

中间层的是ViewGroup,最内层的是ViewGroup中放置的view。

     其实上图中标注的方法可以分为两类,一类是View提供的方法,一类是MotionEvent提供的方法。分别说明如下:

View提供的获取的坐标以及距离的方法:

getTop()           获取到的是view自身的顶边到其父布局顶边的距离

getLeft()           获取到的是view自身的左边到其父布局左边的距离

getRight()        获取到的是view自身的右边到其父布局左边的距离

getBottom()     获取到的是view自身底边到其父布局顶边的距离

 

MotionEvent提供的方法:

getX()       获取点击事件距离控件左边的距离,即视图坐标

getY()       获取点击事件距离控件顶边的距离,即视图坐标

getRawX()  获取到的是点击事件距离整个屏幕左边的距离,即绝对坐标

getRawY()  获取到的是点击事件距离整个屏幕顶边的距离,即绝对坐标

getScrollY()  获取 视图坐标原点 到 视图 滚出屏幕 的距离

getScrollX() 类似 同上


这段代码实现了一个简单的 Android 应用程序,用于在屏幕上显示一个小兔子,并且允许用户通过触摸屏幕移动小兔子的位置。下面是代码的详细解释: 1. 导入需要使用的类和包: ```java import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.FrameLayout; ``` 2. 定义 MainActivity 类,该类继承自 Activity 类: ```java public class MainActivity extends Activity { ``` 3. 实现 onCreate() 方法,在该方法初始化应用程序: ```java @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FrameLayout frameLayout = (FrameLayout) findViewById(R.id.mylayout); RabbitView rabbit = new RabbitView(MainActivity.this); rabbit.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { rabbit.bitmapX = event.getX(); rabbit.bitmapY = event.getY(); rabbit.invalidate(); return true; } }); frameLayout.addView(rabbit); } ``` 在该方法,我们完成了以下操作: - 使用 setContentView() 方法设置布局文件; - 获取帧布局管理器并实例化一个 RabbitView 对象; - 为 RabbitView 添加触摸事件监听器; - 将 RabbitView 添加到布局管理器。 4. 实现 RabbitView 类,该类继承自 View 类: ```java public class RabbitView extends View { ``` 5. 在 RabbitView定义了一个 bitmapX 和 bitmapY 变量,它们分别表示小兔子在屏幕上的 X 和 Y 坐标: ```java public float bitmapX; public float bitmapY; ``` 6. 在 RabbitView实现了一个 draw() 方法,该方法用于在屏幕上绘制小兔子: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rabbit); canvas.drawBitmap(bitmap, bitmapX, bitmapY, null); bitmap.recycle(); } ``` 在该方法,我们首先从资源文件加载小兔子的图片,然后使用 drawBitmap() 方法在屏幕上绘制小兔子。 7. 最后,在 RabbitView实现了一个构造方法,用于初始化小兔子的位置和大小: ```java public RabbitView(Context context) { super(context); bitmapX = 0; bitmapY = 0; } ``` 在该构造方法,我们将小兔子的 X 和 Y 坐标初始化为 0。 综上所述,这段代码的作用是实现一个简单的 Android 应用程序,用于在屏幕上显示一个小兔子,并且允许用户通过触摸屏幕移动小兔子的位置。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值