Java 如何调用onMeasure方法安卓
我有一个活动和一个视图。此视图的目的是显示方形栅格。正方形边将等于屏幕宽度除以水平存在的正方形数Java 如何调用onMeasure方法安卓,java,android,onmeasure,Java,Android,Onmeasure,我有一个活动和一个视图。此视图的目的是显示方形栅格。正方形边将等于屏幕宽度除以水平存在的正方形数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getValues(); createLayout(); } public static int top; public static int side; private vo
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getValues();
createLayout();
}
public static int top;
public static int side;
private void getValues() {
top = 5; //squares horizontally
side = 6; //squares vertically
}
private void createLayout() {
BoardView bv = new BoardView(this);
bv.setBackgroundColor(Color.BLUE);
setContentView(bv);
bv.createGuideLines();
}
我已经努力创建具有自定义高度的视图,我做到了:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
squareSide = MeasureSpec.getSize(widthMeasureSpec)/top;
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),squareSide*side);
}
public void createGuideLines() {
for(int c = 1; c<=side; ++c) {
path.moveTo(c*squareSide, 0);
path.lineTo(c*squareSide, squareSide*top);
}
for(int l = 1; l<=side; ++l) {
path.moveTo(0, l*squareSide);
path.lineTo(side*squareSide, l*squareSide);
}
invalidate();
}
问题是,当我调试时,squareSide变量的值为0。我认为可能是在createGuideLines之后调用了onMeasure。如果我以前打过电话,它能解决我的问题吗?我在文档中读到有一个方法requestLayout调用onMeasure方法,但我不知道如何实现它
谢谢您的时间。将requestLayout调用添加到createLayout方法中
invalidate将导致视图及其相交的视图通过调用各自的onDraw等方式重新绘制
另一方面,requestLayout将使视图自行调整大小。这两个过程相互独立;requestLayout不会调用invalidate,反之亦然
在您的情况下,您可以调用requestLayout,因为您只处理测量值。我建议您使用onCreate方法执行此操作:
Display display = getWindowManager().getDefaultDisplay();
int squareSide = (int) Math.floor(display.getWidth() / top);
谢谢你的解释,艾曼纽。我实现了requestLayout,就像@petey说的,问题是,我仍然得到squareSize=0。注意:我添加了一个断点,用于在方法onMeasure上进行调试,而调试器没有进入该断点。好吧,它可以工作,但我更喜欢使用不推荐的方法:b,解决方案:Display Display=getWindowManager.getDefaultDisplay;点p=新点;display.getSizep;方形侧=p.x/顶部;
Display display = getWindowManager().getDefaultDisplay();
int squareSide = (int) Math.floor(display.getWidth() / top);