Android UI渲染组件 HWUI

这篇具有很好参考价值的文章主要介绍了Android UI渲染组件 HWUI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android HWUI(Hardware UI)是Android系统中的一个组件,用于处理应用程序的UI渲染操作。相比传统的软件渲染方式,HWUI可以利用GPU硬件绘制界面,提高绘制效率和流畅度,同时支持一些高级特性,如视图层叠、动画和自定义绘制等。以下介绍HWUI的主要模块及其功能点:

1.Skia

Skia是HWUI的核心图形库,提供了基本的绘制功能,包括图形、文本、位图等。它支持硬件加速渲染,能够充分利用GPU进行并发计算,加快UI界面的渲染速度。Skia还提供了强大的API接口,方便开发人员对图像进行自定义绘制和处理。

核心代码示例:文章来源地址https://www.toymoban.com/news/detail-708861.html

// 创建画布
Canvas canvas = new Canvas(bitmap);
// 绘制矩形
Paint paint = new Paint();
final int color = Color.BLUE;
paint.setColor(color);
RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
canvas.drawRoundRect(rect, 32, 32, paint);

2.OpenGL ES

OpenGL ES是HWUI与GPU之间的桥梁,负责将Skia生成的绘制命令转化为GPU能够执行的指令序列。 OpenGL ES 3.0是HWUI的默认版本,具有更好的功能和性能表现,例如添加了重要的纹理压缩格式和多重采样抗锯齿。

核心代码示例:

// 创建EGLContext、EGLSurface等
EGLDisplay display = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
EGLConfig config = getBestConfig(display);
EGLContext context = createContext(display, config);
EGLSurface surface = createWindowSurface(display, config);
// 使用OpenGL ES进行绘制
EGL14.eglMakeCurrent(display, surface, surface, context);
glClearColor(0.3f, 0.4f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交换显示缓冲区
EGL14.eglSwapBuffers(display, surface);

3.DisplayList

DisplayList是HWUI的渲染列表,记录了绘制操作以及它们的位置、大小等信息。在绘制过程中,这些操作被显式地缓存起来,以便后续可以更快速地进行处理。DisplayList还允许视图树中相同的部分在多个帧之间重复使用,从而节约了可观的内存和带宽。

核心代码示例:

// 创建DisplayList
DisplayList displayList = new DisplayList("MyList");
displayList.start(512, 512); //设置宽高
// 添加绘制操作
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
displayList.drawRect(64, 64, 256, 256, paint);
// 结束DisplayList
displayList.end();

4. RenderNode

RenderNode是HWUI的渲染节点,对应于一个视图层次结构中的一个节点。每当View的显示状态发生变化时,它会重新计算所有子项的布局和位置,并生成新的DisplayList。View绘制过程中使用的各种属性、例如透明度和边框等,都通过RenderNode保存和管理。

核心代码示例:

// 创建RenderNode
RenderNode renderNode = new RenderNode("MyNode");
// 更新RenderNode属性
View view = findViewById(R.id.myView);
renderNode.setPosition(view.getLeft(), view.getTop());
renderNode.setElevation(view.getElevation());
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
renderNode.setBitmapCache(bitmap);
// 添加子节点
RenderNode child = new RenderNode("MyChild");
//更新child属性
renderNode.addChild(child);

5.Layers

Layer是HWUI的另一个重要概念,用于实现UI的专业效果和动画效果。 在Android 10及以前的系统中,所有视图都隶属于共享的系统组层级。但是在Android 11及以后的系统中,每个窗口/活动/碎片都将拥有自己的独立图层级别,从而增强了性能和隐私管理。

核心代码示例:

// 创建Layer
Layer layer = mSurface.getLayer();
layer.setX(100);
layer.setY(100);
layer.setAlpha(0.5f);
// 在Layer上绘制图像和文字
Canvas canvas = layer.lockCanvas();
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.drawText(text, 30, 100, paint);
layer.unlockCanvasAndPost(canvas);

6.HardwareComposer

HardwareComposer是Android系统中的硬件合成器,作为HWUI的主要接口之一。它的作用是在GPU输出图像到屏幕之前,对多个应用程序的渲染结果进行混合和组合,从而形成最终的显示内容。 在硬件合成情况下,不需要将应用程序的UI渲染成一个帧缓存(FrameBuffer)并上传到系统RAM,从而减少内存和总线带宽的负担。

核心代码示例:

RoutingTable routingTable = hwcomposer.createRoutingTable();
routingTable.setOutputConfig(new OutputConfiguration(mDisplayToken, Display.DEFAULT_DISPLAY));
Destination destination = routingTable.createDestination();
destination.setColorMode(ColorMode.SRGB);
destination.setBufferStream(bufferStream);
surfaceFlinger.setTransactionState(routingTable.getTransaction());
surfaceFlinger.applyTransaction();

到了这里,关于Android UI渲染组件 HWUI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android快速入门-----用户界面(上)UI组件(1)

    @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ // 提示 Toast.makeText(SimpleComponActivity.this, cd_simple_pingpang.getText().toString(), 0).show(); } } }); cd_simple_foot.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton but

    2024年04月17日
    浏览(40)
  • Android彻底组件化—UI跳转升级改造

    (2)host对应的是share。在组件化框架中,每个组件对应一个唯一的host,例如分享组件的host就是share,读书组件的host是reader等等。 host是路由分发的第一级,根据host可以定位到每个组件。 host还可以对所有的路由URL进行一个分组,只有调用到该分组的路由的时候,组内的路由

    2024年04月16日
    浏览(26)
  • Android笔记(六):JetPack Compose常见的UI组件

    Text显示的文本来源可以引用res-values-strings.xml中的资源,如第一个显示文本所示。 点击按钮前: 点击按钮后: 点击第一个圆角按钮不放时,显示为按钮:true Button有两方面需要注意: (1) Buttton有一个参数interactionSource,用来监听组件状态的事件源,通过它获取组件的状态来

    2024年02月04日
    浏览(36)
  • Android设置app开机自启,网络监听,主线程完成UI渲染,HTTP网络请求工具,json数据处理,android使用sqlite,Android定时任务,日志打印

    在AndroidManifest.xml文件中添加权限 在AndroidManifest.xml文件中注册接收广播配置, 添加到manifest application节点下 在AndroidManifest.xml文件中添加节点属性, 指定安装目录为内部存储器, 而非SD卡 开机启动执行代码 gson是谷歌… implementation ‘gson-2.8.5’ 依赖无法下载, 直接使用jar包, 将ja

    2024年02月03日
    浏览(41)
  • Android快速入门-----用户界面(上)UI组件(1),附面试答案

    @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ // 提示 Toast.makeText(SimpleComponActivity.this, cd_simple_pingpang.getText().toString(), 0).show(); } } }); cd_simple_foot.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton but

    2024年04月25日
    浏览(35)
  • Android Jetpack组件库(第七部分)---UI工具包 Compose

    Android Jetpack 是 Google 推出的一整套帮助 Android 应用程序开发的库、工具包和架构指南,旨在为 Android 应用程序提供更快,更轻松,更稳定的开发体验。自推出以来已经发展成了一个庞大的技术生态系统,包括了许多使用方便、功能强大的库,以下是其中一些新特性、新组件:

    2024年01月16日
    浏览(38)
  • android ui 组件最常用的都在这里,经典中的经典

    在Android中常见的组件有TextView(文本视图组件)、EditText(文本编辑)、Button(按钮)、ImageView(图像视图组件)等等。 TextView是Android中最简单的一个控件,在新建Android项目的过程中HelloWorld的文本信息也就是由它显示 。TextView是大部分常见组件对象的父类,通过自定义TextView也可以完成

    2024年02月03日
    浏览(58)
  • Android技术栈(二)组件化改造,目前最稳定和高效的UI适配方案

    .build(PR.navi.navi) .navigation(); 而 Activity 则不需要,它会立即显示 ARouter.getInstance() .build(PR.navi.navi) //还可以设置参数,ARouter会帮你存在Bundle中 .withString(“pathId”,UUID.randomUUID().toString()) //Activity 或 Context .navigation(this); navi 模块是典型的业务逻辑模块,这里你可导入一些只有这个模块才

    2024年03月24日
    浏览(37)
  • Element UI结合vue-cropper打造图片裁剪上传组件,Android开发面试书籍

    left: 0; color: #ccc; font-size: 8px; right: 0; } } } ::v-deep .avatar-uploader .el-upload–text { border: 1px dashed #d9d9d9; border-radius: 6px; margin-right: 20px; cursor: pointer; position: relative; overflow: hidden; } ::v-deep .avatar-uploader .el-upload:hover { border-color: #409eff; } ::v-deep .avatar-uploader-icon { font-size: 22px; color: #ccc; wi

    2024年04月13日
    浏览(36)
  • Android编译Skia库

    本文档提供两种方法编译Skia库 使用aosp源码进行编译 使用skia源码进行编译 两种编译方法都可以编译,并且都可以使用在多个平台中,且可以使用在不同Android版本中 第一步是拿到aosp的源码.因为写这篇教程,使用的是msm8996的源码,因此,我就直接使用了. 第二步进入项目根目录,运行

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包