自定义View---坐标系

Android自定义View之基础篇——坐标系 1、前言 手机屏幕坐标系与数学坐标系的不同,主要留意y轴方向。 2、手机坐标系 (1)屏幕坐标系/Android坐标系 以屏幕左上角为原点。如图所示,图中绿色边框位置为屏幕所在区域,其中绿色边框左上角为原点。 (2)View坐标系 如图,手机屏幕区域,即上图绿色边框围裹部分,可分为状态栏(即wifi信号、电量显示区)、标题栏、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);
}

}

ROS下UR+Realsense相机进行手眼标定 手眼标定主要是用来确定相机坐标系和机械臂坐标系之间的转换关系,从而实现后续的抓取等任务。 阅读详情

相关推荐

一文说清Arduino如何实现舵机平滑转动(机器人场景)

深入讲解如何利用arduino控制舵机转动,实现机器人场景中的平稳运动。通过代码优化与脉冲宽度调节,让舵机动作更精准流畅,适用于各类自动化项目。

weixin_35706255的博客 897

android获取relativelayout的高度,带有RelativeLayout的android getHeight()/ getWidth

嗨,我是Android新手,面临的问题是:如何获得视图的高度/宽度,该视图位于相对布局中?我尝试了getHeight()和getWidth(),并且都返回0.我需要知道此视图是否已到达布局的末尾,以便我可以将下一个视图放在其右侧或下方.或者在不知道当前视图的位置的情况下有更好的方法吗?编辑:我使用此代码创建EditText并将其添加到布局:EditText et1 = new EditText(c...

weixin_39543652的博客 449

#基于原生JS的交互式代码高亮编辑器实现教程

本文介绍了一个轻量级交互式代码高亮编辑器的实现方案。该编辑器采用原生JavaScript开发,支持语法高亮、行号显示、主题切换等核心功能,适合嵌入博客、文档等场景使用。 项目技术栈包括HTML5/CSS3/JavaScript,使用Prism.js实现语法高亮,prettier提供代码格式化功能。编辑器界面分三个区域:顶部工具栏(语言选择/主题切换)、中间编辑区(行号+代码)、底部状态栏(语言/字符数)。 核心功能实现包括:通过contenteditable属性创建可编辑区域,Flex布局实现行号与代码同步

qq_42386733的博客 1035

Android 关于view的getLayoutParams().width,getWidth(),getMeasuredWidth();

习惯了使用xml的布局方式,当动态布局的时候就有许多疑点,记录一下,帮助我这老头一样的记忆力. 网上也有许多解析这getLayoutParams().width,getWidth(),getMeasuredWidth();三种方式的获取区别,参考并理解了下: getLayoutParams().width: 这里顺便提下,LayoutParams,每个view都需要一个Lay

RingoPaul的博客 5742

RTL8211F千兆PHY原理图与PCB设计:从手册到量产的完整指南

在工业网关、边缘计算和FPGA/CPU以太网扩展设计中,千兆PHY芯片的稳定运行取决于外围电路的精细设计。RTL8211F(I)作为应用广泛的物理层收发器,其原理图设计涉及电源域划分、时钟与复位时序、RGMII/ MDIO接口匹配以及MDI差分网络等多个环节。正确理解数据手册的阅读顺序,掌握100Ω差分阻抗控制、等长约束和EMI布局技巧,是保证链路可靠性和信号完整性的关键。本文从芯片选型与数据手册解析切入,系统梳理从电源去耦到PCB布局布线的工程实践要点,帮助工程师规避Link不稳定、MDIO读取失败、吞吐

weixin_28721917的博客 348

利用Skipper跨层追踪技术高效定位LVS Short问题

本文详细介绍了如何利用Skipper跨层追踪技术高效定位LVS Short问题。通过解析Skipper的跨层trace net原理和实战操作步骤,帮助芯片设计工程师快速识别版图中的短路问题,显著提升验证效率。文章还提供了处理大规模设计的高级技巧和常见问题排查方法。

weixin_29239661的博客 508

android View.getWidth() 和View.getHeight()返回0

你肯定是在View还没有画出来的时候调用了这两个函数,在OnCreate中View是没有画出的,所以,如果这些代码是在OnCreate中,返回值是肯定为0 的 转载于:https://www.cnblogs.com/boybird/p/4262238.html...

weixin_30412577的博客 125

全面解析量化价值投资多因子模型的原理

明明知道“买便宜的好公司”是价值投资的核心,但面对3000+只A股,如何快速筛选出“便宜又好”的标的?主观判断总被情绪干扰——明明PE很低的股票,买了却不涨;或者因为“感觉”错过牛股?想规模化投资,但手动分析100只股票就要花一周,根本无法覆盖全市场?量化价值投资的多因子模型,正是解决这些问题的钥匙。它将价值投资的核心逻辑(“便宜”“好公司”)转化为可量化的因子,用数学模型替代主观判断,实现系统化筛选、可回测验证、规模化复制的投资决策。为什么多因子模型能有效预测股票收益?

AI天才研究院 1056

android获取高度为0,Android getWidth() getHeight() 方法返回的值为0

使用一个view的getWidth() getHeight() 方法来获取该view的宽和高,返回的值却为0。如果这个view的长宽很确定不为0的话,那很可能是你过早的调用这些方法,也就是说在这个view被加入到rootview之前你就调用了这些方法,返回的值自然为0.解决该问题的方法有很多,主要就是延后调用这些方法。可以试着在onWindowFocusChanged()里面调用这些方法。以下是s...

weixin_39971172的博客 576

文末含资料链接和视频讲解!YOLOv8集成CoordAtt注意力机制详细教程

本文详细介绍了如何在YOLOv8目标检测框架中集成CoordAtt注意力机制。首先解析了CoordAtt的工作原理,它通过分解式池化将位置信息嵌入到通道注意力中,相比传统注意力机制具有更好的空间信息保持能力。然后提供了PyTorch实现代码解析,包括自适应平均池化、Hard-Swish激活函数等关键实现细节。最后概述了YOLOv8架构,为后续集成CoordAtt提供基础。该教程适合具备深度学习基础的开发者,将理论与实践结合,帮助读者掌握这一目标检测优化技术。

FJN110的博客 266

【ArcPy】用Python批量处理大规模地理数据的几何校正

在许多GIS应用中,尤其是在大规模地理数据处理时,几何校正(Geometric Correction)是一个至关重要的任务。它确保了不同来源的地理数据能够正确地对齐和匹配,从而为后续分析提供准确的基础。几何校正的常见应用包括遥感影像的地理配准、矢量数据的投影转换等。几何校正通常包括坐标转换、重采样等步骤。以下示例展示了如何使用arcpy的工具进行几何校正。"""实施几何校正:param input_layer: 输入待校正数据层。

陈书予 993

Android调用getWidth()或getHeight()获取视图尺寸为0的解决办法

最近在开发的时候碰到需要根据RecyclerView的尺寸动态设定RecyclerView视图内每个item的尺寸的问题 即使在我findById后调用getWidth()或getHeight()还是会有值为0的情况,只有在隔一段时间后再去获取才会获取到实际的值。 这个原因是因为View还没有绘制完成,可能你看到的是View已经显示了,可是获取View尺寸是在View绘制完成之前。 我总不能所有的都延迟个几百毫秒才去获取吧? 最后的解决办法,使用View.post,等到View绘制完成后才会走这里,

Charleyszc的博客 2538

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

Android自定义View基础篇--坐标系

Android自定义View基础边-坐标系

qq_36639105的博客 1797

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

安卓自定义View基础-坐标系

由于移动设备一般定义屏幕左上角为坐标原点,向右为 x 轴增大方向,向下为 y 轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的。

GcsSloop 4951

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android以view建坐标系,Android 自定义 View 基础之系统坐标系

很多人可能不屑一顾 Android 的坐标系,但是如果你想彻底学会自定义控件,我想说了解Android各种坐标系及一些API的坐标含义绝对算一个小而不可忽视的技能;所谓Android自定义View那几大主要onXXX()方法的重写实质其实大多数都是在处理坐标逻辑运算,所以自定义View基础篇的第二篇我们就先来就题重谈一下Android坐标系。1、Android坐标系说到Android坐标系其实就是...

weixin_39776344的博客 292

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android 自定义View之坐标系(一)

前言 本文主要阐述的是Android坐标系,便于对于Android视图界面坐标的一个简单了解。在Android任何视图中,不管是对于控件的摆放位置、触摸点、自定义控件绘制等等都脱离不开坐标系。Android坐标系是一个三维坐标,Z轴向上,X轴向右,Y轴向下。这三维坐标的点处理就能构成Android丰富的界面或者动画等效果,所以Android坐标系在整个Android界面中的重要性就不言而喻。 An...

zengruiyue的博客 1779

自定义view(一)View坐标系与触摸事件

View的坐标定位1.安卓系统的坐标系是这样的,以左上角为原点,向右为x正,向下为Y正2.view的坐标系是相对于父控件而言的。

黄勇的博客 558

学习转载系列-《自定义View基础-坐标系》

自定义View基础-坐标系 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的,详情如下: (PS:其中的∠a 是对应的,注意y轴方向!) 实际屏幕上的默认坐标系如下: PS: 假设其中棕色部分为手机屏幕 二.V

canglen的博客 344

android以view建坐标系,Android进阶——自定义View的必修课之关于Canvas绘图与Android坐标系的总结...

引言Android进阶——自定义View的必修课之关于Canvas绘图与Android坐标系的总结。Canvas相信大家都不会陌生,虽然看来很简单,也知道各种API的用法和作用,但是很多人觉得自定义View很难,很大一部分原因就是对于Canvas不够熟悉,或许看教材和视频只是教你要移动translate、rotate、save、restore等,很少告知你为什么这样做,导致你只能照敲不能灵活应用。...

weixin_28979339的博客 667

android以view建坐标系,Android自定义View三(坐标系与View的绘制流程)

涉及知识绘制过程涉及到主要方法类别API描述布局onMeasure测量View与Child View的大小onLayout确定Child View的位置onSizeChanged确定View的大小绘制onDraw实际绘制View的内容事件处理onTouchEvent处理屏幕触摸事件重绘invalidate调用onDraw方法,重绘View中变化的部分Canvas涉及到主要方法类别API描述绘制图形...

weixin_28730353的博客 673

Android自定义View你所要知道的(一):坐标系

准备写自定义View这个专栏的文章,从最基础的坐标系到Demo。本着巩固自身知识的意愿,不足之处还请大家多多包涵。 之所以要先掌握Android的坐标系,因为view是靠坐标来确定它在屏幕当中的位置。了解Android的坐标系后,将会对的View的布局有一定的概念感。 首先Android中以屏幕的左上角为原点坐标(0,0); 需要值得注意的是,以原点为中心。Y轴向下为正,向上则为负。X轴

楊杰的博客 4501

android自定义view(三)绘制表格和坐标系

真的非常简单   运行效果截图:   说说几个常用的方法吧 画点   canvas.drawPoint(200, 200, mPaint);     //在坐标(200,200)位置绘制一个点 canvas.drawPoints(new float[]{          //绘制一组点,坐标位置由float数组指定       500,500,       500,600,   ...

cf8833的博客 2513

android以view建坐标系,android自定义View——坐标系

在开发过程中有的时候我们会实现一些特殊功能,如组件滑动到一定距离隐藏或显示、图片置顶等等,这个时候view的坐标就派上了用场了;同样在自定义控件的时候,坐标系也是经常用到的,下面记录一下在复习过程中view坐标系的一些知识。目录view的四个顶点坐标view的x、y、translationX、translationY坐标MotionEvent获取坐标 1. view的四个顶点坐标view的位置主...

weixin_39539807的博客 309

安卓自定义View 坐标系篇

安卓中的坐标系 屏幕坐标系和数学坐标系的区别 View的坐标系 MotionEvent中get和getRaw的区别 核心掌握点 实例 屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向,所以在在手机屏幕上的坐标系与数学中常见的坐标系在y轴的方向上是相反的。如下图: 下图中的∠α是对应的 实际屏幕上的...

fjnu_se的博客 425

android控件向内弧度_安卓自定义 View 基础:坐标系、角度弧度、颜色

安卓自定义View基础 - 坐标系一.屏幕坐标系和数学坐标系的区别由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的,详情如下:(PS:其中的∠a 是对应的,注意y轴方向!)实际屏幕上的默认坐标系如下:PS: 假设其中棕色部分为手机屏幕二.View的坐标系注意:View的坐标系统是相对于父控件而言的.ge...

weixin_33238848的博客 448
上一篇: 一个简单的饼状图的绘制!
下一篇: 使用迅雷下载百度云盘大文件方法
ILoveYouWF
博客等级 码龄10年 6粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值