Это то, что сработало для меня в целом.
private void init() {
setRotation(90f);
}
public YourViewOrViewGroup(final Context context) {
super(context);
init();
}
... (all the View/ViewGroup constructors) ...
@Override
protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) {
super.onLayout(changed, l, t, r, b);
final int width = getWidth();
final int height = getHeight();
final int offset = Math.abs(width - height) / 2;
setTranslationX(-offset);
setTranslationY(offset);
}
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
}
То, что вы хотите сделать, это поменять местами ширину с высотой, а затем установить смещения X & Y, чтобы после перехода в полноэкранный видвращение.
Выше приведена версия с альбомным поворотом.Для достижения перевернутого ландшафта просто примените вращение на 270 градусов.Вы можете либо изменить код внутри фрагмента, либо применить вращение снаружи более общим способом, т.е.
final YourViewOrViewGroup layout = inflater.inflate(...);
if (currentOrientation.isInverted()) {
layout.setRotation(layout.getRotation + 180f);
}
, чтобы вы могли встроить повернутый View / ViewGroup в определение xml и раздувать «порт».и «наземные» версии, когда ориентация экрана изменяется, но это, кажется, выходит за рамки этой темы.
Редактировать: на самом деле гораздо лучше отложить настройку смещения до тех пор, пока хотя бы один проход макетанад.Это связано с тем, что в моем случае после первого onMeasure () представление будет отображаться (до того, как будут установлены смещения).В конце концов это может восприниматься как сбой, потому что вид / макет сначала не будут отображаться в конечных границах.(обновил фрагмент)