Android 11 裁剪系统显示区域(适配异形屏)

本文介绍了OverScan技术在显示技术中的作用,特别是在Android设备中的应用。重点讲述了wmoverscan命令的引入、使用方法以及在Android11中被弃用的情况。
摘要由CSDN通过智能技术生成

在这里插入图片描述

概述

     在显示技术中,"OverScan"(超扫描)是一种调整显示图像边界的技术。通常情况下,OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性,尤其是在老式电视或投影仪等设备上,可能存在图像边缘出现失真或过多噪点的问题。

OverScan 通过裁剪图像边缘,可以隐藏显示器边缘的任何不完美之处,例如边缘上的噪点、失真或黑边。这有助于确保图像在屏幕上的边缘部分看起来整洁且不受干扰,提供更好的观看体验。

在一些情况下,OverScan 可能会在数字信号传输或视频播放过程中引入一些不必要的图像变形或丢失,因此在现代高清电视和显示器上,OverScan 往往是可以调整或关闭的选项。

如何裁剪

  1. Android 系统的 wm overscan
    wm overscan 命令是在 Android 4.2 Jelly Bean 版本中引入的,并且一直存在于后续的 Android 版本中。因此,从 Android 4.2 Jelly Bean 开始,就支持使用这个命令来调整屏幕的 OverScan 设置。
    在 Android 中,“wm overscan” 是一个命令行工具,用于在设备上调整屏幕的 OverScan 设置。OverScan 调整可以在某些情况下用于调整显示的边缘,以确保图像完全填充整个屏幕,或者调整图像边缘以隐藏可能存在的不完美之处。

    使用:

    adb shell wm overscan left,top,right,bottom
    

    这里的 left、top、right 和 bottom 是指要应用的 OverScan 调整的像素数,分别对应屏幕的左边、顶部、右边和底部。
    需要注意的是,使用这个命令可能会对屏幕显示产生意想不到的影响,因此在使用之前请确保了解你的设备支持的功能以及如何正确地使用它。

    实际效果:
    在这里插入图片描述

    wm overscan 300,0,300,0
    在这里插入图片描述

  2. 可惜的是:在 Android 11 中,“wm overscan” 命令已经被弃用,不再建议使用。 一种简单粗暴的改法:

diff --git a/frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java b/frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java
index 5cd9b4d7a5..751c42d98d 100644
--- a/frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -371,7 +371,7 @@ final class LogicalDisplay {
             // getSafeInsets is fixed at creation time and cannot change
             return deviceInfo.displayCutout.getSafeInsets();
         } else {
-            return new Rect();
+            return new Rect(0, 0, 1920, 544);//1080 - 536 = 544
         }
     }

在这里插入图片描述

参考

Android wm命令
通过 Tasker 实现「wm overscan」命令 [No Root]

好的,以下是一个实现视频裁剪适配幕大小的示例方法: ```java public static void cropAndFitToScreen(String videoPath, TextureView textureView) { MediaPlayer mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(videoPath); mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); return; } int videoWidth = mediaPlayer.getVideoWidth(); int videoHeight = mediaPlayer.getVideoHeight(); float videoAspectRatio = (float) videoWidth / (float) videoHeight; int viewWidth = textureView.getWidth(); int viewHeight = textureView.getHeight(); float viewAspectRatio = (float) viewWidth / (float) viewHeight; // Calculate the crop width and height to maintain video aspect ratio int cropWidth, cropHeight; if (videoAspectRatio > viewAspectRatio) { cropWidth = (int) (videoHeight * viewAspectRatio); cropHeight = videoHeight; } else { cropWidth = videoWidth; cropHeight = (int) (videoWidth / viewAspectRatio); } // Calculate the crop position int cropX = (videoWidth - cropWidth) / 2; int cropY = (videoHeight - cropHeight) / 2; // Set up the texture view textureView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); surfaceTexture.setDefaultBufferSize(videoWidth, videoHeight); Surface surface = new Surface(surfaceTexture); // Set up the media player with the cropped video surface mediaPlayer.setSurface(surface); mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); mediaPlayer.setVideoCrop(cropX, cropY, cropWidth, cropHeight); // Start the video playback mediaPlayer.start(); } ``` 这个方法首先创建了一个MediaPlayer对象,并设置其数据源为视频文件路径。然后,它获取视频的宽度和高度,并计算出视频的宽高比。接下来,它获取TextureView的宽度和高度,并计算出TextureView的宽高比。然后,它根据视频和TextureView的宽高比,计算出裁剪后的视频宽度、高度和位置。最后,它设置TextureView的布局参数,创建一个SurfaceTexture对象,并将其作为渲染目标传递给MediaPlayer。 这个示例方法可以让你裁剪视频并适配到TextureView上,但你需要在调用这个方法之前确保TextureView已经被正确地添加到布局中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值