Android 坐标系转换

引言

在Android开发中,我们常常需要处理各种坐标系的转换,如屏幕坐标系、视图坐标系、父容器坐标系等。正确理解和处理这些坐标系的转换是非常重要的,以确保我们的应用程序能够正确地处理用户的交互操作,并正确地渲染界面。本文将详细介绍Android中常见的坐标系及其转换方式,并给出相应的代码示例。

Android中的坐标系

Android中有多个常见的坐标系,包括屏幕坐标系、视图坐标系、父容器坐标系等。下面我们逐个介绍这些坐标系:

  1. 屏幕坐标系(Screen Coordinates):屏幕坐标系是以屏幕左上角为原点,向右为正X轴,向下为正Y轴的二维坐标系。屏幕坐标系的单位是像素(pixel),其中原点的坐标为(0, 0)。

  2. 视图坐标系(View Coordinates):视图坐标系是以视图左上角为原点,向右为正X轴,向下为正Y轴的二维坐标系。视图坐标系的单位也是像素(pixel),其中原点的坐标为(0, 0)。

  3. 父容器坐标系(Parent Coordinates):父容器坐标系是指一个视图在其父容器中的坐标系。父容器坐标系的原点和方向与视图坐标系相同。

坐标系转换示例

下面给出一个具体的坐标系转换示例,通过代码演示了如何在不同坐标系中进行转换。

// 在Activity的onCreate方法中执行以下代码
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 获取屏幕坐标系中的触摸坐标
    final View touchView = findViewById(R.id.touch_view);
    touchView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            float screenX = event.getRawX();
            float screenY = event.getRawY();
            
            // 将屏幕坐标系的触摸坐标转换为视图坐标系
            int[] viewLocation = new int[2];
            touchView.getLocationOnScreen(viewLocation);
            float viewX = screenX - viewLocation[0];
            float viewY = screenY - viewLocation[1];
            
            // 将视图坐标系的触摸坐标转换为父容器坐标系
            ViewGroup parentView = (ViewGroup) touchView.getParent();
            float parentX = viewX + touchView.getX();
            float parentY = viewY + touchView.getY();
            
            // 输出转换后的坐标
            Log.d(TAG, "Screen coordinates: (" + screenX + ", " + screenY + ")");
            Log.d(TAG, "View coordinates: (" + viewX + ", " + viewY + ")");
            Log.d(TAG, "Parent coordinates: (" + parentX + ", " + parentY + ")");
            
            return true;
        }
    });
}

代码中,我们首先获取了屏幕坐标系中的触摸坐标,然后通过getLocationOnScreen方法将屏幕坐标系的触摸坐标转换为视图坐标系的触摸坐标,最后加上视图在父容器中的位置,即可得到父容器坐标系的触摸坐标。

甘特图

下面是一个使用mermaid语法绘制的坐标系转换的甘特图:

gantt
    dateFormat  YYYY-MM-DD
    title Android坐标系转换甘特图

    section 屏幕坐标系
    获取触摸坐标   :done, 2021-01-01, 1d
    
    section 视图坐标系
    转换为视图坐标系   :done, 2021-01-02, 1d
    
    section 父容器坐标系