1

アプリをマルチスクリーン (フレックス モバイル) にしています。基本的に、タブレットやスマートフォンをいつ扱っているかを知りたいです。そのため、画面サイズをインチで知りたいです。私はこれを Desire HD (4.3 インチ) でテストしています。私の問題: Capabilities.screenDPI を使用すると、エミュレーターは正しい値 (217) を表示しますが、これをデバイスで実行すると、間違った DPI 値 (240) が表示されます。幅と高さは正しいです。そのdpiに基づいて、インチで間違った画面サイズを取得します(3.887 "!= 4.3")。エミュレーターでは、すべて正常に動作します。デバイス エミュレーターは正しい値で構成されていますが、実際のデバイス (エミュレーターなし) で実行した場合にのみ、間違った DPI 値が取得されます。

次のコードで計算しています。

var screenX:Number = stage.stageWidth;
var screenY:Number = stage.stageHeight;
var pixels:Number = (screenX*screenX) + (screenY*screenY);
var screenSize:Number = Math.sqrt(pixels)/Capabilities.screenDPI;

return (screenSize >= 6) ? "tablet" : "phone" 

時間を割くために、Desire HD の値を示します。

480 x 800 ピクセル、4.3 インチ (~217 ppi ピクセル密度)

使用される式は単純です ~ ピタゴラス: a2 + b2 = c2 -> sqrt(c)/dpi = 画面サイズ (インチ)。

Adobe に基づいて、DPI または PPI 値は「互換的に」使用できます。(アドビ、ヘルプ)。dpi 値が ppi 値と異なる情報や、flex で ppi プロパティを使用できる可能性がある情報は見つかりませんでした。

したがって、実際のデバイスでは次のようになります。

480 x 800 ピクセル、3.89 インチ (~240 dpi)。

別の注意: flex モバイルには 3 つの既定の定数があることがわかりました。これらのいずれかに直接スローされる可能性がありますか?(私は Capabilities.screenDPI を直接呼び出しているので、そうは思いません)。

DPIClassification.DPI_160
DPIClassification.DPI_240
DPIClassification.DPI_320

私が言いたいのは、(別のレイアウトに切り替えるために) タブレットかスマートフォンかをどのように判断できるかということです。applicationDPISamsung Galaxy S3 (1280x720、319 PPI) や Apple iPad 3 (2048×1536、264 PPI) などの新しいデバイスと混同されているため、道をたどることはできません。

4

4 に答える 4

4

エミュレータ モードで画面サイズを検出するには、次のように SystemManager オブジェクトを使用できます。

var root:DisplayObject = SystemManager.getSWFRoot(this); // this is any object of the application not only display object
screenX = root.stage.fullScreenWidth;
screenY = root.stage.fullScreenHeight;
于 2012-11-23T08:55:08.127 に答える
1

これが古いスレッドであることは知っていますが、皆さんは私がどのように処理したかを知りたいと思っていると思いました.最終的に修正しました.

protected function resizeHandler(event:ResizeEvent):void
            {
                var screenX:Number = Capabilities.screenResolutionX;
                var screenY:Number = Capabilities.screenResolutionY;
                var osType:String = Capabilities.os;
                var limitNumber:Number = 960;
                var pixelCheck:Number = screenX * screenY;
                var pixels:Number = (screenX*screenX) + (screenY*screenY);
                var screenSize:Number = Math.sqrt(pixels)/Capabilities.screenDPI;

                isPortrait = height > width;
                //isTablet = screenX > limitNumber || screenY > limitNumber;
                isTablet = screenSize >= 6;
                var isDesktop:Boolean = height > limitNumber || width > limitNumber;

                if (osType.toUpperCase() == "WINDOWS 7"){
                    this.currentState = (isPortrait ? "portrait" : "landscape") + (isDesktop ? "Tablet" : "Phone");
                }else {
                    this.currentState = (isPortrait ? "portrait" : "landscape") + (isTablet ? "Tablet" : "Phone");
                }

                //DEBUGGING CODE BELOW


                debugger.text = "screen X: " + screenX.toString() + " screen Y: " + screenY.toString() + "\n pixels: " + pixels.toString() + "\n screenSize: " + screenSize.toString() + "\n capabilities.screenDPI: " + Capabilities.screenDPI.toString() + "\n current state: " + this.currentState + /*"\n IsDesktop: " + isDesktop.toString() + */ " IsTablet: " + isTablet.toString() + "\n OS Type" + osType;

                //currentState = (isPortrait ? "portrait" : "landscape") + (isTablet ? "Tablet" : "Phone");

            }

上記のコードからわかるように、私は 2 つの異なる状況を処理しています。1 - ローカル PC でエミュレーターを使用している場合、システムは常に im をタブレット モードと見なします (モニターの画面 X と画面 Y の値に対して非常に大きな値を返すため)。だから私は isDesktop フラグでそれを処理します。

次に、画面サイズの値を使用して、タブレットと電話を比較します。現在 (2013 年 2 月)、画面サイズが 6 未満のタブレットはなく、それ以上の電話もありません。

于 2013-02-26T14:00:13.460 に答える
0

Flex applicationDPIプロパティは、iPhone 4 / 4Sの場合は160(ほとんどのタブレットの場合)、240(ほとんどのスマートフォンの場合)、および320のいずれかを返します。

これは、開発者の生活を「より簡単」にするために内部で発生するものです。デバイスの特定のDPI用に構築されたものは、他のデバイス/プラットフォームにあまり拡張できない場合があります。これらの3つの値の1つへのapplicationDPIはFlexのものだと思いましたが、FlexがそれをAIRから継承することは完全に可能です。

結局のところ、DPI値を使用して、アプリがタブレットで実行されているのか電話で実行されているのかを判断する方法はないと思います。上記で指定した値は普遍的ではないためです。それはすべてちょっとした推測ゲームです。

これがエミュレーターでまったく機能することに驚いています。エミュレーターでは、返される値はコンピューターのモニターからの値であり、スマートフォンの値とは異なります。

于 2012-06-03T20:08:41.500 に答える
0

次のようなものを試すことができます

var isItATablet:Boolean = screenHeight > 960 || screenWidth > 960;
var isItReallyATablet:Boolean = isTablet && screenDPI >= 240; // I think this doesn't work as is, but you get the idea..

このようにして、画面の高さまたは幅が 960px を超えていて、DPI が低い場合、おそらくタブレットを使用しています。

これは 100% 正確ではなく、テストしていませんが、2 つのデバイスで異なるデバイスで試して、ほとんどの場合にデバイスのタイプを推測するかどうかを確認するだけです。

于 2012-10-31T21:03:17.933 に答える