剪切旋转的开关视图
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
视图,没有旋转(视图边界打开):
您可以从绘图视图边界看到,带有旋转的法线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
以上是关于剪切旋转的开关视图的主要内容,如果未能解决你的问题,请参考以下文章
Android:BottomNavigationView第一个片段开关超级延迟