MotionEvent中的getRawX()和getX()和getLeft()的区别

Android开发过程中很难缺少MotionEvent的相关内容,鬼叫现在的都是触屏时代,人机交互,怎么少的了触摸事件的监听呢?
所以MotionEvent的学习还是挺重要的。。

在使用过程中要根据情况取各种位置长度的,一度相当混乱,下面就通过实例区分一下其中的取值函数。

  1. 第一种情况:窗口有状态栏和标题栏
    直接上代码:
package com.hunman.positiontest;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

public class MainActivity extends ActionBarActivity implements OnTouchListener {

    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView) findViewById(R.id.id_img);
        img.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            int rawX = (int) event.getRawX();
            int rawY = (int) event.getRawY();
            Log.d("wxx", "getRawX: " + rawX + ", getRawY: " + rawY);

            int x = (int) event.getX();
            int y = (int) event.getY();
            Log.d("wxx", "getX: " + x + ", getY: " + y);

            int left = img.getLeft();
            int top = img.getTop();
            Log.d("wxx", "getLeft: " + left + ", getTop: " + top);
            break;

        default:`````

            break;
        }
        return false;
    }

}

打印的日志如下:

01-14 23:52:25.976: D/wxx(28469): getRawX: 539, getRawY: 1089
01-14 23:52:25.976: D/wxx(28469): getX: 299, getY: 320
01-14 23:52:25.976: D/wxx(28469): getLeft: 240, getTop: 550

观察上面的值,可以发现:
539 = 299 + 240
1089 = 320 + 550 + 219
发现没Y方向的值少了219,其实这个219的值就是状态栏和标题栏的高度,或者有人会怀疑,没事后面会证明,现在先假设是这样,用图示来直观分析一下。

  1. 第二种情况:有状态栏,没有标题栏
    要去掉标题栏很简单, 在代码中加:
requestWindowFeature(Window.FEATURE_NO_TITLE);

打印的日志如下:

01-14 23:57:23.136: D/wxx(31112): getRawX: 545, getRawY: 1034
01-14 23:57:23.136: D/wxx(31112): getX: 305, getY: 337
01-14 23:57:23.136: D/wxx(31112): getLeft: 240, getTop: 622

观察上面的值,可以发现:
545 = 305 + 240
1034 = 337 + 622 + 75
看到了没,Y的高度只是少了75,之前少了219,说明75是状态栏的高度,219-75=144是标题栏的高度,如果还是怀疑,后面还有证明,这个也先用图示看一下
MotionEvent中的getRawX()和getX()和getLeft()的区别_第1张图片

  1. 第三种情况:没有状态栏,没有标题栏
    要去掉状态栏也很简单, 在代码中再加一行:
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

打印的日志如下:

01-15 00:00:36.386: D/wxx(317): getRawX: 531, getRawY: 1025
01-15 00:00:36.386: D/wxx(317): getX: 291, getY: 365
01-15 00:00:36.386: D/wxx(317): getLeft: 240, getTop: 660

再一次计算值:
531 = 291 + 240
1025 = 365 + 660
看到了吧, 刚刚好,说明之前的猜测都是准儿准儿的。最后也上个图看看吧。
MotionEvent中的getRawX()和getX()和getLeft()的区别_第2张图片

到这里已经看得很清晰明白了,再总结一下吧:
**MotionEvent.getRawX()/MotionEvent.getRawY()表示触点在屏幕中的坐标(触点参考屏幕)
MotionEvent.getX()/MotionEvent.getY()表示触点在某一个View内的坐标(触点参考某个可触摸的View)
View.getLeft()/View.getTop()表示子View距离父View的长度(子View参考父View)**

好了, 就这么多了,夜深了,要睡去了, 大家晚安~~

你可能感兴趣的:(android,MotionEven)