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}