0

画面の向きに問題があります。基本的に私がやろうとしているのは、正確な画面の向き (逆の横向きと逆の縦向きを含む) を決定することです。私はそれを行うために以下の方法を書きました.Transformerで完全に動作するようですが、エミュレータで同じコードを開始すると、いくつかの問題が発生します.

基本的に何が起こっているかというと、エミュレーターでドキュメントに従って横向き (ROTATION_90) に切り替えるたびに、逆の横向きになるはずです (たとえば、ROTATION_90 デバイスを搭載した Transformer では、Android のドキュメントに記載されているように逆向きの縦向きになっています)。残念ながら、エミュレータでは何らかの理由で通常の横向きモードのようです。

だから私の質問は、正しいirの問題がそこにある下のこのコードです。または、他のパラメーターを考慮していない可能性があります (たとえば、エミュレーターで加速度計がほとんど有効になっていないなど)。

public static int getDeviceCurrentOrientation() {

    WindowManager lWindowManager = (WindowManager) getContext()
            .getSystemService(Activity.WINDOW_SERVICE);

    Configuration cfg = getContext().getResources().getConfiguration();
    int lRotation = lWindowManager.getDefaultDisplay().getRotation();

    int rotation1;
    int orientation;

    rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    if (cfg.orientation == Configuration.ORIENTATION_LANDSCAPE)
        rotation1 = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    else if (cfg.orientation == Configuration.ORIENTATION_PORTRAIT)
        rotation1 = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    else
        rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;

    switch (lRotation) {
    case Surface.ROTATION_0:
        orientation = 0;
        break;
    case Surface.ROTATION_90:
        orientation = 1;
        break;
    case Surface.ROTATION_180:
        orientation = 2;
        break;
    case Surface.ROTATION_270:
        orientation = 3;
        break;
    default:
        orientation = -1;
    }

    if ((orientation == 0)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE))
        return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

    if ((orientation == 0)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT))
        return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    if ((orientation == 1)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT))
        return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;

    if ((orientation == 1)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE))
        return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;

    if ((orientation == 2)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT))
        return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;

    if ((orientation == 2)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE))
        return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;

    if ((orientation == 3)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT))
        return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    if ((orientation == 3)
            && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE))
        return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

    return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
4

1 に答える 1

2

私も同様の問題を抱えていて、何時間もクランチした後......この素晴らしい解決策
を見つけました>>

Display display = getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();

Point size = new Point();
display.getSize(size);

int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

if (rotation == Surface.ROTATION_0
        || rotation == Surface.ROTATION_180) {
    // if rotation is 0 or 180 and width is greater than height, we have
    // a tablet
    if (size.x > size.y) {
        if (rotation == Surface.ROTATION_0) {
            lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        } else {
            lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        }
    } else {
        // we have a phone
        if (rotation == Surface.ROTATION_0) {
            lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        } else {
            lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        }
    }
} else {
    // if rotation is 90 or 270 and width is greater than height, we
    // have a phone
    if (size.x > size.y) {
        if (rotation == Surface.ROTATION_90) {
            lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        } else {
            lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        }
    } else {
        // we have a tablet
        if (rotation == Surface.ROTATION_90) {
            lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        } else {
            lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }
    }
}
于 2013-02-10T00:50:38.110 に答える