我正在尝试在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
通常在视觉上被剪裁,因为绘图延伸到边界之外,这保留了水平开关的原始尺寸。但是,自定义VerticalSwitch
具有正确的高度(允许第二个开关显示完整的drawable),但是drawables偏移到视图的下半部分,drawables仍然被剪切到底部的下方该视图处于水平配置状态。
检查调试器中大小调整的参数表明正在正确应用新的旋转尺寸,但仍然会发生剪切。导致偏移和削波的原因是什么,以及如何纠正?
答案 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>
<强>输出强>