Я пытаюсь повернуть Switch
в приложении для Android. Мне известен параметр android:rotation
, но поскольку это обычная часть приложения, я создаю настраиваемое представление, расширяющее переключатель. По умолчанию при применении поворота к виду сохраняются исходные размеры неотвернутого вида, поэтому эта реализация должна переключать параметры ширины и высоты, чтобы они соответствовали новой ориентации:
public class VerticalSwitch extends Switch {
// Init method called from all constructors
private void init(Context context, …) {
// Rotate the view
setRotation(switchOrientation.ordinal()*90);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
int height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
int desiredWidth = height + getPaddingLeft() + getPaddingRight();
int desiredHeight = width + getPaddingTop() + getPaddingBottom();
//noinspection SuspiciousNameCombination
setMeasuredDimension(measureDimension(desiredWidth, widthMeasureSpec),
measureDimension(desiredHeight, heightMeasureSpec));
}
private int measureDimension(int desiredSize, int measureSpec) {
int result;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = desiredSize;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
if (result < desiredSize){
Log.e(TAG, "The view is too small, the content might get cut");
}
return result;
}
}
При этом используется метод исправления размеров, предложенный в этой статье Лоренцо Квироли а>.
Вот результат (первый переключатель), за которым следует нормальный Switch
с параметром android:rotation
, равным -90
, за которым следует ряд нормальных Switch
просмотров без поворота (границы просмотра включены):
Вы можете видеть по границам вида рисования, что нормальный Switch
с вращением обычно обрезается визуально, поскольку чертежи выходят за границы, которые сохраняют исходные размеры горизонтального переключателя. Пользовательский VerticalSwitch
, однако, имеет правильную высоту (которая позволяет второму переключателю отображать полные чертежи), однако чертежи смещены в нижнюю половину представления, а чертежи по-прежнему обрезаны ниже того места, где была нижняя часть представления. в горизонтальной конфигурации.
Проверка параметров изменения размера в отладчике позволяет предположить, что новые повернутые размеры применяются правильно, однако отсечение все еще происходит. Что вызывает смещение и обрезку и как это исправить?