我正在建立专门针对移动设备的网站.特别是有一个页面,最好以横向模式查看.
有没有办法检测访问该页面的用户是否在纵向模式下查看它,如果是,则显示一条消息,通知用户该页面最好以横向模式查看?如果用户已在横向模式下查看,则不会显示任何消息.
所以基本上,我希望网站检测视口方向,如果方向是纵向,则显示警告消息,告知用户该页面在横向模式下最佳查看.
非常感谢,Dan
我一直试图让我的头围绕Android方向传感器一段时间.我以为我明白了.然后我意识到我没有.现在我想(希望)我对它有更好的感觉,但我仍然不是100%.我将尝试解释我对它的不完整理解,并希望如果我在部分错误或填写任何空白,人们将能够纠正我.
我想我的经度是0度(本初子午线)和纬度0度(赤道).这个位置实际上位于非洲海岸附近的海域,但请耐心等待.我把手机放在我面前,这样手机的底部指向我的脚; 我面向北方(朝向格林威治),因此电话的右侧指向东方向非洲.在这个方向(参考下图)我的X轴指向东方,Z轴指向南方,Y轴指向天空.
现在,手机上的传感器可以让您在这种情况下计算设备的方向(而不是位置).这部分总是让我感到困惑,可能是因为我想在我接受它确实有效之前理解它是如何工作的.看起来这款手机采用了两种不同技术的组合来确定其方向.
在我做到这一点之前,想象一下,回到原来在上面提到的方向上经纬度为0度的那片想象中的土地上.想象一下,你被蒙住眼睛,你的鞋子固定在游乐场环形交叉路口.如果有人在后面推你,你会向前(向北)前进,然后伸出双手来打破你的摔倒.同样地,如果有人将你的左肩推开,你的右手就会摔倒.你的内耳有"引力传感器" (youtube clip),它可以让你检测你是向前/向后,向左/向下或向下(向上!!).因此,人类可以检测与手机相同的X和Z轴周围的对齐和旋转.
现在想象有人现在在环形交叉口旋转90度,这样你现在面向东方.您正在围绕Y轴旋转.这个轴是不同的,因为我们无法在生物学上检测它.我们知道我们有一定的角度,但我们不知道与行星的磁北极有关的方向.相反,我们需要使用外部工具......磁罗盘.这使我们能够确定我们面临的方向.我们的手机也是如此.
现在这款手机还配备了3轴加速度计.我不知道它们是如何工作的,但我想象它的方式是将重力想象为从天空中落下的恒定和均匀的"雨"并想象上图中的轴作为可以检测流过的雨量的管.当手机直立时,所有下雨都会流过Y'管.如果手机逐渐旋转使其屏幕朝向天空,流过Y的雨量将减少到零,而通过Z的量将稳定增加,直到最大雨量流过.同样,如果我们现在将手机放在侧面,X管将最终收集最大量的雨水.因此,根据手机的方向,通过测量流过3管的雨量,您可以计算方向.
这款手机还有一个电子罗盘,其行为类似于普通罗盘 - 它的"虚拟针"指向磁北.的Android合并来自这两个传感器的信息,以使得每当一个SensorEvent
的TYPE_ORIENTATION
产生values[3]
阵列具有
值[0]:方位角- (磁北的罗盘方位东)
的值[1]:节距,绕x轴旋转(是电话向前或向后倾斜)
值[2]:滚动,围绕y轴旋转(手机在其左侧或右侧倾斜)
所以我认为(即我不知道)Android给出方位角(罗盘方位)的原因而不是第三个加速度计的读数是指南针轴承更有用.我不确定为什么他们不赞成这种类型的传感器,因为现在看来你需要在系统中为SensorEvent
s类型注册一个监听器TYPE_MAGNETIC_FIELD
.value[]
需要将事件的数组转换为SensorManger.getRotationMatrix(..)
方法以获得旋转矩阵(见下文),然后将其传递给SensorManager.getOrientation(..)
方法.有谁知道为什么Android团队弃用了Sensor.TYPE_ORIENTATION
?这是一种效率的东西吗?这是对类似问题的评论中隐含的内容,但您仍需要在development/samples/Compass/src/com/example/android/compass/CompassActivity.java示例中注册不同类型的侦听器.
我现在想谈谈旋转矩阵.(这是我最不确定的地方)所以上面我们有Android文档中的三个数字,我们称之为A,B和C.
A = SensorManger.getRotationMatrix(..)方法图并表示World的坐标系
C = SensorManager.getOrientation(..)方法图
所以我的理解是A代表"世界的坐标系",我认为它指的是地球上的位置作为(纬度,经度)夫妇与可选的(海拔)给出的方式.X是"东向"坐标,Y是"北向"坐标.Z指向天空并代表高度.
电话协调系统如图B所示是固定的.它的Y轴总是指向顶部.旋转矩阵由电话不断计算,并允许两者之间的映射.所以我认为旋转矩阵将B的坐标系转换为C是正确的吗?因此,当您调用SensorManager.getOrientation(..)
方法时,您使用values[]
具有与图C对应的值的数组.当手机指向天空时,旋转矩阵是单位矩阵(矩阵数学等价于1),这意味着当设备对齐时不需要映射与世界的坐标系统.
好.我想我现在最好停下来.就像我之前说的那样,我希望人们能告诉我在哪里搞砸了或帮助了人们(或者让人们更加困惑!)
android orientation bearing device-orientation compass-geolocation
由于我的应用得到了所有方向的支持.我想只将肖像模式锁定到特定的UIViewController.
(例如,假设它是Tabbed应用程序,当SignIn View以模态方式出现时,我只想将SignIn View设置为纵向模式,无论用户如何旋转设备或当前设备方向如何)
我在这里使用Twitter Bootstrap构建了一个响应式站点:http://zarin.me/cce/
响应式设计在iPad和iPhone上运行良好,但是当我将设备从纵向翻转到横向时,网站会放大而不是适应屏幕(捏屏幕工作).
我错过了什么?这是一个视口问题吗?这是我在我的唯一视口代码:
<meta content="width=device-width, initial-scale=1.0" name="viewport">
Run Code Online (Sandbox Code Playgroud)
提前致谢!
viewport orientation screen-orientation device-orientation responsive-design
这个问题是关于UINavigationController中的iOS设备旋转和多个受控视图.有些观点应该限制为纵向,有些观点应该自由旋转.如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常令人讨厌的怪癖.然而,这个场景非常简单,所以我想我要么没有正确地进行自动旋转实施,要么就是忘了什么.
我有一个非常基本的演示应用程序,显示了怪异,我制作了一个视频显示它在行动.
设置非常基本:调用三个视图控制器FirstViewController
,SecondViewController
并且ThirdViewController
所有扩展AbstractViewController
显示带有类名称的标签,并且shouldAutorotateToInterfaceOrientation:
当设备处于纵向时返回YES .SecondViewController重写此方法以允许所有旋转.所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/关闭来在视图之间导航UINavigationController
.到目前为止,我想说的是一个非常简单的场景.
如果您以纵向或横向方向握住设备,这是我不仅希望实现的结果,而且还期望.在第一张图片中,您会看到所有视图都是"直立",而在第二张图片中,您会看到只有第二个视图控制器反转设备的方向.要清楚,应该可以从横向模式的第二个视图导航到第三个视图,但因为第三个视图仅支持纵向方向,所以它应该只能以纵向显示.查看结果是否正常的最简单方法是查看载体条的位置.
但这个问题在这里是因为实际结果完全不同.根据您在旋转设备时所处的视图,并根据您导航到下一个视图,视图将不会旋转(具体而言,didOrientFromInterfaceOrientation:
永远不会调用该方法).如果你在第二个横向并且导航到第三个,它将具有与第二个相同的方向(=坏).但是,如果您从第二个导航回到第一个,则屏幕将旋转为"强制"纵向模式,并且载波条将位于设备的物理顶部,无论您如何握住它.视频更详细地显示了这一点.
我的问题是双重的:
干杯,EP.
编辑:作为奖励之前的最后一招,我完全重写了这个问题,使其更短,更清晰,并希望更有吸引力给出答案.
cocoa-touch objective-c uiviewcontroller uinavigationcontroller device-orientation
在我的一个页面上,我需要将屏幕设置为横向模式并将其锁定,使其无法旋转为纵向模式,而只能在一页上旋转.因此需要一种即时启用此功能的方法.有人知道怎么做吗?
我希望它可以向左旋转或向右旋转,而不是纵向模式.
if UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) {
print("landscape")
}
if UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation){
print("portrait")
}
Run Code Online (Sandbox Code Playgroud)
如何检查它的横向是左还是右?
从...开始...
\nwindow.addEventListener("deviceorientation", handleDeviceTilt);\nfunction handleDeviceTilt(event){\n// Here we can use event.beta, event.gamma\n// Note that we don\'t need event.alpha because that\'s just the compass as we\n// don\'t need to know which way is north to build a simple bubble-level app\n// or similar apps.\n}\n
Run Code Online (Sandbox Code Playgroud)\n...在这种情况下,只要手机或平板电脑与地面平行(就像放在桌子上),值就很好并且可用beta
。gamma
但是,当手机或平板电脑与墙壁平行时,我们无法获得实际值。gamma
当设备直立/垂直(即纵向模式)(这是持有移动设备的最常见方式)时,会变得尤其疯狂。
我们需要计算真实的角度,以便我们可以在应用程序中准确地使用倾斜信息。问题是,
\n\n\n为了解锁所谓的 \ngimbal 锁,计算真实角度(例如
\nrealBeta
andrealGamma
)(可能通过使用Math.cos()
and\n或其他方法)的最简单方法是什么?Math.sin()
这可以在没有矩阵和/或四元数的情况下完成吗?我的猜测是“是”,因为伽玛的“扭曲度”在某种程度上与贝塔成正比。如果四元数是唯一的解决方案那么我们到底如何获得realGamma
或actualGamma
使用fixedCorrectGamma
它们?
注1:PlayStore上有一个水平仪应用程序,可以完美地显示设备的真实倾斜角度。所以有证据表明这是可行的。然而,截至 2021 …
当我通过MediaRecorder录制视频时,它始终以横向模式录制,无论实际的设备方向如何.如何强制MediaRecorder/Camera使用真正的方向?
在横向模式下启动时,无法为我的iPad应用程序获取正确的界限.我在Info.plist文件中设置了正确的键,我的视图控制器在横向(和纵向,自然)中正确启动.
在我的applicationDidFinishLaunching:
方法中,我在3秒延迟后调用选择器,并且该方法调用[[UIScreen mainScreen] applicationFrame]
,但它返回一个纵向框架(即高度>宽度).
有谁知道如何解决这一问题?它闻起来像是一个臭虫(如果是这样我将提交雷达),但如果它是预期的行为,它在哪里记录?
android ×2
cocoa-touch ×2
javascript ×2
orientation ×2
swift ×2
viewport ×2
bearing ×1
flutter ×1
ios ×1
ipad ×1
iphone ×1
jquery ×1
mobile ×1
objective-c ×1
portrait ×1
uikit ×1