Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现

本文介绍了如何在Android 10.0的Launcher3中实现双层抽屉的高斯模糊(毛玻璃)背景功能。主要涉及的核心代码包括launcher.xml、ScrimView.java和BlurUtil工具类。通过ShelfScrimView和DragController等组件,实现了在滑动抽屉时动态更新模糊背景的效果。
摘要由CSDN通过智能技术生成

1.概述

 在进行定制开发的功能需求方面,Launcher3的需求也挺多的,单双层抽屉高斯模糊毛玻璃背景功能也是一个需求功能,最近按照功能需求来开发 双层抽屉高斯模糊毛玻璃效果背景的功能

效果图如图:

 2. Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现的核心代码

   packages\apps\Launcher3\res\layout\launcher.xml
   packages\apps\Launcher3\res\layout\scrim_view.xml
   packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\ShelfScrimView.java

3. Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现功能分析

在Launcher3中的核心布局中,比较workspace hotseat folder等核心部件中,在
Launcher3中的核心部件就是在launcher.xml中,这里显示Launcher3桌面的核心控件,
DragLayer Workspace WorkspacePageIndicatorLine drop_target_bar hotseat等主要控件的布局

launcher3主要的类
LauncherModel:
跟数据有关系,保存了桌面运行时的状态信息,也提供了读写数据库的API,他有一个内部类LoaderTask,桌面启动从数据库中读取数据并把图标和小工具添加上去的时候用的就是他。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的代码实现 Launcher3 抽屉模式高斯模糊的示例,仅供参考: 1. 创建 RenderScript 脚本文件 GaussianBlur.rs: ``` #pragma version(1) #pragma rs java_package_name(com.example.launcher3) rs_allocation inputAllocation; rs_allocation outputAllocation; int width; int height; int radius; void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) { float4 sum = 0; float wsum = 0; int r = radius; for (int i = -r; i <= r; i++) { for (int j = -r; j <= r; j++) { if ((x + i) >= 0 && (x + i) < width && (y + j) >= 0 && (y + j) < height) { float4 color = rsUnpackColor8888(*(rsGetElementAt_uchar4(inputAllocation, x + i, y + j))); float weight = exp(-(i * i + j * j) / (2.0f * r * r)); sum += color * weight; wsum += weight; } } } *v_out = rsPackColorTo8888(sum / wsum); } ``` 2. 在 Java 代码中加载 RenderScript 脚本文件: ``` private RenderScript mRenderScript; private ScriptC_GaussianBlur mScriptGaussianBlur; private void initRenderScript() { mRenderScript = RenderScript.create(this); mScriptGaussianBlur = new ScriptC_GaussianBlur(mRenderScript, getResources(), R.raw.gaussianblur); } ``` 3. 创建一个 Bitmap 对象,将抽屉中显示的内容绘制到这个 Bitmap 上: ``` private Bitmap getDrawerBitmap() { int width = mDrawerList.getWidth(); int height = mDrawerList.getHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); mDrawerList.draw(canvas); return bitmap; } ``` 4. 将 Bitmap 作为输入数据,调用 RenderScript 对象中的函数进行高斯模糊处理: ``` private Bitmap blurBitmap(Bitmap inputBitmap, int radius) { int width = inputBitmap.getWidth(); int height = inputBitmap.getHeight(); Bitmap outputBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Allocation inputAllocation = Allocation.createFromBitmap(mRenderScript, inputBitmap); Allocation outputAllocation = Allocation.createFromBitmap(mRenderScript, outputBitmap); mScriptGaussianBlur.set_inputAllocation(inputAllocation); mScriptGaussianBlur.set_outputAllocation(outputAllocation); mScriptGaussianBlur.set_width(width); mScriptGaussianBlur.set_height(height); mScriptGaussianBlur.set_radius(radius); mScriptGaussianBlur.forEach_root(inputAllocation, outputAllocation); outputAllocation.copyTo(outputBitmap); return outputBitmap; } ``` 5. 将处理后的 Bitmap 显示在抽屉中: ``` private void showBlurredDrawer() { Bitmap drawerBitmap = getDrawerBitmap(); Bitmap blurredBitmap = blurBitmap(drawerBitmap, 10); mDrawerBackground.setImageDrawable(new BitmapDrawable(getResources(), blurredBitmap)); mDrawerLayout.openDrawer(mDrawerList); } ``` 以上是一个简单的示例,实际实现中可能需要根据具体情况进行修改和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值