剪切旋转的开关视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剪切旋转的开关视图相关的知识,希望对你有一定的参考价值。

我想在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通常在视觉上被剪裁,因为drawables延伸到边界之外,这保留了水平开关的原始尺寸。然而,自定义VerticalSwitch具有正确的高度(允许第二个开关显示完整的drawable),但是drawables偏移到视图的下半部分,drawables仍然被剪切到视图底部的下方在水平配置中。

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

答案

无需创建垂直自定义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>

OUTPUT

enter image description here

以上是关于剪切旋转的开关视图的主要内容,如果未能解决你的问题,请参考以下文章

Android:BottomNavigationView第一个片段开关超级延迟

在recyclerview片段Reandroid中屏幕旋转后进度条不显示

片段被视图分页器布局切割

旋转后片段字段为空

带有片段的 ActionBar 选项卡旋转

方向/配置更改后如何维护 ListView 片段状态?