我正在学习如何在android中创建自定义视图。目前,我不知道如何设置最小宽度和高度。为什么我认为它没有设置?因为我打印了sample.map1
值,所以返回0。
在视图中,画布上淹没了一些图形,这意味着层次结构中没有视图,除非自动添加视图(顺便说一句?)。
我尝试使用谷歌搜索设置自定义视图的最小宽度或高度的可能方法,但没有找到任何东西。
那么,如何在getSuggestedMinimumWidth()
方法中为自定义视图设置最小宽度和高度?如果存在诸如为什么您需要覆盖该方法的问题,答案是我想学习如何使用它。
答案 0 :(得分:1)
我的解决方案非常简单,希望对您有帮助
import matplotlib.ticker as ticker
tick_spacing = 1
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
答案 1 :(得分:0)
测量自定义视图实际上比看起来容易。您应该看看MeasureSpec。
通常,您需要处理可以给视图指定特定大小wrap_content
或match_parent
的情况。
调用onMeasure
时,会得到widthMeasureSpec
和heightMeasureSpec
参数,您可以将其与MeasureSpec
结合使用以获得
width
和height
模式width
和height
大小模式可以是MeasureSpec
中三个预定义值之一:
未指定
父母没有对孩子施加任何约束。它可以是任何大小。
完全
父母已经确定了孩子的确切尺寸。不管孩子想要多大,都将为其赋予这些界限。
AT_MOST
该子项可以达到所需的最大大小。
您需要做的是掩盖这些情况,大多数情况如下所示:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
width = //Calculation
} else if (widthMode == MeasureSpec.AT_MOST) {
width = //Calculation
} else {
// UNSPECIFIED
width = //Calculation
}
if (heightMode == MeasureSpec.EXACTLY) {
height = //Calculation
} else if (heightMode == MeasureSpec.AT_MOST) {
height = //Calculation
} else {
// UNSPECIFIED
height = //Calculation
}
setMeasuredDimension(width, height);
}
在某些情况下,如果您的自定义视图是ViewGroup
并且可以包含1个或多个子视图,则应该测量子视图。这是我几年前编写的用于测量自定义ViewGroup
的一段代码,该自定义mChild
最多可以有一个孩子(mStrokeWidth
),并且还需要通过考虑绘制图形来计算其高度/宽度属性在孩子周围的中风(@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
measureChild(mChild, widthMeasureSpec, heightMeasureSpec);
int childWidth = mChild.getMeasuredWidth();
int childHeight = mChild.getMeasuredHeight();
if (widthMode == MeasureSpec.EXACTLY) {
width = MeasureSpec.getSize(widthMeasureSpec);
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(width, (int) (childWidth + (mStrokeWidth * 2)));
}
if (heightMode == MeasureSpec.EXACTLY) {
height = MeasureSpec.getSize(heightMeasureSpec);
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(height, (int) (childHeight + (mStrokeWidth * 2)));
}
setMeasuredDimension(width, height);
}
。
template-url