android BSP 开发总结之四

1.设置状态栏的显示或隐藏


frameworks/base 路劲下面有个services/core/java/com/android/server/wm/DisplayPolicy.java, 该文件中有一个”mHasNavigationBar” , 设置为false则隐藏,否则显示。
String navBarOverride = "1";
if ("1".equals(navBarOverride)) {mHasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {mHasNavigationBar = true;
}

2.修改Snapdragon camera preview size 和image distortion

Snapdragon camera 不支持landscape的情况,将camera设置为landscape后,会出现preview size 和image distortion 不正确. 有遇到两种snapdragon camera的code。分别使用两种修改方式:

修改PhotoUI VideoUI文件

修改src/com/android/camera/PhotoUI.java文件中的”layoutPreview(float ratio)” 部分code,如下:

             Log.v(TAG, "setTransformMatrix: scaledTextureWidth = " + scaledTextureWidth+ ", scaledTextureHeight = " + scaledTextureHeight);
+            scaledTextureWidth = mMaxPreviewWidth - (mTopMargin + mBottomMargin);
+            scaledTextureHeight = mMaxPreviewHeight;if (((rotation == 0 || rotation == 180) && scaledTextureWidth > scaledTextureHeight)|| ((rotation == 90 || rotation == 270)&& scaledTextureWidth < scaledTextureHeight)) {
+                lp = new FrameLayout.LayoutParams((int)scaledTextureWidth ,
+                        (int) scaledTextureHeight, Gravity.CENTER);
+            } else {lp = new FrameLayout.LayoutParams((int) scaledTextureHeight,(int) scaledTextureWidth, Gravity.CENTER);
-            } else {
-                lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,
-                        (int) scaledTextureHeight, Gravity.CENTER);
-            }
-            if(mScreenRatio == CameraUtil.RATIO_4_3) {
-                lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
-                lp.setMargins(0, mTopMargin, 0, mBottomMargin);}
+//            if(mScreenRatio == CameraUtil.RATIO_4_3) {
+//                lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
+                lp.gravity = Gravity.TOP;
+                lp.setMargins(mTopMargin, 0, 0, mBottomMargin);
+//            }

修改src/com/android/camera/VideoUI.java文件中的layoutPreview(float ratio)” 部分code,如下:

 Log.v(TAG, "setTransformMatrix: scaledTextureWidth = " + scaledTextureWidth+ ", scaledTextureHeight = " + scaledTextureHeight);
-
+            scaledTextureWidth = mMaxPreviewWidth - (mTopMargin + mBottomMargin);
+            scaledTextureHeight = mMaxPreviewHeight;if (((rotation == 0 || rotation == 180) && scaledTextureWidth > scaledTextureHeight)|| ((rotation == 90 || rotation == 270)&& scaledTextureWidth < scaledTextureHeight)) {
-                lp = new FrameLayout.LayoutParams((int) scaledTextureHeight,
-                        (int) scaledTextureWidth, Gravity.CENTER);
+                lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,
+                        (int) scaledTextureHeight, Gravity.CENTER);} else {lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,(int) scaledTextureHeight, Gravity.CENTER);}
+            lp.gravity = Gravity.TOP;
+            lp.setMargins(mTopMargin, 0, 0, mBottomMargin);}

修改CaptureUI 文件

修改src/com/android/camera/CaptureUI.java文件中的showSurfaceView的code,代码如下:
 

public void showSurfaceView() {Log.d(TAG, "showSurfaceView");if(mPreviewHeight > mDisplaySize.y){mPreviewHeight = mDisplaySize.y;}mSurfaceView.getHolder().setFixedSize(mPreviewWidth, mPreviewHeight);FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(mPreviewWidth , mPreviewHeight, Gravity.CENTER);lp.gravity = Gravity.TOP ;int left = (mDisplaySize.x - mPreviewWidth )/2;int top = (mDisplaySize.y - mPreviewHeight) /2;lp.setMargins(left, top, mDisplaySize.x, mDisplaySize.y);mSurfaceView.setLayoutParams(lp);mSurfaceView.setVisibility(View.VISIBLE);mIsVideoUI = false;}

3.Google search bar 和 search apps bar在横屏不显示
 

XXX设备在竖屏的情况下,google search bar 和search apps bar是正常显示,但是在转到横屏的情况不会显示不来。XXX 的home screen 和其他设备home screen 不一样的地方是,XXX 的home screen上有date time widget 并且google search bar 在底部. 当前修改都是基于GMS版本

横屏不显示google search bar原因

在/vendor/partner_gms/apps/SearchLauncher/quickstep/src/com/android/searchlauncher/HotseatQsbWidget.java 文件中有一段代码设置为横屏的时候不显示
 

@Overridepublic void setInsets(Rect insets) {setVisibility(mActivity.getDeviceProfile().isVerticalBarLayout() ? GONE : VISIBLE);MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams();mlp.topMargin = Math.round(Math.max(-mFixedTranslationY, insets.top - mMarginTopAdjusting));Rect padding = mActivity.getDeviceProfile().getHotseatLayoutPadding();setPaddingUnchecked(padding.left, 0, padding.right, 0);requestLayout();}

把上面红色代码改为:setVisibility(VISIBLE); google search bar和 search apps bar会显示出来,因为google search bar显示在home screen底部,所以会看不到,实际上是显示出来的. 如果想看google search bar 实际上有没有显示, 可以调整上面代码中的mlp.topMargin的值为负值,大概为-400.

使用google search bar 替换顶部的date widget

Home screen顶部的date widget代码在vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_workspace.xml文件中,代码如下:
 

<?xml version="1.0" encoding="utf-8"?>
<com.android.searchlauncher.SmartspaceQsbWidgetxmlns:android="http://schemas.android.com/apk/res/android"android:id="@id/search_container_workspace"android:layout_width="match_parent"android:layout_height="0dp"><fragmentandroid:name="com.android.searchlauncher.SmartspaceQsbWidget$SmartSpaceFragment"android:layout_width="match_parent"android:tag="smart_space_view"android:layout_height="match_parent"/></com.android.searchlauncher.SmartspaceQsbWidget>

把上面红色代码替换为vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_all_apps.xml 文件中的android:name="com.android.searchlauncher.HotseatQsbWidget$HotseatQsbFragment"则替换成功.

删除home screen 底部的google search bar

执行第二步的代码后在竖屏的情况下,会出现两个google search bar, z这个时候需要去掉底部的google search bar, home screen 底部google search bar 在vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_all_apps.xml 文件中.
 

<com.android.searchlauncher.HotseatQsbWidgetxmlns:android="http://schemas.android.com/apk/res/android"android:id="@id/search_container_all_apps"android:layout_width="match_parent"android:layout_height="56dp"android:layout_gravity="top|center_horizontal"android:translationY="28dp"><fragmentandroid:id="@+id/search_wrapper_view"android:name="com.android.searchlauncher.HotseatQsbWidget$HotseatQsbFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:tag="qsb_view"/><com.android.launcher3.ExtendedEditTextandroid:id="@+id/fallback_search_view"android:layout_width="match_parent"android:layout_height="@dimen/all_apps_search_bar_field_height"android:layout_gravity="center"android:layout_marginLeft="8dp"android:layout_marginRight="8dp"android:background="@drawable/bg_all_apps_searchbox"android:elevation="1dp"android:focusableInTouchMode="true"

把上面红色代码删除后,在竖屏情况下Hotseat距离底部有一段距离,需要调整。

调整竖屏Hotseat与底部的距离

调整竖屏情况下Hotseat与home screen底部的距离,更改packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java文件中hotseatBarBottomPaddingPx的值为0.
 

hotseatBarTopPaddingPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);hotseatBarBottomPaddingPx = (isTallDevice ? 0: res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_non_tall_padding))+ res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding);hotseatBarBottomPaddingPx = 0;hotseatBarSidePaddingEndPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding);// Add a bit of space between nav bar and hotseat in vertical bar layout.hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? verticalDragHandleSizePx : 0;hotseatBarSizePx = ResourceUtils.pxFromDp(inv.iconSize, dm) + (isVerticalBarLayout()? (hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx): (res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size)+ hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx));

调整hotseatBarBottomPaddingPx的值为0后,会出现workspace 中app icon上下之间的距离较大,需要更改updateWorkspacePadding

方法中的bottompadding的值.
 

private void updateWorkspacePadding() {Rect padding = workspacePadding;if (isVerticalBarLayout()) {padding.top = 0;padding.bottom = edgeMarginPx;if (isSeascape()) {padding.left = hotseatBarSizePx;padding.right = verticalDragHandleSizePx;} else {padding.left = verticalDragHandleSizePx;padding.right = hotseatBarSizePx;}} else {int paddingBottom = hotseatBarSizePx + verticalDragHandleSizePx- verticalDragHandleOverlapWorkspace;if (isTablet) {// Pad the left and right of the workspace to ensure consistent spacing// between all icons// The amount of screen space available for left/right padding.int availablePaddingX = Math.max(0, widthPx - ((inv.numColumns * cellWidthPx) +((inv.numColumns - 1) * cellWidthPx)));availablePaddingX = (int) Math.min(availablePaddingX,widthPx * MAX_HORIZONTAL_PADDING_PERCENT);int availablePaddingY = Math.max(0, heightPx - edgeMarginPx - paddingBottom- (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx- hotseatBarBottomPaddingPx);padding.set(availablePaddingX / 2, edgeMarginPx + availablePaddingY / 2,availablePaddingX / 2, paddingBottom + availablePaddingY / 2);} else {// Pad the top and bottom of the workspace with search/hotseat bar sizespadding.set(desiredWorkspaceLeftRightMarginPx,edgeMarginPx,desiredWorkspaceLeftRightMarginPx,paddingBottom);}}}

将红色代码改为 “int paddingBottom = hotseatBarSizePx;”, 更改之后如果还是较大,则需要增大paddingBottom的值.

修改mHotseatPadding的bottom的值为0.
 

public Rect getHotseatLayoutPadding() {if (isVerticalBarLayout()) {if (isSeascape()) {mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx,mInsets.top, hotseatBarSidePaddingEndPx, mInsets.bottom);} else {mHotseatPadding.set(hotseatBarSidePaddingEndPx, mInsets.top,mInsets.right + hotseatBarSidePaddingStartPx, mInsets.bottom);}} else {// We want the edges of the hotseat to line up with the edges of the workspace, but the// icons in the hotseat are a different size, and so don't line up perfectly. To account// for this, we pad the left and right of the hotseat with half of the difference of a// workspace cell vs a hotseat cell.float workspaceCellWidth = (float) widthPx / inv.numColumns;float hotseatCellWidth = (float) widthPx / inv.numHotseatIcons;int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);mHotseatPadding.set(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx,hotseatBarTopPaddingPx,hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx,hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx);}return mHotseatPadding;}

移除红色代码中的 hotseatBarBottomPaddingPx, 因为 mInsets.bottom和 cellLayoutBottomPaddingPx的值是0.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-03-索引

索引是提高MySQL查询性能的一个重要途径&#xff0c;但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用&#xff0c;从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引&#xff0c;因为事后可能需要监控大量的SQL才能定位到问题所在&#xff0c;而且添加索…

YB4556 28V、1A、单节、线性锂电池充电IC

YB4556 28V 、 1A 、单节、线性锂电池充电 IC 概述: YB4556H 是一款完整的采用恒定电流 / 恒定电压的高压、大电流、单节锂离子电池线性充电 IC。最高耐压可达 28V&#xff0c;6.5V 自动过压保护&#xff0c;充电电流可达 1A。由于采用了内部 PMOSFET 架构&#xff0c;加上防倒…

鸿蒙开发-ArkTS 语言-循环渲染

鸿蒙开发-ArkTS 语言-状态管理 4. 渲染控制 对于 UI 渲染&#xff0c;可以基于数据结构选择一些内置方法&#xff08;例如&#xff1a;ForEach&#xff09;快速渲染 UI 结构。 4.1 if-else条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使…

es6新特性总结

1、支持了let和const&#xff0c;为了防止var声明变量带来的变量提升 &#xff08;1&#xff09;、存在块级作用域不存在变量提升&#xff08;考虑暂时性死区&#xff09; &#xff08;2&#xff09;、不允许重复声明&#xff08;包括普通变量和函数参数&#xff09;变量提升…

软著项目推荐 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Shell编程基础 – 变量(Variables)

Shell编程基础 – 变量&#xff08;Variables&#xff09; Shell Scripting Essentials – Variables Bash变量作为shell脚本的重要组成部分&#xff0c;提供了在Unix/Linux命令行界面操作和保存数据的方法。 本文简要介绍Bash Shell脚本变量的基础知识以及应用&#xff0c;包…

python实现炫酷的屏幕保护程序!

今天写了桌面保护程序。先来看看效果吧。 完全可以作为屏保程序了&#xff0c;老方式&#xff1a;以下是实现的代码&#xff1a; from tkinter import *from time import strftime​def update_time():global i, j current_time strftime(%H:%M:%S)time_label.config(textcu…

android BSP 开发总结之三

1.把Android源码导入Android Studio进行调试 源码下载完成后&#xff0c;先编译。 如下sample, projects不同编译命令不同 $ source build/envsetup.sh $ lunch aosp_flounder-userdebug $ make -j8 ( 8代表CPU核数 ) 编译idegen这个项目&#xff0c;生成idegen.jar文件.…

arp报文及使用go实现

一、ARP协议报文格式及ARP表 ARP&#xff08;Address Resolution Protocal&#xff0c;地址解析协议&#xff09;是将IP地址解析为以太网的MAC地址&#xff08;或者称为物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其他网络设备有数据要发送给另一个主机或设备…

开源语音大语言模型来了!阿里基于Qwen-Chat提出Qwen-Audio!

论文链接&#xff1a;https://arxiv.org/pdf/2311.07919.pdf 开源代码&#xff1a;https://github.com/QwenLM/Qwen-Audio 引言 大型语言模型&#xff08;LLMs&#xff09;由于其良好的知识保留能力、复杂的推理和解决问题能力&#xff0c;在通用人工智能&#xff08;AGI&am…

现代图标集wxArtProvider发布 —— 发布于2023年11月21日

Perazz发布了wxMaterialDesignArtProvider&#xff0c;这是一个自定义的wxArtProvider类&#xff0c;从MaterialDesign、SimpleIcons、FontAwesome和FluentUI系统数据集中提供基于SVG的图标。所有这些数据集都有许可证&#xff08;MIT、CC BY 4.0、CC0 1.0、Apache 2.0&#xf…

打破障碍:2024年赋能企业人工智慧生成创新-5个应用场景与6个转型步骤

想要了解如何采用生成式AI来提高企业效率和竞争力&#xff1f;本指南将介绍如何采用生成式AI来实现数字化转型&#xff0c;并打造智能化商业模式。从5大应用场景和6大步骤切入&#xff0c;让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…

python 批量将图片存入excel单元格内

python 批量将图片存入excel单元格 示例代码1示例代码2 示例代码1 https://blog.csdn.net/wuyoudeyuer/article/details/128185284 # -*- coding: utf-8 -*- # Time : 2022-12-05 # Author : Carl_DJ 实现功能&#xff1a;在excel中&#xff0c;对应的名称后面&#xff0c;…

【spring(五)】SpringMvc总结 SSM整合流程

目录 一、SpringMVC简介&#xff1a; 二、SpringMVC快速入门&#xff1a; 三、SpringMVC bean的管理&#xff1a;⭐ ①配置bean ②扫描bean 四、SpringMVC配置类&#xff1a;⭐ 五、SpringMVC 请求与响应 六、SpringMVC REST风格 七、SSM整合 异常处理&#xff1a; 八、…

今日现货白银价要素分析

现货白银市场每天走势图上的K线&#xff0c;都是由开盘价、收盘价、最高价、最低价四个价格要素组成。K线作为一种特殊的市场语言&#xff0c;不同具体的形态有不同的含义&#xff0c;当收盘价高于开盘价就形成阳线&#xff0c;反之就形成阴线。 如果阳线出现在银价盘整或行情下…

位图的详细讲解

位运算操作符&#xff1a;或&#xff0c;与&#xff0c;异或&#xff0c;按位取反。 操作符 |两个中有一个是一则为一&两个都是一则为一^相同为零&#xff0c;不同为一~零变成一&#xff0c;一变成零 什么是位运算符: 位运算是直接对整型数据的二进制进行运算。 位图概念…

springsecurity6配置三

springsecurity配置多种登录方式,比如手机验证码登录、邮箱登录、微信小程序登录等,下面就以微信小程序登录为例进行讲解。 一、小程序用户实体实现springsecurity中的UserDetails接口 package com.school.information.core.security.entity;import com.alibaba.fastjson.a…

基于UI交互意图理解的异常检测方法

美团到店平台技术部/质量工程部与复旦大学周扬帆教授团队开展了科研合作&#xff0c;基于业务实际场景&#xff0c;自主研发了多模态UI交互意图识别模型以及配套的UI交互框架。 本文从大前端质量保障领域的痛点出发&#xff0c;介绍了UI交互意图识别的方法设计与实现。基于UI交…

告别百度网盘,搭建自己的专属网盘 ——Cloudreve,不限制下载速度!

Cloudreve 是一个用 Go 语言写的公有网盘程序,我们可以用它来快速搭建起自己的网盘服务,公有云 / 私有云都可。 顺哥博客 先来看看文档介绍吧。 支持多家云存储驱动的公有云文件系统. 演示站 • 讨论社区 • 文档 • 下载 • Telegram 群组 • 许可证 :sparkles: 特性 :cl…