如果您对Android图形架构相关的概念和android图形框架感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Android图形架构相关的概念的各种细节,并对android图形框架进行深入的分
如果您对Android 图形架构相关的概念和android图形框架感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Android 图形架构相关的概念的各种细节,并对android图形框架进行深入的分析,此外还有关于15 个 Android 相关的中文网站、2021 最新 Android 架构师必备宝典《Android 架构开发手册》含抖音、美团等大厂架构演进之路、Android dpi,dip,dp的概念以及屏幕适配、Android RoundedBitmapDrawable:Android 官方的圆角图形图象实现方案的实用技巧。
本文目录一览:- Android 图形架构相关的概念(android图形框架)
- 15 个 Android 相关的中文网站
- 2021 最新 Android 架构师必备宝典《Android 架构开发手册》含抖音、美团等大厂架构演进之路
- Android dpi,dip,dp的概念以及屏幕适配
- Android RoundedBitmapDrawable:Android 官方的圆角图形图象实现方案
Android 图形架构相关的概念(android图形框架)
图形架构
本文介绍在Android中与图像架构相关的概念或类 Surface、SurfaceHolder、EGLSurface、SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceFlinger 和 Vulkan 的知识。
本页将介绍 Android 系统级图形架构的基本元素,以及应用框架和多媒体系统如何使用这些元素。我们会重点介绍图形数据的缓冲区是如何在系统中移动的。 如果您想了解 SurfaceView 和 TextureView 为何采用相应行为方式,或者 Surface 和 EGLSurface 的交互方式,这里可以为您提供正确解答。
本部分包括多个页面,从背景材料到 HAL 细节再到用例,进行了全面介绍。首先是对 Android 图形缓冲区进行了解释,并说明了合成和显示机制,然后继续介绍为合成器提供数据的更高级别的机制。我们建议您按照下列顺序阅读相关页面,而不要直接跳到感兴趣的主题。
低层组件
- BufferQueue 和 gralloc。BufferQueue 将可生成图形数据缓冲区的组件(生产者)连接到接受数据以便进行显示或进一步处理的组件(消费者)。通过供应商专用 HAL 接口实现的 gralloc 内存分配器将用于执行缓冲区分配任务。
- SurfaceFlinger、Hardware Composer 和虚拟显示屏。SurfaceFlinger 接受来自多个源的数据缓冲区,然后将它们进行合成并发送到显示屏。Hardware Composer HAL (HWC) 确定使用可用硬件合成缓冲区的最有效的方法,虚拟显示屏使合成输出可在系统内使用(录制屏幕或通过网络发送屏幕)。
- Surface、Canvas 和 SurfaceHolder。Surface 可生成一个通常由 SurfaceFlinger 使用的缓冲区队列。当渲染到 Surface 上时,结果最终将出现在传送给消费者的缓冲区中。Canvas API 提供一种软件实现方法(支持硬件加速),用于直接在 Surface 上绘图(OpenGL ES 的低级别替代方案)。与视图有关的任何内容均涉及到 SurfaceHolder,其 API 可用于获取和设置 Surface 参数(如大小和格式)。
- EGLSurface 和 OpenGL ES。OpenGL ES (GLES) 定义了旨在与 EGL 结合使用的图形渲染 API。EGL 是一个通过操作系统创建和访问窗口的库(要绘制纹理多边形,请使用 GLES 调用;要将渲染应用到屏幕上,请使用 EGL 调用)。此页还介绍了 ANativeWindow,它是 Java Surface 类的 C/C++ 等价类,用于通过原生代码创建 EGL 窗口表面。
- Vulkan。Vulkan 是一种用于高性能 3D 图形的低开销、跨平台 API。与 OpenGL ES 一样,Vulkan 提供用于在应用中创建高质量实时图形的工具。Vulkan 的优势包括降低 cpu 开销以及支持 SPIR-V 二进制中间语言。
高层组件
- SurfaceView 和 GLSurfaceView。SurfaceView 结合了 Surface 和 View。SurfaceView 的 View 组件由 SurfaceFlinger(而不是应用)合成,从而可以通过单独的线程/进程渲染,并与应用界面渲染隔离。GLSurfaceView 提供了用于管理 EGL 上下文、线程间通信以及与 Activity 生命周期的交互的辅助程序类(但不是必须使用 GLES)。
- SurfaceTexture。 SurfaceTexture 将 Surface 和 GLES 纹理相结合来创建 BufferQueue,而您的应用是 BufferQueue 的消费者。当生产者将新的缓冲区排入队列时,它会通知您的应用。您的应用会依次释放先前占用的缓冲区,从队列中获取新缓冲区并执行 EGL 调用,从而使 GLES 可将此缓冲区作为外部纹理使用。Android 7.0 添加了对安全纹理视频播放的支持,以便对受保护的视频内容进行 GPU 后处理。
- TextureView。 TextureView 结合了 View 和 SurfaceTexture。TextureView 对 SurfaceTexture 进行包装,并负责响应回调以及获取新的缓冲区。在绘图时,TextureView 使用最近收到的缓冲区的内容作为其数据源,根据 View 状态指示,在它应该渲染的任何位置和以它应该采用的任何渲染方式进行渲染。View 合成始终通过 GLES 来执行,这意味着内容更新可能会导致其他 View 元素重绘。
15 个 Android 相关的中文网站
以下是收集了网络上比较出名的一些 Android 相关的网站,其中有一些同名的不同网站,当然还有一个很重要的 Android 应用商店 未列出。
0. Android 官方网站
没什么说的,最权威的 Android 网站,全面的开发手册和最新 Android 的下载
http://code.google.com/intl/zh-CN/android/
1. Android Resource
博客型的 Android 技术与资讯的综合网站,网站设计非常精美,内容也很丰富。
http://www.androidres.com/
2. Android 开发者
同样是博客型的 Android 技术和资讯的网站,更新频繁
http://www.androidin.com/
3. 安卓网
Android 资源分享社区,论坛形式,内容倾向于硬件方面
http://www.hiapk.com/bbs/
4. Android 开发网
网站以文章的形式侧重 Android 开发技术的内容,不提供用户交互功能。
http://www.android123.com.cn/
5. 安诺网
提供最新 Android 产品新闻,技术交流和软件下载的网站,论坛形式。
http://www.and-roid.com/
6. William Hua 的 Blog
一个关于生活感悟、开放源码、移动App和Android开发的Blog
http://www.williamhua.com/
7. Android 资讯网
博客形式的 Android 最新资讯网站,更多涉及机型信息,内容更新及时
http://android.hk.cn/
8. Android 中文网
91的一个子网站,主要是 Android 资讯类和软件下载、使用方法等内容为主
http://android.sj.91.com/
9. Android 中文论坛
论坛型的网站,提供 Android 硬件、破解、资源以及非常规使用的技巧等方面的内容
http://www.androidin.net/
10. Android 实验室
论坛型的 Android 综合网站,内容不多
http://www.androidlab.cn/
11. Android 爱好者论坛
Android论坛,主要涉及 Android 使用中问题
http://www.loveandroid.com/
12. Android 中文网
致力于 Android 开发者的网站,论坛+博客的形式
http://www.androidcn.net/
13. Android 刷机网
不用说,看这个网站的名字就知道是干嘛的
http://www.androiddiy.com.cn/
14. Google Android 手机网
涉及 Android 硬件、评测、软件下载、游戏、图片等方面内容
http://www.android86.com.cn/
文/中国开源社区(OsChina) 红薯
2021 最新 Android 架构师必备宝典《Android 架构开发手册》含抖音、美团等大厂架构演进之路
前言
近几年,Android 开发的套路日趋成熟,越来越多的 Android 工程师获得了「高级」的称号,也有不少人在参与公司的 App 从无到有再到火爆的整个开发过程中,顺理成章地拿到了 Leader 职位。
1、什么是 Android 架构师?
笼统的说,比高级工程师技术面更广,学习主动性更强,更能紧跟时代发展的就是 Android 架构师。Android 架构师技术深度和广度都要兼顾,也需要时间的积累和经验的沉淀。
2、最主流的 Android 架构师技术体系详解
在移动开发中,对开发者来说不同的人具有不同的能力。就像读一本书一样,一千个读者,有一千个哈姆雷特。但不管怎样,只要你是个软件开发者你就必须学习 windows 或 Linux 等操作系统的运行原理。Android 是一个移动终端操作系统平台,在这个智能手机普及的时代,学习 Android 框架是非常重要。接下来笔者就抛砖引玉,希望这本书在您开发软件之路上帮到您。Android 架构开发手册主要介绍 Android 框架的初始化过程及主要组件的工作原理。直接分析和整理了 Android 框架的主要源代码,并详细讲解了理解框架工作原理所需的各种基础知识和构成实际 Android 平台骨干的服务框架。其中的主要内容包括:Android Jetpack 实战和教程 MVC/MVP/MVVM, 大厂架构演进之路等。不仅可以供具备一定开发经验的 Android 开发人员参考阅读,也可作为 Android 开发初学者的 Android 框架入门教材使用。
第一章. Android Jetpack 实战和教程即学即用
1.Android Jetpack - Navigation
2.Android Jetpack - Data Binding
3.Android Jetpack - ViewModel & LiveData
4.Android Jetpack - Room
5.Android Jetpack - Paging
6.Android Jetpack - WorkManger·
7.Android Jetpack - Paging 3
第二章.MVC/MVP/MVVM
1.MVC 框架 - 导言
2.MVC 框架 - ASP.NET 窗体
3.MVC 框架 - 第一应用程序
4.MVC 框架 - 文件夹
5.MVC 框架 - 模型
6.MVC 框架 - 控制器
7.MVC 框架 - 视图
8.MVC 框架 - 布局
9.MVC 框架 - 路由引擎
10.MVC 框架 - 动作过滤器
11.MVC 框架 - 高级示例
12.MVC 框架 - Ajax 支持
13.MVC 框架 - 捆绑
14.MVC 框架 - 异常处理
15.MVP 架构设计: Google 官方 MVP 思想解读
16. 开源 MVP 框架
17.MVC、MVP、MVVM,到底该怎么选?
第三章。大厂架构演进之路
1. 抖音 ioS 工程架构演进
2016.09.26,抖音版本 1.0.0 上线,随后不断迭代优化和丰富产品,截止目前,抖音日活跃用户突破 6 亿,短短 4 年间,抖音从零爆发性增长。想要了解它的架构演化请往下看。
2 美团外卖 Android 平台化架构演进实践
在我们探索解决两端代码复用的同时,业务的发展又对我们提出新的挑战。随着团队成员扩充了数倍,商超生鲜等垂直品类的拆分,以及异地研发团队的建立,外卖客户端的平台化被提上日程,想要解决外卖业务平台化的问题,又要解决外卖 App 和外卖频道两端代码复用的问题,下面为你解答。
3. 安居客 Android 项目架构演进
几年前安居客在业务上刚完成了三网合并,这一时期安居客代码结构混乱、层次不清,各业务技术方案不统一,冗余代码充斥项目的各个角落;甚至连基本的包结构也是胡乱不堪,项目架构更是无从谈起。带你看看如何梳理了整个项目的结构。
4. 携程 Android App 插件化和动态加载实践
携程 Android App 的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍 Android 平台插件式开发和动态加载技术的原理和实现细节,回顾携程 Android App 的架构演化过程,期望我们的经验能帮助到更多的 Android 工程师。
5. 微信 Android 客户端架构演进之路
微信 1.0 for Android 的测试版本于 2011 年 1 月发布。这是微信 Android 客户端的第一个版本,软件架构采用早期标准的 Android 系统应用设计,接下来带你走进他的演进之路。
6. 千万级用户的 Android 客户端是如何养成的│架构师实践日
Android 客户端的架构不论如何演变,架构设计的出发点总是离不开两点,一是提高开发效率,二是降低维护成本。5 月 29 日下午,九言科技 in Android 客户端的负责人阿刘基于这两点,在七牛云举办的「架构师实践日」沙龙上,为大家带来了题为「in Android 客户端的架构演变」的分享。以下是对他演讲内容的整理。
7. 手机淘宝构架演化实践
淘宝相信都不陌生了从 2009 年开始,DAU 从 100 万增长到超过 1 亿,面临的问题、包括研发支撑所需要解决的事情各不相同。在用户量和业务复杂度的线性递增下,架构也进行了相应的演进,相信大家对它的演进也是非常感兴趣,下面就直接进入主题吧,
8. 英语流利说 Android 架构演进
今天给大家分享的是英语流利说 Android 端的代码架构的演进,整个演进过程,也是借鉴了业界很多大型应用在架构上的沉淀以及思想,可能有些东西还有点老生常谈,不过全都是干货手机。
最后
还在想成为优秀架构师而烦恼吗?只要你内心有明确的目标和渴望:我一定要进入大厂,一定要成为 Android 架构师,那么掌握了以上这些知识点,你将会是以后面试时在候选人中又可以夺目不少,暴击 9999 点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。相信自己,架构师不是梦想。
如果你需要这份完整版的面试笔记,赶紧扫一扫下面二维码领取吧。
如遇扫码频繁,无法添加,请点击左下角阅读原文,添加备用微信
本文分享自微信公众号 - Android 群英传(android_heroes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
Android dpi,dip,dp的概念以及屏幕适配
屏幕尺寸,屏幕分辨率 的含义
- 屏幕尺寸: 屏幕的对角线长度,单位是英寸(in). 1英寸 = 2.54厘米
- 屏幕分辨率: 屏幕横向和纵向的像素点数.(例如: 横向 1080px,纵向 1920px,则屏幕分辨率表示为: 1920 * 1080)
ppi, dpi, dip, dp, sp, px各代表什么?
- ppi: 屏幕像素密度(pixels per inch), 是指屏幕上每英寸包含的像素点的数目.
ppi = 屏幕对角线像素数目 / 屏幕尺寸
- dpi: (dots per inch), 和ppi是相同概念的不同叫法. Android中主要采用dpi的叫法.
- dip: 屏幕密度无关的像素(density independent pixels)
Android中以 160dpi 的屏幕为基准, 规定在此屏幕上 1dip = 1px, 因此dip的公式为 1dip = DPI/160 px
- dp: dip 的缩写
- sp: (scale independent pixels), 和dp类似,只不过sp的缩放系数可以根据用户喜好设定,常用于设置文字大小
1sp = scaleFactor px
- px: 1像素
Android中图片的适配
- drawable-ldpi dpi = 120
- drawable-mdpi dpi = 160 (基准)
- drawable-hdpi dpi = 240
- drawable-xhdpi dpi = 320
- drawable-xxhdpi dpi = 480
- drawable-xxxhdpi dpi = 640
假设我们的屏幕dpi是480(对应的目录是drawable-xxhdpi)
- drawable-xxhdpi目录中有需要的图片,那么系统将选取该图片并且不需要缩放.
- 假设drawable-xxhdpi目录中没有需要的图片,那么系统将选取其它目录中的图片,并进行缩放
int screenDPI;//屏幕dpi
int dirDPI;//选取的图片所在目录对应的dpi
int dirImageWidth;//该目录下图片的宽度(像素)
int dirImageHeight;//该目录下图片的高度(像素)
那么系统缩放之后, Bitmap的宽度 w = dirImageWidth * screenDPI / dirDPI
Bitmap的高度 h = dirImageHeight * screenDPI / dirDPI
BitmapFactory.decodexx会自动进行缩放, 放在drawable-nodpi目录中的除外
假设我们的屏幕dpi是480(对应的目录是drawable-xxhdpi), 目标图片尺寸 192 * 192
我们将这张图片放到不同的目录下,然后通过BitmapFactory.decodexx 来获取Bitmap,看看缩放后的尺寸:
图片放在 drawable-hdpi 中,缩放后的尺寸: 384 * 384
图片放在 drawable-xxxhdpi 中,缩放后的尺寸: 144 * 144
图片放在 drawable-nodpi 中, 不缩放: 192 * 192
...
- 当屏幕dpi介于 drawable-xhdpi 和 drawable-xxhdpi 之间时(例如dpi = 400),那么系统将选用drawable-xxhdpi中的图片,并缩放
- Android中的 density = densityDpi / 160
- 假设设计师是以dpi=480的屏幕为基准来设计的,那么相应的切图应该放在drawable-xxhdpi目录中,假设其中一个图片的尺寸为72 * 72,那么XML中给他的大小应该设置为 24dp. (72 / density)
- 如果不希望BitmapFactory.decode出来的Bitmap被缩放,有2种方法
- 将图片放在drawable-nodpi目录下
- 将BitmapFactory.Options.inScaled设置为false (默认是true)
Android RoundedBitmapDrawable:Android 官方的圆角图形图象实现方案
Android RoundedBitmapDrawable:Android 官方的圆角图形图象实现方案
RoundedBitmapDrawable 是 Android 在 support v4 的扩展包中新增的实现圆角图形的关键类,借助 RoundedBitmapDrawable 的帮助,可以轻松的以 Android 标准方式实现圆角图形图象。
写一个简单的例子。
写一个线性布局,竖直方向放三个 ImageView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="zhangphil.app.MainActivity">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp" />
</LinearLayout>
然后通过 Java 代码分别放原始图,圆角图,圆形图作为对比:
package zhangphil.app;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//未做圆角处理的原始图
ImageView image1 = (ImageView) findViewById(R.id.imageView1);
image1.setImageResource(R.drawable.zhangphil);
//圆角图
RoundedBitmapDrawable roundedDrawable = RoundedBitmapDrawableFactory.create(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.zhangphil));
roundedDrawable.getPaint().setAntiAlias(true);
roundedDrawable.setCornerRadius(30);
ImageView image2 = (ImageView) findViewById(R.id.imageView2);
image2.setImageDrawable(roundedDrawable);
//圆形图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.zhangphil);
RoundedBitmapDrawable circleDrawable = RoundedBitmapDrawableFactory.create(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.zhangphil));
circleDrawable.getPaint().setAntiAlias(true);
circleDrawable.setCornerRadius(Math.max(bitmap.getWidth(), bitmap.getHeight()));
ImageView image3 = (ImageView) findViewById(R.id.imageView3);
image3.setImageDrawable(circleDrawable);
}
}
代码运行结果:
附录文章:
1,《Android 圆形头像图 Circle ImageView》链接地址:http://blog.csdn.net/zhangphil/article/details/44960551
2,《Android CustomShapeImageView 对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等》链接地址:http://blog.csdn.net/zhangphil/article/details/50119921
关于Android 图形架构相关的概念和android图形框架的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于15 个 Android 相关的中文网站、2021 最新 Android 架构师必备宝典《Android 架构开发手册》含抖音、美团等大厂架构演进之路、Android dpi,dip,dp的概念以及屏幕适配、Android RoundedBitmapDrawable:Android 官方的圆角图形图象实现方案的相关知识,请在本站寻找。
本文标签: