我正在尝试创建一个文本视图,它将始终是正方形,因此我已经实现了这个自定义类。
public class SquareTextView extends TextView {
public SquareTextView(Context context) {
super(context);
}
public SquareTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int max = Math.max(getMeasuredWidth(), getMeasuredHeight());
setMeasuredDimension(max, max);
}
}
这是一个示例布局,展示了问题:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="8dp">
<com.mypackage.SquareTextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="right|top"
android:background="#000"
android:gravity="center"
android:padding="4dp"
android:text="1"
android:textColor="#FFF"/>
</LinearLayout>
以下是此内容的图片:
这个方法确实能够使视图呈正方形,但是它似乎会破坏重力属性。使用这种方法后,文本似乎总是在左上角。我该如何获得一个始终为正方形但仍保持重力属性或至少能够让文本居中的TextView?
编辑:经过一些测试,我注意到如果将宽度或高度设置为特定的dp大小,则重力似乎又可以起作用了。所以问题可能与WRAP_CONTENT
属性有关。在onmeasure方法中是否会以其他方式处理它,导致我的方法不能按预期工作?
android:gravity="center"
吗?或者你也可以通过Java代码修改Gravity,以便默认情况下为自定义视图执行此操作。 - Lucas Crawford