自定义View---坐标系

手机界面的坐标系和我们数学中的坐标系有一点不同,就是Y轴的方向是相反的,所以应该是这样的(图是取自别人的):
这里写图片描述
然后有view几个方法需要注意下:
getTop() :View 的左上角到父控件顶部的距离
getLeft() :View 的左上角到父控件左侧的距离
getRight() : View 的右下角到父控件左侧的距离
getBottom() : View 的右下角到父控件顶部的距离
这里写图片描述
还有两组方法容易混淆:MotionEvent中 get 和 getRaw 的区别
getX() //触摸点相对于其所在组件坐标系的坐标
getY()
getRawX() //触摸点相对于屏幕默认坐标系的坐标
getRawY()
这里写图片描述
为了加深理解,我自己简单的写了一个Demo来验证了上面的说明:

/**
* Created by ML on 2017/1/9.
*/
public class MobileCoordinatesActivity extends Activity {
private MobileCoordinatesActivity ctx;
private TextView tvMobileWidth;
private TextView tvMobileHeight;
private TextView viewLeftWidth;
private TextView viewLeftHeight;
private TextView viewRightWidth;
private TextView viewRightHeight;
private TextView tvMotionWidth;
private TextView tvMotionHeight;
private TextView tvViewWidth;
private TextView tvViewHeight;
private TextView tvView;
private RelativeLayout rlAll;
private WindowManager mManager;
private ScrollView slAll;
private float mobileWidth;
private float mobileHight;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mobile_coordinetes);
    initView();
    initData();
    initListener();

}

private void initListener() {
    tvView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {


            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    System.out.println("MotionEvent.ACTION_DOWN");
                    break;
                case MotionEvent.ACTION_MOVE:
                    System.out.println("MotionEvent.ACTION_MOVE");
                    break;
                case MotionEvent.ACTION_UP:
                    System.out.println("MotionEvent.ACTION_UP");
                    break;
                case MotionEvent.ACTION_CANCEL:
                    System.out.println("MotionEvent.ACTION_CANCEL");
                    break;
                default:
                    break;
            }
            tvMotionWidth.setText(event.getX() + "/" + event.getRawX());
            tvMotionHeight.setText(event.getY() + "/" + event.getRawY());
            //TODO 返回ture表示触摸时间继续想子View传递自己不做处理,返回false表示拦截触摸事件自己做处理
            return false;
        }
    });
}

private void initData() {
    mobileWidth = mManager.getDefaultDisplay().getWidth();
    mobileHight = mManager.getDefaultDisplay().getHeight();
    tvMobileWidth.setText(mobileWidth + "");
    tvMobileHeight.setText(mobileHight + "");
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            //需要进行一定的延迟,不然视图并没有绘制完成则计算出的结果有误
            tvViewWidth.setText(tvView.getWidth() + "");
            tvViewHeight.setText(tvView.getHeight() + "");
            viewLeftWidth.setText(tvView.getLeft() + "");
            viewLeftHeight.setText(tvView.getTop() + "");
            viewRightWidth.setText(tvView.getRight() + "");
            viewRightHeight.setText(tvView.getBottom() + "");
        }
    }, 500);
}


private void initView() {

    ctx = this;
    mManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    tvMobileWidth = (TextView) findViewById(R.id.tv_mobile_width);
    tvMobileHeight = (TextView) findViewById(R.id.tv_mobile_height);
    viewLeftWidth = (TextView) findViewById(R.id.view_left_width);
    viewLeftHeight = (TextView) findViewById(R.id.view_left_height);
    viewRightWidth = (TextView) findViewById(R.id.view_right_width);
    viewRightHeight = (TextView) findViewById(R.id.view_right_height);
    tvMotionWidth = (TextView) findViewById(R.id.tv_motion_width);
    tvMotionHeight = (TextView) findViewById(R.id.tv_motion_height);
    tvViewWidth = (TextView) findViewById(R.id.tv_view_width);
    tvViewHeight = (TextView) findViewById(R.id.tv_view_height);
    slAll = (ScrollView) findViewById(R.id.sl_all);
    tvView = (TextView) findViewById(R.id.tv_view);
    rlAll = (RelativeLayout) findViewById(R.id.rl_all);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值