Отсечение повернутого вида переключателя

Я пытаюсь повернуть 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, однако, имеет правильную высоту (которая позволяет второму переключателю отображать полные чертежи), однако чертежи смещены в нижнюю половину представления, а чертежи по-прежнему обрезаны ниже того места, где была нижняя часть представления. в горизонтальной конфигурации.

Проверка параметров изменения размера в отладчике позволяет предположить, что новые повернутые размеры применяются правильно, однако отсечение все еще происходит. Что вызывает смещение и обрезку и как это исправить?


person RedBassett    schedule 19.12.2017    source источник


Ответы (1)


Не нужно создавать вертикальный пользовательский Switch, вы можете использовать android:rotation="90" для вертикального Switch

Вам нужно задать статическую высоту для вашего Switch Попробуйте это

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp">

    <Switch
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:rotation="90" />

    <Switch
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:rotation="90" />


    <Switch
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Switch
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Switch
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>

ВЫХОД

введите здесь описание изображения

person AskNilesh    schedule 19.12.2017
comment
Придется попробовать статическую высоту. Я предполагал, что в обычном представлении переключателя необходимо настроить отступы. Спасибо за понимание! (Вопрос по исправлению обрезки в пользовательском представлении все еще открыт) - person RedBassett; 19.12.2017
comment
@RedBassett отступы не нужны - person AskNilesh; 19.12.2017
comment
@RedBasset удалите отступы, чем попробуйте - person AskNilesh; 19.12.2017
comment
Для подтверждения, установка высоты фиксирует обрезку на Switch виде по умолчанию. - person RedBassett; 20.12.2017