gpt4 book ai didi

Android 屏幕方向因设备而异

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:55:47 24 4
gpt4 key购买 nike

描述

我有一个在表面 View 上显示相机预览的 Activity 。我不希望它在方向更改时重新启动(因为它不断扫描二维码),因此方向锁定为纵向。

我遇到的问题是我需要在屏幕底部向用户显示屏幕说明。鉴于屏幕锁定在一个方向,我没有收到新方向的通知,因为 Activity 没有重绘。因此,无论手机是竖屏、倒置竖屏、横屏还是正横屏,说明都呈现在同一个地方。

为了解决这个问题,我连接到传感器管理器以实时读取方向。 (见下面的代码)在阅读它之后,我自己制定了方向,并在每次更新发送给我时根据需要移动我的说明。到目前为止,这对我一直有效,直到最近。在华硕 Transformer Prime 和 Xoom 平板电脑上进行测试时。平板电脑将纵向方向返回为“90”​​,而不是像我其他 2 部手机那样的“0”。因此,正如您在下面的代码中看到的那样,我检查平板电脑(大屏幕)并减去额外的 90 度。

问题

问题是新的 Nexus 7 平板电脑没有这种额外的偏差。在纵向模式下,它返回“0”,但我将其检测为平板电脑,因此负 90 度,因此结果为 270,它放置我的指令,就好像平板电脑处于横向模式一样。我假设这背后的原因是 Xoom/Transformer 设计用于横向,而 Nexus 用于纵向,但除非我知道所有受影响的设备,否则这无济于事。

问题

是否有一种可靠的方法来检测所有设备的方向并“实时”返回结果,如下面的代码所示,但考虑到设备的默认方向(即手机 + Nexus 7 是纵向的,但大多数平板电脑都是横向的)?

当前代码

    boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
isTablet = large || xlarge;
myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL)
{

@Override
public void onOrientationChanged(int orientation)
{
if (orientation == -1)
{
return;
}

if (isTablet)
{
orientation += -90;
if (orientation < 0) // keep the result between 0-360
{
orientation += 360;
}
}

// Work out the orientation

if (orientation >= 60 && orientation <= 140)
{
screenOrientation = ScreenOrientation.Landscape_Reversed;
}
else if (orientation >= 140 && orientation <= 220)
{
screenOrientation = ScreenOrientation.Portrait_Reversed;
}
else if (orientation >= 220 && orientation <= 300)
{
screenOrientation = ScreenOrientation.Landscape;
}
else
{
screenOrientation = ScreenOrientation.Portrait;
}

//... Do stuff with new orientation here
}
};

最佳答案

修复了

替换代码

        if (isTablet)
{
orientation += -90;
if (orientation < 0) // keep the result between 0-360
{
orientation += 360;
}
}

随着以下内容

            //Check "normal" screen orientation and adjust accordingly
int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if (naturalOrientation == Surface.ROTATION_0)
{
Logging.d(TAG, "Rotation ROTATION_0");
}
else if (naturalOrientation == Surface.ROTATION_90)
{
Logging.d(TAG, "Rotation ROTATION_90");
orientation += 90;
}
else if (naturalOrientation == Surface.ROTATION_180)
{
Logging.d(TAG, "Rotation ROTATION_180");
orientation += 180;
}
else if (naturalOrientation == Surface.ROTATION_270)
{
Logging.d(TAG, "Rotation ROTATION_270");
orientation += 270;
}

if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360
{
orientation -= 360;
}

关于Android 屏幕方向因设备而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com