説明
カメラのプレビューをサーフェスビューに表示するアクティビティがあります。向きが変わったときに再起動したくないので(QRコードを常にスキャンしているため)、向きは縦向きにロックされます。
私が抱えている問題は、画面の下部にあるユーザーに画面に指示を表示する必要があることです。画面が1つの向きでロックされている場合、アクティビティが再描画されないため、新しい向きの通知は届きません。したがって、電話が縦向き、逆向きの縦向き、横向き、または崇拝されている横向きであるかどうかに関係なく、指示は同じ場所にレンダリングされました。
この問題に対処するために、センサーマネージャーに接続して、オリエンテーションをリアルタイムで読み取りました。(以下のコードを参照してください)それを読んだ後、私は自分でオリエンテーションを理解し、更新が送信されるたびに必要に応じて指示を移動します。これは最近まで私のために働いてきました。AsusTransformerPrimeおよびXoomタブレットでテストする場合。タブレットは、他の2台の電話のように「0」ではなく、縦向きの向きを「90」として返します。以下のコードでわかるように、タブレット(大画面)をチェックし、余分な90度を差し引いています。
問題
問題は、新しいNexus7タブレットにこの余分なバイアスがないことです。縦向きでは「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
}
};