Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/1818272572012102321850385/ 2012-11-23 14:24:59|  分类: Android开发 |  标签:android  view  android开发  |举报|字号 订阅     下载LOFTER客户端     一.android绘制view的过程简单描述           简单描述可以解释为:计算…
1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):            下面看看每一步的动作到底是什么,            第一步:当activity启动的时候,触发初始化view过程的是由Window对象的DecorView调用View(具体怎样从xml中读取是用LayoutInflater.from(context).inflate)对象的 public final void measu…
View的draw过程相比之于measrue过程,也是比较简单的.并且在我们自定义View时,也经常需要重写onDraw方法,来绘制出我们要实现的效果. 如之前的文章所说,绘制的流程也是起始于ViewRootImpl#perfomTraversals,ViewRootImpl#performDraw() 方法调用了ViewRootImpl#draw(boolean fullRedrawNeeded) ,其中这个boolean类型的形参,作用是判断是否需要重新绘制全部视图.最后调用的DecorVi…
[onMeasure] 直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于match_parent. @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); in…
我们从Activity的setContentView()入手,开始源码解析, //Activity.setContentView public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); initActionBar(); } //PhoneWindow.setContentView public void setContentView(int layoutResID) { if (…
Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆形,三角形,多边形等-. 新建一个项目 然后我们创建一个listview,每个图案一个Activity,这样看起来是不是很顺眼 <ListView android:id="@+id/listview" android:layout_width="wrap_content&q…
Android的布局方式有两种,一种是通过xml布局,一种是通过java代码布局,两种布局方式各有各的好处,当然也可以相互混合使用.很多人都习惯用xml布局,那xml布局是如何转换成view的呢?本文从源码的角度来简单分析下整个过程. 首先,创建一个新的项目,默认生成一个activity,其中xml布局很简单,就一个RelativeLayout套了一个ImageView,代码及效果如下: public class MainActivity extends Activity { @Override…
转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android   在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下. 方法一: 1 //设置绘制的颜色,a代表透明度,r,g,b代表颜色值. 2 setARGB(int a,int r,int g,int b); 这个不多说了,还有两个类似的方法,将设置alpha和rgb分割开…
一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. 1.2.Android基本概念 窗口 对用户来说, 窗口就是手机屏幕, 包括下面的那些home.back按键.状态栏等.对于Activity来说, 窗口就是除系统状态栏和系统按键的屏幕区域, 有window之类的概念.对于wms来说, 它没有什么窗口的概念, 它能接受的只是一个个view而已.也就是…
Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯一个内容,那就是自定义View 自定义View 自定义View的分类 自定义View的须知 自定义View的实例 自定义View的思想 一.自定义View的分类 自定义View百花齐放,没有什么具体的分类,不过可以从特性大致的分为4类,其实在我看来,就三类,继承原生View,继承View和继承Vie…
前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CPU,因此在开发Android应用程序时也不可能无限制的使用CPU和内存,如果对CPU和内存使用不当也会造成应用的卡顿和内存溢出等问题.因此,应用的性能优化对于开发人员有着更高的要求.Android性能优化分为很多种,比较常用的有绘制优化.内存优化.耗电优化和稳定性优化等,这个系列我们就来学习性能优化…
前言 自己定义View是Android开发人员必须了解的基础 网上有大量关于自己定义View原理的文章.但存在一些问题:内容不全.思路不清晰.无源代码分析.简单问题复杂化等等 今天,我将全面总结自己定义View原理中的layout过程,我能保证这是市面上的最全面.最清晰.最易懂的 文章较长.建议收藏等充足时间再进行阅读 文件夹 imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="文件夹" title="&…
目录 目录 1. 知识基础 具体请看我写的另外一篇文章:(1)自定义View基础 - 最易懂的自定义View原理系列 2. 作用 计算View视图的位置. 即计算View的四个顶点位置:Left.Top.Right和Bottom 3. layout过程详解 同measure过程一样,layout过程根据View的类型分为两种情况: 如果View = 单一View,则仅计算本身View的位置: 如果View = VieGroup,除了计算自身View的位置外,还需要确定子View在父容器中的位置.…
有好几周没写东西了,一方面是因为前几个周末都有些事情,另外也是因为没能找到好的写作方向,或者说有些话题 值得分享.写作,可是自己积累还不够,没办法只好闷头继续研究了.这段时间一边在写代码,一边也在想Android中 究竟是如何将R.layout.xxx_view.xml这样的布局文件加载到Android系统的view层次结构中的(即我们常说的view树). 这期间一方面自己研究了下源码,另一方面也在网上搜索了下相关文章,发现了2篇很不错的同主题文章,推荐给大家: http://blog.csdn…
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用canvase绘图类,加上timer计时器和handler来更新UI,核心就这点东西,非常简单.废话不多说,先附上效果图. 和小米自带的还是有差距的,主要是运行的时候指针的转动感觉没小米的那么流畅.这一点还在优化中.直接上代码,所有的注视都写上了,没什么好说的. 主页面xml文件 <LinearLayo…
这章就比较好玩了,主要介绍一下View的工作原理,还有自定义View的实现方法,在Android中,View是一个很重要的角色,简单来说,View是Android中视觉的呈现,在界面上Android提供了一套完整的GUI库,里面有很多控件,但是有时候往往并不能满足于需求,所以只有自定义View了,我们会简单的说下流程,然后再去实践除了View的三大流程之外,View常见的回调方法也是必须掌握的,比如构造方法,onAttach,onVisibilityChanged,onDetach,另外对于一些…
Android APK 一.APK的结构以及生成 APK是Android Package的缩写,即Android application package文件或Android安装包.每个要安装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为 .apk.APK文件是用编译器编译生成的文件包,其中包含了应用的二进制代码.资源.配置文件等.通过将APK文件直接传到Android手机中执行即可安装.APK文件其实就是zip格式,但其扩展名被改为apk.在这里我们为了详细讲述Android…
博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Android FrameWork 6.0源码学习] Window窗口类分析>本章博客是接着上边那篇博客分析,目的是为了引出分析ViewRootImpl这个类.现在只是分析完了Window和ActivityThread的调用过程从ActivityThread到WindowManager再到ViewRootImp…
Android艺术开发探索第三章----View的事件体系(上) 我们继续来看这本书,因为有点长,所以又分了上下,你在本片中将学习到 View基础知识 什么是View View的位置参数 MotionEvent和TouchSlop VelocityTracker,GestureDetector和Scroller View的滑动 使用scrollTo/scrollBy 使用动画 改变布局参数 各种滑动方式的对比 弹性滑动 使用Scroller 通过动画' 使用延时策略 这章的概念偏自定义View方…
Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目前的状况吧,结束了一个项目,现在接手一个新的项目,老项目的时候自己确实花了点时间去研究,包括看一些相关的博文和数据,新项目的自定义View更多,现在大致的对自定义View有了一些了解,但是你要说我会呢?我确实还没有掌握,只不过我把 我画的一些柱形图和其他图 的想法写出来,当然,你要让我说原理我肯定说…
本文主要探讨能够触发performTraversals()执行的invalidate().postInvalidate()和requestLayout()方法的流程.在调用这三个方法到最后执行到performTraversals()方法,涉及到到通过Choroegrapher请求Vsync信号,实现按帧绘制的流程,所以还会介绍Choroegrapher类的工作流程. 一.requestLayout()流程 invalidate()和postInvalidate()能够触发View的重画,这两个方…
首先追溯到Activity的启动,随便启动一个自己写的demo项目,使用DDMS进行debug标记,然后在Debug中把主线程暂停,可以看到调用栈.如下图所示: 于是我们先看android.app.ActivityThread的main()方法. android.app.ActivityThread.main() main()方法中对一个Looper对象进行初始化,形成一个消息循环,那么任何主线程的操作都会发送到这个Looper对应的Handler中去.通过源码,辗转反侧找到Handler的定义…
在创建自定义ViewGroup前,读者首先需要理解Android绘制视图的方式.我不会涉及过多细节,但是需要读者理解Android开发文档(见3.5节)中的一段话,这段话解释如何绘制一个布局.内容如下: “绘制布局由两个遍历过程组成:测量过程和布局过程.测量过程由measure(int, int)方法完成,该方法从上到下遍历视图树.在递归遍历过程中,每个视图都会向下层传递尺寸和规格.当measure方法遍历结束,每个视图都保存了各自的尺寸信息.第二个过程由layout(int, int, int…
目录 目录 1. 作用 测量View的宽/高 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高: 在这种情况下measure过程后得到的宽/高可能是不准确的: 建议在layout过程中onLayout()去获取最终的宽/高 2. 准备的基础 在了解measure 过程前,我们需要先了解measure过程中传递尺寸(宽 / 高测量值)的两个类: ViewGroup.LayoutParams (View 自身的布局参数) MeasureSpecs 类(父视图对子视图的测量要求…
在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGoup对象和View对象就是控件树中的节点.在控件树中,以树的深度来遍历查找对应的控件元素,同时,上层控件负责子控件的测量与绘制,并传递交互事件. Android控件树: AndroidUI界面架构图: 一.测量View的工具类:MeasureSpec 1.MeasureSpec包含了测量的模式和测量的…
转载自 http://www.cnblogs.com/dyllove98/p/3144950.html 好长,记录下,一次看完感觉像没看一样 Android APK 一.APK的结构以及生成 APK是Android Package的缩写,即Android application package文件或Android安装包.每个要安 装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为 .apk.APK文件是用编译器编译生成的文件包,其中包含了应用的二进制代 码.资源.配置文件等.通…
最近的版本有这样一个需求: 有 3 个要素: 中国地图 高亮省区 中心显示数字 面对这样一个需求,该如何实现呢? 高德地图 因为项目是基于高德地图来做的,所以很自然而然的想到了高德.但是当查阅高德地图相关 Api 后,发现并没有能够实现这样需求的方法,所以只能另寻他法了. 图片叠加 让设计师出图,实现第一个要素开发成本极低.至于高亮省区,也是继续让设计师出图,与全国地图分辨率保持一致,为每个省区设计一张高亮的图,其他地方透明,这样算下来设计师得出 35 张图.若不考虑性能,将图片无脑叠加倒也可以…
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWidth()和view.getHeight()为0的根本原因是控件还没有完成绘制,你必须等待系统将绘制完View时,才能获得.这种情况当你需要使用动态布局(使用wrap_content或match_parent)就会出现.一般来讲在Activity.onCreate(...).onResume()方法中…
在Android开发中为了inflate一个布局文件,大体有2种方式,如下所示: // 1. get a instance of LayoutInflater, then do whatever you want LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 2. you're in some View class, then jus…
在Android中,我们有时候可能会将子View的坐标转换为父View中的坐标.感觉很有用,分享给大家. 在Launcher中有这么一段代码可以完成这项工作.  public float getDescendantCoordRelativeToSelf(View descendant, int[] coord) {         float scale = 1.0f;         float[] pt = {coord[0], coord[1]};                   //…