我有一个视图的活动。此视图的目的是显示平方网格。方形边将等于屏幕宽度除以水平存在的方格数。
@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()。如果我之前打过电话,会解决我的问题吗?我在文档中读到有一个调用onMeasure()方法的方法requestLayout(),但我不知道如何实现它。
感谢您的时间。
答案 0 :(得分:3)
invalidate()
会导致View
及其相交的Views
通过调用各自的onDraw()
来重绘自己。
另一方面,requestLayout()
会使View
自行调整大小。这两个过程是相互独立的; requestLayout()
不会调用invalidate()
,反之亦然。
在您的情况下,您可以致电requestLayout()
,因为您只处理测量。
答案 1 :(得分:2)
将requestLayout
电话添加到您的createLayout
方法
private void createLayout() {
BoardView bv = new BoardView(this);
bv.setBackgroundColor(Color.BLUE);
setContentView(bv);
bv.createGuideLines();
bv.requestLayout(); // requestLayout call
}
答案 2 :(得分:2)
我建议您在onCreate()方法中执行此操作:
Display display = getWindowManager().getDefaultDisplay();
int squareSide = (int) Math.floor(display.getWidth() / top);