Android 12 - 部分相机横屏显示方案

1.相机过渡界面方向旋转 

Android 10 - 相机过渡界面默认角度

同A10 有些区别,再次增加记录修改。

这个文件没有修改,只是说明
src/com/android/camera/CameraActivity.javaprivate void freezeScreenCommon(boolean async) {long startTime = System.currentTimeMillis();mCameraAppUI.setModeCoverState(1);mStartTime = startTime;if (mCurrentModule.isUseSurfaceView()) {Bitmap screenShot = getSurfaceViewBitmap();if (screenShot == null) {freezeScreenUntilPreviewReady();//SPRD:fix bug1116034} else {//CameraUtil.saveBitmapToFile(screenShot);// 经过注释验证,将下面的两个方法注释,就不会显示过渡画面screenShot = CameraUtil.blurBitmap(CameraUtil.computeScale(screenShot, 0.2f), mAppContext);mCameraAppUI.freezeScreenUntilPreviewReady(screenShot, async);}} else {freezeScreenUntilPreviewReady(async);}Log.i(TAG, "freezeScreenCommon cost: " + (System.currentTimeMillis() - startTime));}
src/com/android/camera/util/CameraUtil.java// 旋转 Bitmap 的辅助方法
private static Bitmap rotateBitmap(Bitmap source, float angle) {if (source == null) {return null;}Log.d(TAG, "Original width: " + source.getWidth() + ", height: " + source.getHeight());Matrix matrix = new Matrix();matrix.postRotate(angle);Bitmap rotatedBitmap = Bitmap.createBitmap(source,0, 0,source.getWidth(),source.getHeight(),matrix,true);// 打印旋转后图片宽高Log.d(TAG, "Rotated width: " + rotatedBitmap.getWidth() + ", height: " + rotatedBitmap.getHeight());return rotatedBitmap;
}public static Bitmap blurBitmap(Bitmap bitmap, Context context) {if (bitmap == null) {return null;}long startMs = System.currentTimeMillis();// 这里是新增加的方法,实现过渡画面的角度,当前项目旋转90度即可bitmap = rotateBitmap(bitmap, 90);// Instantiate a new RenderscriptRenderScript rs = RenderScript.create(context);
src/com/android/camera/app/CameraAppUI.javapublic void freezeScreenUntilPreviewReady(Bitmap bitmap, boolean async) {Log.v(TAG, "freezeScreenUntilPreviewReady bitmap=" + bitmap + "; async=" + async + " getPreviewArea :" + getPreviewAreaLocal());// lichang 修改原有获取预览区域方法为自行获取,原尺寸异常freezeScreen(bitmap, getPreviewAreaLocal(), async);}/*** 根据宽高比获取预览区域*/public RectF getPreviewAreaLocal() {Log.v(TAG, "getPreviewAreaLocal getAspectRation() = " + getAspectRation());float previewWidth = 960f;float screenWidth = 1280f;float aspectRation = getAspectRation();float epsilon = 0.001f; // 允许的误差范围if (Math.abs(aspectRation - (4f / 3f)) < epsilon) {// 4:3 比例(≈1.333)previewWidth = 960f;} else if (Math.abs(aspectRation - (16f / 9f)) < epsilon) {// 16:9 比例(≈1.777)previewWidth = 1280f;} else {// 其他比例,默认值或错误处理previewWidth = 1280f; // 或 throw new IllegalArgumentException("Unsupported aspect ratio");}float left = (screenWidth - previewWidth) / 2f;Log.v(TAG, "getPreviewAreaLocal left = " + left + " right = " + left + previewWidth);return new RectF(left, 0f, left + previewWidth, 720f);}// 新增方法public float getAspectRation() {return mTextureViewHelper.getAspectRation();}
src/com/android/camera/TextureViewHelper.javapublic void setAspectRation(float aspectRation) {mAspectRatio = aspectRation;}// 新增方法,获取当前宽高比public float getAspectRation() {return mAspectRatio;}

2.相机图标位置居中

+++ b/src/com/android/camera/ui/ModeTransitionView.java
@@ -143,6 +143,7 @@ public class ModeTransitionView extends View {mIconDrawable.setAlpha(alpha);}}
+           Log.e(TAG, " updateShade mWidth = " + mWidth + " mHeight = " + mHeight);invalidate();}}
@@ -172,6 +173,7 @@ public class ModeTransitionView extends View {@Overridepublic void onDraw(Canvas canvas) {
+       Log.e(TAG, " lichang  onDraw ");if (mAnimationType == PEEP_HOLE_ANIMATION) {canvas.drawColor(mBackgroundColor);if (mPeepHoleAnimator != null) {
@@ -227,8 +229,9 @@ public class ModeTransitionView extends View {mWidth = displaySize.getWidth();mHeight = displaySize.getHeight();boolean landscape = mWidth > mHeight;
-        int centerW = landscape ? mHeight : mWidth;
-        int centerH = landscape ? mWidth : mHeight;
+       // lichang 横屏也不需要调换位置,修改打开相机显示的图标位置
+        int centerW = !landscape ? mHeight : mWidth;
+        int centerH = !landscape ? mWidth : mHeight;if (CameraUtil.hasCutout()) {centerH -= CameraUtil.getCutoutHeight();

3.预览画面居中

默认4:3,显示的预览画面偏移,需要重新计算位置。

+++ b/src/com/android/camera/SurfaceViewEx.java
@@ -19,6 +19,8 @@package com.android.camera;+import android.util.DisplayMetrics;
+import android.view.WindowManager;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;
@@ -165,8 +167,16 @@ public class SurfaceViewEx extends SurfaceView {params.height = (int) scaledTextureHeight;RectF rect = mCameraAppUI.getPreviewArea();// horizontal direction
-                    params.setMargins((int) rect.left, (int) rect.top, 0, 0);
-
+                    //params.setMargins((int) rect.left, (int) rect.top, 0, 0);
+                   // lichang 将预览画面居中
+                   /*@start*/
+                   DisplayMetrics displayMetrics = new DisplayMetrics();
+                    ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);
+                    int screenWidth = displayMetrics.widthPixels;
+                    int screenHeight = displayMetrics.heightPixels;
+                    Log.i(TAG, "setTransformMatrix(): screenWidth = " + screenWidth + " screenHeight = " + screenHeight);
+                   params.setMargins((int) (screenWidth - scaledTextureWidth) / 2, (int) (screenHeight - scaledTextureHeight) / 2, 0, 0);
+                   /*end*/setLayoutParams(params);Log.i(TAG, "setTransformMatrix(): width = " + previewWidth

 

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

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

相关文章

Operation Blackout 2025 Phantom Check hayabusa+ControlSet001+VirtualBox

QAQA攻击者使用哪个 WMI 类来检索型号和制造商信息以进行虚拟化检测&#xff1f;Win32_ComputerSystem攻击者执行了哪个 WMI 查询来检索计算机的当前温度值&#xff1f;SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature攻击者加载了 PowerShell 脚本以检测虚拟化…

《O-PAS™标准的安全方法》白皮书:为工业自动化系统筑起安全防线

The Open Group 最新白皮书《O-PAS™标准的安全方法》重磅发布&#xff0c;为流程工业在迈向开放架构与多供应商互操作的过程中&#xff0c;指明了安全实践的方向。O-PAS™标准的安全方法ABOUT PUBLICATION亮点一&#xff1a;首次系统阐释 O-PAS™ 标准安全方法与 IEC/ISA 6244…

UML 图类型全解析:结构图与行为图分类详解

作为软件架构的核心建模语言&#xff0c;UML&#xff08;统一建模语言&#xff09;通过14种标准图表提供系统多维度视角。这些图表分为结构图&#xff08;静态模型&#xff09; 和 行为图&#xff08;动态模型&#xff09; 两大类&#xff0c;覆盖从需求到实现的完整生命周期。…

lodash不支持 Tree Shaking 而 lodash-es可以

lodash 无法有效支持 Tree Shaking 而 lodash-es 可以&#xff0c;核心区别在于‌模块规范、文件结构和静态分析兼容性‌。以下是具体原因分析&#xff1a; ⚙️ 一、模块规范差异&#xff08;核心原因&#xff09; lodash&#xff08;CommonJS 规范&#xff09;‌ 使用 requir…

java+vue+SpringBoo高校实习信息发布网站(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.8 数…

uniApp实战五:自定义组件实现便捷选择

文章目录1.最终效果预览2.快速选择组件封装3.弹框组件封装4.组件逻辑实现5.组件样式6.页面引入1.最终效果预览 2.快速选择组件封装 <uv-cell :border"isShowBorder"><template v-slot:title><text class"title-key">{{ title }}</te…

AI在垂直领域的深度应用:医疗、金融与自动驾驶的革新之路

AI在垂直领域的深度应用:医疗、金融与自动驾驶的革新之路 一、医疗领域:AI驱动的精准诊疗与效率提升 1. 医学影像诊断 AI算法通过深度学习技术,已实现对X光、CT、MRI等影像的快速分析,辅助医生检测癌症、骨折等疾病。例如,Google DeepMind的AI系统在乳腺癌筛查中,误检率…

模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》

性能调优&#xff1a;Profile驱动优化与汇编级分析实战&#xff1a;优化矩阵乘法至SSE/AVX指令集&#xff08;终极加强版&#xff09;一、性能瓶颈的全链路诊断&#xff08;深度扩展&#xff09;1.1 硬件性能计数器的极致利用PMU事件深度定制&#xff1a;# 捕获L1缓存事件与分支…

二刷 黑马点评 商户查询缓存

缓存 数据交换的缓冲区&#xff0c;俗称的缓存是缓冲区内的数据&#xff0c;一般从数据库中获取&#xff0c; 例1:Static final ConcurrentHashMap<K,V> map new ConcurrentHashMap<>(); 本地用于高并发例2:static final Cache<K,V> USER_CACHE CacheBuild…

【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化

效果 现代网页弹窗开发指南&#xff1a;从基础到优化 弹窗&#xff08;Modal&#xff09;作为网页交互的重要组件&#xff0c;在用户通知、确认操作和表单输入等场景中广泛应用。本文将循序渐进地讲解弹窗的技术实现与最佳实践。 一、弹窗基础概念 弹窗是一种覆盖在主内容之…

【操作系统】线程

JavaEE—线程 一、进程与线程 1.包含管理 2.资源布局 2.1公共资源 2.2私有资源 二、并发编程 1.多线程优势 1.1创建 1.1.1多线程 1.1.2多进程 1.2通信 1.2.1多线程 1.2.2多进程 1.3调度 1.3.1多线程 1.3.2多进程 1.4销毁 1.4.1多线程 1.4.2多进程 2.多进程…

React 自定义Hook——页面或元素滚动到底部监听 Hook

功能简介 useReachBottom 是一个 React 自定义 Hook&#xff0c;支持监听页面&#xff08;body&#xff09;或任意可滚动元素&#xff08;如 div&#xff09;是否滚动到底部。它能帮助你在用户滑动到底部时触发加载更多、显示提示等操作&#xff0c;极大提升前端交互体验。 亮…

当Powerbi遇到quickbi,性能优化方式对比

powerbi性能优化对于powerbi&#xff0c;性能优化可以从15个方面考虑&#xff1a; 1.过滤源数据【quickbi数据集过滤或sql过滤】2.删除无关列 【quickbi不选字段或sql不查询】3.聚合分析粒度 【quickbi使用sql聚合或计算字段聚合】4.整理字段 【quickbi使用sql聚合或计算字段聚…

ValueConverter转换器WPF

属性搭桥 比如BoolToVisibility 创建两个属性 Bool Visibility 这样不好 混乱了viewmodels 降低了泛用性系统自带的convertor <Window.Resources><BooleanToVisibilityConverter x:Key"booltovis"></BooleanToVisibilityConverter><…

Qt数据库编程详解:SQLite实战指南

Qt数据库编程详解&#xff1a;SQLite实战指南 目录 SQLite数据库简介Qt数据库核心类数据库操作全流程CRUD操作实战运行效果展示 1. SQLite数据库简介 SQLite是Qt内置的轻量级嵌入式数据库&#xff1a; #mermaid-svg-OiZ2cgq9n1G69iH5 {font-family:"trebuchet ms",…

FastAPI 与 OpenIddict 的微服务鉴权整合方案

架构概述基于微服务的身份认证架构采用OAuth 2.0/OpenID Connect协议&#xff0c;OpenIddict作为认证服务器&#xff0c;FastAPI作为资源服务器。系统包含三个核心组件&#xff1a;认证服务、API网关和业务微服务。OpenIddict负责颁发令牌&#xff0c;FastAPI通过JWT验证访问权…

计算两个点的欧式距离

目录 一、概述 二、公式 1、二维空间 2、三维空间 3、n 维空间 三、python实现 一、概述 欧式距离&#xff08;Euclidean Distance&#xff09;是一种在欧几里得空间中度量两个点之间距离的常用方法&#xff0c;其公式根据空间维度的不同而不同 二、公式 1、二维空间 对于二…

八股训练--RabbitMQ

一、经典问题 1.为什么要用MQ&#xff1f; MQ的作用主要是3个&#xff0c; 第一个是流量削峰&#xff1a;当某个活动举行时&#xff0c;访问量可能是平时的几百倍&#xff0c;可能一下会把服务器弄崩溃&#xff0c;所以通过MQ的形式&#xff0c;引入中间者&#xff0c;客户端…

Elasticsearch 文档检索系统

学习笔记&#xff1a;Elasticsearch 文档检索系统 1. 技术栈与核心组件 Node.js&#xff1a;后端运行环境&#xff0c;适合构建高性能 Web 服务。Express&#xff1a;Node.js 的 Web 框架&#xff0c;简化 API 开发。Elasticsearch&#xff1a;分布式全文检索引擎&#xff0c;支…

如何准确查看服务器网络的利用率?

在服务器运维与性能调优过程中&#xff0c;网络利用率是一个不容忽视的关键指标。它反映了服务器带宽资源的实际使用情况&#xff0c;是判断系统瓶颈、规划资源扩展、排查连接问题的重要依据。很多人误以为网络是否正常只要“能上网”或“Ping得通”就可以了&#xff0c;实际上…