首页 文章 精选 留言 我的

精选列表

搜索[电机控制],共10000篇文章
优秀的个人博客,低调大师

Headless Android开发板的调试及远程显示和控制

最近在调试msm8996的开发板,由于主板和LCD子板还没回来,所以先回的核心板算是个Headless的Android Device。核心板有独立供电,另外还有USB Type-C、FAN、HDMI、TF Card和KEY等硬件模块,目前都已调通,效果如下图所示。 在调试过程中,Android远程桌面助手基本可以弥补没有显示屏的问题,调试的进度也没有因为缺少液晶屏而受影响。另外,调试时也根据实际需求扩展了Android远程桌面助手的一些功能,可以用得更顺手。修改内核代码后,编译boot.img、使用fastboot烧录、重启验证,基本流程如下所示。 ">

优秀的个人博客,低调大师

小Demo大知识-通过控制Button移动来学习Android坐标

今天分享一个简单的Demo。Demo实现的功能就是,用鼠标点中button的时候,然后拖动Button。这时候Button会根据你鼠标的移动而移动,同时,你鼠标点中的Button的位置也不会改变。比如你点在Button的左上角,那移动的时候。鼠标还是在Button的左上角 一言不合上效果图 大家不要介意上面那么模糊的gif图,毕竟我是用手机拍的。(介意你又能拿我怎么办。哈哈) 我们先来打个预防针,先学习基本的知识点: 涉及到的方法一共有下面几个: view获取自身坐标:getLeft(),getTop(),getRight(),getBottom() view获取自身宽高:getHeight(),getWidth() motionEvent获取坐标:getX(),getY(),getRawX(),getRawY() 1.view获取自身坐标 如上图所以,绿色区域的父视图是黄色区域,所以left是55,top是55。 黄色区域的父视图是蓝色区域,所以left是60,top是115。 2.view获取自身宽高 没错。从字面意思看就能理解,就是获取View的宽高。 这里提到一个以前遇到的一个问题,就是在Activity中有时候获取某个View的width和height会为0。 3.motionEvent获取坐标 getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离 getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离 getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离 getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离 所以当我们用鼠标点击Button中间时候,那这时候getX()就是我们鼠标点击的位置与Button左边边界的距离。getY()就是点击的位置与Button顶边边界的距离。 其实设置Button跟着鼠标滑动,很简单,就是在鼠标滑动的时候,重新设置Button的x和y坐标。即使用setX()和setY()。这时候就有问题了。那二个方法中该填入的值是多少呢。让我们画个图来看下就知道了。 首先我们比如对一个Button设置setX(200),setY(200),这时候是如下图所示这样: 所以实际上对一个Button设置setX(m),setY(n),实际上是这个Button的左上角的坐标为(m,n)。所以我们在拖动的时候不能简单的把我们点击的X和Y坐标传过去。 如上图所示,假如我们点中红色的区域,来准备移动这个Button,并且鼠标移动了绿色区域那个地方,那么这个Button也会移到图上所示那样。这样才是我们所期望的样子。 但是如果单纯把绿色区域的X和Y坐标传过去,让Button来进行setX和setY 。则会出现如下那个Button所示位置。所以发现比我们期望的位置更靠右边及下边了。 这时候我们发现多的位置正好是绿色区域在这个Button内部中相对位置的X和Y坐标。 这下我们是不是就想到,对Button设置setX(getRawX()-getX())和setY(getRawY()- getY()),如果这时候你已经这么想到了。恭喜你,你已经距离最后的成功差一小步了。当你高兴的这么写后,你会发现你移动后的Button总是在鼠标点击的下方。你会发现。X轴的的确已经正确了。但是Y轴还是错误。如下图所示: 这时候你一定会问,WHY??? 原来这么分析是没问题的。But这个我们前面的假设都是在这个坐标系中,但是这个坐标系的位置在哪里??? 错误原因: 因为我们调用的getRawY()方法获取到的是屏幕左上角到我们点的区域的Y轴的距离,也就是以蓝色坐标系来做参考。而我们对Button设置setY()方法的时候是绿色区域的左上角到我们点的区域的Y轴距离,也就是以红色坐标系来做参考。所以我们知道了。我们在Y轴上还要减去状态栏的高度及应用标题栏的高度才可以。 那么又有新的问题了。如何获取状态栏的高度,和应用标题栏的高度: 获取状态栏高度 intstatusBarHeight=-1; //获取status_bar_height资源的ID intresourceId=getResources().getIdentifier("status_bar_height","dimen","android"); if(resourceId>0){ //根据资源ID获取响应的尺寸值 statusBarHeight=getResources().getDimensionPixelSize(resourceId); } 获取标题栏高度 //获取标题栏高度 Windowwindow=getWindow(); intcontentViewTop=getWindow() .findViewById(Window.ID_ANDROID_CONTENT).getTop(); //statusBarHeight是上面所求的状态栏的高度 titleBarHeight=contentViewTop-statusBarHeight; 结论: 所以最后我们再拖动Button的时候,会对它setX(getRawX()-getX())及setY(getRawY()-getY()-状态栏高度-标题栏高度)。其中getX()和getY()是在你点击下去的时候就获取的。也就是在motionEvent.getAction() == MotionEvent.ACTION_DOWN的时候去获取这二个值即可。因为在motionEvent.getAction() == MotionEvent.ACTION_MOVE的时候去获取getX()和getY()可能因为你拖动的速度原因造成值不同,比如你拖动很快,鼠标先过去了。Button后面才跟随着过来。这时候的getX()及getY()都不同。 既然点击按钮后可以拖动Button,那肯定对Button设置了OnTouch监听。直接上关键代码: packageyunyuan.androiddemo.coordinatelayout; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.Window; importandroid.widget.Button; importbutterknife.BindView; importbutterknife.ButterKnife; importyunyuan.androiddemo.R; /** *Createdbywillyon16/12/19. */ publicclassAct_CoordinateLayoutextendsActivity{ @BindView(R.id.btn) Buttonbtn; floatdx,dy; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.act_coordinatelayout); ButterKnife.bind(this); btn.setOnTouchListener(newButton.OnTouchListener(){ @Override publicbooleanonTouch(Viewview,MotionEventmotionEvent){ if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){ dx=motionEvent.getX(); dy=motionEvent.getY(); }elseif(motionEvent.getAction()==MotionEvent.ACTION_MOVE){ view.setX(motionEvent.getRawX()-dx); view.setY(motionEvent.getRawY()-dy-getStatusBarHeight()-getTitleBarHeight()); } returntrue; } }); } publicintgetStatusBarHeight(){ intresult=0; intresourceId=getResources().getIdentifier("status_bar_height","dimen","android"); if(resourceId>0){ result=getResources().getDimensionPixelSize(resourceId); } returnresult; } publicintgetTitleBarHeight(){ Windowwindow=getWindow(); intcontentViewTop=getWindow() .findViewById(Window.ID_ANDROID_CONTENT).getTop(); //statusBarHeight是上面所求的状态栏的高度 inttitleBarHeight=contentViewTop-getStatusBarHeight(); returntitleBarHeight; } } 作者:青蛙要fly 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册