Android пейзаж вправо влево событие

Я хотел бы сейчас, если есть какой-либо возможный способ вызвать событие, когда макет перерисовывается из-за события переключения непосредственно из горизонтальной правой ориентации в горизонтальную левую ориентацию.

Я попробовал OrientationEventListener. Проблема в том, что он запускается быстро. Я делаю изменения пользовательского интерфейса, и они происходят до перерисовки ландшафта, и это выглядит плохо.

Я мог бы просто добавить некоторую задержку в изменениях, но в зависимости от телефона это изменение может длиться более или менее.

Для onConfigurationChanged время идеально подходит, но, конечно, оно работает только для портрета в пейзаже или из пейзажа в портрет.

Мое приложение не должно приостанавливать это изменение, поэтому использование onPause, onStop и т. Д. Не вариант.

Поэтому я ищу событие, похожее на onConfigurationChanged, которое также охватывает изменения в праве на левый ландшафт.

3 ответа

Я попробовал OrientationEventListener. Проблема в том, что он запускается быстро. Я делаю изменения пользовательского интерфейса, и они происходят до перерисовки ландшафта, и это выглядит плохо.

Вы можете использовать handler.post(runnable), чтобы изменения пользовательского интерфейса не происходили до перерисовки, а ставились в очередь в главном потоке и выполнялись после его завершения.

handler.post(new Runnable() {

        @Override
        public void run() {
        //do the UI changes you want

        }
    });

Если это по-прежнему не помогает, вы можете попробовать сложный и уродливый способ использовать слушателя ориентации и метод onLayout():)

Вы можете использовать DisplayListener, который запускается в этом случае, как описано в этом ответе: /questions/37410420/kak-opredelit-povorot-ekrana-na-180-gradusov-ot-albomnoj-do-albomnoj-orientatsii/37410432#37410432

Я думаю, вы почти поняли. Я не знаю, делаете ли вы похожую вещь, но эта позволяет вам изменять пользовательский интерфейс, как только меняется ориентация. Я сделал этот пример только для изменения ROTATION_270 в ROTATION_90, но вы можете добавить к коду, чтобы я мог покрыть все случаи из PORTRAIT в REVERSE_PORTRAIT и т. д. Мой пример просто меняет текстовое представление с "Пейзаж" на "обратный ландшафт" при изменении ориентации.

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

</RelativeLayout>  

Код

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.widget.TextView;

public class LandScapeToLandScapeReverse extends Activity
{
    private int mCurrentOrientation;
    private Display mDisplay;
    private OrientationEventListener mOrientationEventListener;

    private TextView mTextView;

    private static final String TAG = "LandScape To LandScape Reverse";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        Log.d(TAG, "onCreate");

        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textview);

        mDisplay = getWindowManager().getDefaultDisplay();
        mCurrentOrientation = mDisplay.getRotation();
        mTextView.setText("CurrentOrientation: " + mCurrentOrientation);

        mOrientationEventListener = new OrientationEventListener(this)
        {
            @Override
            public void onOrientationChanged(int orientation)
            {
                // On my phone it seem to change at 233 maybe should start lower 
                // to take into account of phones model variations.
                if (mCurrentOrientation == Surface.ROTATION_270 && orientation > 230)
                {
                    mTextView.setText("CurrentOrientation: " + orientation);
                    Log.d(TAG, "orientation = " + orientation  
                        + " getRotation: " + mDisplay.getRotation());
                    if (mDisplay.getRotation() != mCurrentOrientation)
                    {
                       // I think one should disable listener here and enable
                       // again after doing all the UI changes.
                        mOrientationEventListener.disable();
                        mTextView.setText("Landscape reverse"); 
                    }
                }
            }
        }; 

        mOrientationEventListener.enable();
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();

        Log.d(TAG, "onDestroy");

        mOrientationEventListener.disable();
    }
}  

У меня есть идея, может быть, есть функция, которая вызывается до изменения ориентации, которую мы можем переопределить. Я поиграю и, если найду, обновлю ответ.

Вы можете сделать следующее:

int result = this.getResources().getConfiguration().orientation;
if (result == 1){
a//set content view to portrait

}
else{
//set content view to landscape}
Другие вопросы по тегам