剪切旋转的开关视图

时间:2017-12-19 08:56:56

标签: java android rotation android-view clipping

我正在尝试在Android应用中轮播Switch。我知道android:rotation参数,但由于这是应用程序的常见部分,我正在构建一个扩展switch的自定义视图。默认情况下,对视图应用旋转会保留未旋转视图的原始尺寸,因此此实现应切换宽度和高度参数以适应新方向:

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;
    }
}

这使用了一种修复建议的in this article by Lorenzo Quiroli大小的方法。

以下是结果(第一次切换),然后是Switch参数为android:rotation的普通-90,后跟一系列正常Switch视图,但没有旋转(打开视图边界):

A row of switches with view bounds shown. The first is vertical, but placed lower than the others with the bottom half cut off, the second is correctly vertical, and the remainder are normal horizontal switches.

您可以从绘图视图边界看到带有旋转的法线Switch通常在视觉上被剪裁,因为绘图延伸到边界之外,这保留了水平开关的原始尺寸。但是,自定义VerticalSwitch具有正确的高度(允许第二个开关显示完整的drawable),但是drawables偏移到视图的下半部分,drawables仍然被剪切到底部的下方该视图处于水平配置状态。

检查调试器中大小调整的参数表明正在正确应用新的旋转尺寸,但仍然会发生剪切。导致偏移和削波的原因是什么,以及如何纠正?

1 个答案:

答案 0 :(得分: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>

<强>输出

enter image description here