View,几乎是所有界面系统中的基类,在iOS里面是UIView,在Android里是View。 那么,到底View是什么东西,他做了些什么,他是怎么做到的,在这篇文章中,希望能带给大家一些启发。

抽象

View实际上是一个抽象类,他负责对渲染、布局以及触摸事件进行抽象。

渲染抽象

我们知道,不管是 iOS 还是 Android,他们的渲染引擎都是 OpenGL,OpenGL是面向C语言的(当然,在Objective-C和Java中都有封装)。而作为前端开发者,要直接使用OpenGL编写界面,真是不(Tai)现(Nan)实(Le)。于是,我们有了界面库,这种界面库,在iOS上,我们称之为UIKit,在Android上,我们使用android.view.*包。不管是iOS还是Android,界面库要做的事情,目标都是一致的,那就是将界面渲染从具体变成抽象。

布局抽象

布局,是View最重要的特性,诸如层级控制、矩形大小、Matrix变换都属于布局抽象的范畴,布局是渲染、触摸两者的基础,缺少布局,渲染和触摸便无法继续。

触摸事件抽象

除了渲染、布局以外,View还需要承担另外一个职责————触控。所谓触控,有触才有控,一方面View要负责接收触摸事件,另一方面View要负责反馈接收到的触摸事件,至于具体的触控实现,下文会详细描述。

渲染

一般来说View不会直接面向OpenGL进行封装,而是通过中间层,在iOS上,使用的是CALayer(CoreGraphics),而在Android上,使用的是 Canvas(Skia)。

iOS

在iOS上,每个UIView都会有一个相对应的CALayer,我们称之为Layer-Back,也就是说,所有的UIView属性,最终,都会设置到CALayer身上。

为什么要使用CALayer这个中间层呢?很重要的一点是,CoreGraphcis框架,这个框架,在NEXT系统创建之初就存在了,并且是整个macOS系统的核心框架。这么6的框架,为毛不让他移植到iOS上呢?于是,CALayer就顺理成章地成为了UIView背后的贤内助。UIView会将以下属性proxy到CALayer上

  • alpha

  • frame

  • backgroundColor

  • clipsToBounds

  • hidden

为毛这么少属性?嗯,因为其它属性需要你自己去设置到CALayer上。什么?你要问CALayer是怎么渲染到屏幕上的?你自己查吧,据说,专门有一本书是写这个的。总的来说,UIView在渲染上,并没有做什么神奇的事情,CALayer才是一直默默耕耘的那个。

Android

Android实际上是个草根系统,出生的时候,并没有一个有钱的爸爸…所以呢? Android View的渲染层,其实是照抄H5中的Canvas。

比如,我要在 View 上画一个黑色的 backgroundColor,实际上会在 void onDraw(Canvas canvas)方法中执行以下代码。

又例如,我想要让View有圆角裁剪的效果,怎么办呢?实际上,会这么做。

酱紫,在这个View中所绘制的所有图案(包括子View)都会被某个路径裁剪掉。

那么,View干了啥? View实际上会定义好x, y, width, height只有知道这些参数,你才能画出一个背景色,不然……你画个卵?View还管理着 alpha/backgroundColor等属性,这些属性,你都能在Canvas、Paint类中找到相关的参数。

iOS VS Android

这个,没什么好对比的,无非就是渲染层的抽象不一样而已。就渲染性能而言,iOS是更胜一筹的,自Android 4.x引入Skia以后,特别是Skia在 Google黄油计划以后,Android的渲染性能也差不了去哪里了。如果,你要死抠对比的话,我只能说一个是CALayer,一个是Canvas,CALayer更抽象而已了。

https://blog.csdn.net/urdfmqcul2/article/details/78486699

我所理解的Android和iOS上的View的更多相关文章

  1. React Native常用组件在Android和IOS上的不同

    React Native常用组件在Android和IOS上的不同 一.Text组件在两个平台上的不同表现 1.1 height与fontSize 1.1.1只指定font,不指定height 在这种情 ...

  2. 适配android和iOS上position:absolute和input问题

    //适配android上absolute和input的问题var oHeight = $(document).height(); //屏幕当前的高度$(window).resize(function( ...

  3. 用Flutter开发的跨平台项目,完美运行在Android和IOS上,Material简洁风格,包括启动页、引导页、注册、登录、首页、体系、公众号、导航、项目,还有漂亮的妹子图库,运行极度流畅,结构清晰,代码规范,值得拥有

    Flutter学习资源汇总持续更新中...... Flutter官方网站 Flutter中文网 wendux的Flutter实战 Flutter官方exampleflutter_gallery 阿里巴 ...

  4. Android 和iOS 中关于View 的一点知识

    View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充. 先转载一部分资料,感谢原作者! 原链接为:http://b ...

  5. 为什么不要在android或者ios上直连mysql或者sqlserver之类的数据库(跳大神)

    很多同学 都有直连这些数据库的想法,假设我说了下面二个问题之后你还想直连,那我也没办法 数据库是一个服务端最重要的部分,也是最脆弱的部分,更是最敏感的部分 假设直连会造成例如以下问题 1.安全问题,你 ...

  6. createjs的compositeOperation在Android和IOS上接受的参数居然不一样

    例如 目标.compositeOperation = 如果是安卓? "darken" : "darker";

  7. android 和iOS的view上的区别

    android上的view的类叫View, 以下是它的class overview, This class represents the basic building block for user i ...

  8. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  9. ionic默认样式android和ios的一些不同(当时真是纠结啊~)

    当时测试的时候看到android和ios上有那么大差别,特别崩溃啊... 还好看到了这篇文章,文章原文是Ionicchina中文网上的:http://ionichina.com/topic/54e45 ...

随机推荐

  1. - > 强烈推荐!!!

    学长的微博总是能帮我们解决很多问题QAQ,超有用的: http://blog.csdn.net/cax1165/article/category/6294316/6

  2. W3School Redis教程(安装/基本操作/高级操作/命令/官方文档/官方集群教程)

    说明:Redis有自身的客户端连接软件,也可以使用Telnet进行连接操作. 来自W3School的Redis教程,基本上涵盖了从安装到状态监控的教程. W3School:https://www.gi ...

  3. 17、Java并发性和多线程-避免死锁

    以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按 ...

  4. 用JQuery实现选中select里面的option显示对应的div

    HTML: <select name=""  onchange="select(this)"> <option value="1&q ...

  5. OpenCV基础篇之像素操作对照度调节

    程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  6. socket短连接、长连接

    通常短连接是这样:连接->传输数据->关闭连接那什么是长连接?一般长连接相对短连接而言的,长连接在传输结束后不关闭连接,而不断的发送包保持连接等待处理下一个数据包. 一般长连接用于少数cl ...

  7. 红帽/CentOS ext4无法格式化大分区

    红帽/CentOS 6.5的e2fsprogs版本号为1.41.12较低.无法创建16TB以上的文件系统 下载最新的e2fsprogs,编译安装 ftp://ftp.ntu.edu.tw/linux/ ...

  8. 使用系统存储过程来监控SQLServer进程和会话具体解释

     承接上文,本文讲述怎样使用系统存储过程来监控系统. SQLServer相同也提供了一系列系统存储过程用于监控SQLServer,获取当前进程.会话.请求以及锁定的具体信息.本文将演示系统存储过程 ...

  9. Linux内核之于红黑树and AVL树

    为什么Linux早先使用AVL树而后来倾向于红黑树?       实际上这是由红黑树的有用主义特质导致的结果,本短文依旧是形而上的观点.红黑树能够直接由2-3树导出.我们能够不再提红黑树,而仅仅提2- ...

  10. XCode 7 高速切换代码窗体和文档窗体

    XCode 7 高速切换代码窗体和文档窗体 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...