我所理解的Android和iOS上的View

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

原文地址:https://www.cnblogs.com/feng9exe/p/9255406.html

时间: 2024-10-13 15:13:30

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

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

Flutter学习资源汇总持续更新中...... Flutter官方网站 Flutter中文网 wendux的Flutter实战 Flutter官方exampleflutter_gallery 阿里巴巴咸鱼团队系列文章 阿里巴巴flutter-go,flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档 玩Android跨平台项目 非常有用的Json转Model插件 Flutter-Notebook,提供了很多优秀样例和Demo 前言 这是一款使

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

许多同学 都有直连这些数据库的想法,如果我说了以下二个问题之后你还想直连,那我也没办法 数据库是一个服务端最重要的部分,也是最脆弱的部分,更是最敏感的部分 如果直连会造成如下问题 1.安全问题,你的连接数据库的账号密码 暴露给了客户端,这样很容易被抓到,无论是android的反编译,还是抓包,都很容易得到这个信息,而且如果需要直连,数据库势必要监听0.0.0.0,,这样任何人都可以尝试你的数据库,多么可怕的一件事 2.性能问题,我们知道一个数据库的并发连接很低,mysql的默认配置只有100,直

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

本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用.利用这一特性,可以扩展unity的功能.例如集成和调用第三方库.同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用. 这里列举以下两个例子. 1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口. 2. 2. 简

多平台实现密码强度(Javascript 、android、ios)

密码强度是目前很常用的一种功能,密码强度的实现,在web端都很好实现,可以很轻松的使用Javascript方法实现,目前因为项目需要,要在手机app上也实现密码强度,并且同时要在Android和ios上都实现相同功能,密码复杂度,无外乎大写字母.小写字母.数字和特殊符号,且需要加上重复字符出现的次数等,一般常用的方法都是使用正则表达式. 查阅了很多资料,网上在app端实现密码强度的例子基本没有(手机QQ是调用的web页面,支付根本没有密码复杂度),且又要web端和app端的三种语言通用,没办法只

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

当时测试的时候看到android和ios上有那么大差别,特别崩溃啊... 还好看到了这篇文章,文章原文是Ionicchina中文网上的:http://ionichina.com/topic/54e453ee2be672f1111c01e1 ionicframework中android和ios在默认样式上有一些不同的地方,官方文档中都有说明,但是经常会想不起. 1.tab位置,$ionicConfigProvider, tabs.position(value) Android 默认是顶部(top)

android和ios流媒体库推荐

1基本信息编辑 Vitamio是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.从2011年8月上线到2014年1月,Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐,全球已经有超过3000 种应用在使用Vitamio,覆盖用户超过5亿. 2功能特性编辑 Vitamio能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在Android 与 iOS 上跨平台支持 MMS

vue中解决时间在ios上显示NAN的问题

最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:00:59这种"-"连接符. 网上的解决是: var data = '2018-09-01 12:00:00' var time= Date.parse(new Date(data )) 然后用正则匹配改一下,将-替换为/ var date = '2018-09-01 12:00:00' v

HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了

2007 年 W3C (万维网联盟)立项 HTML5,直至 2014 年 10 月底,这个长达八年的规范终于正式封稿. 过去这些年,HTML5 颠覆了 PC 互联网的格局,优化了移动互联网的体验,接下来,HTML5 将颠覆原生 App 世界.这听起来有点危言耸听,但若认真分析 HTML5 的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟知历史才能预知未来,先让我们来看看 HTML5 为什么诞生.这 8 年是怎么过来的. 一. HTML5 的诞生 自 W3C 于 1999 年发布 HTML

GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式. 对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局.能够让开发者轻松开发