Android 自定义视图不是图形,视图8为零,即使添加了具有常量值的布局参数
我有一个简单的自定义视图,我正在务实地添加到布局中。视图没有绘制。来自测量上的Android 自定义视图不是图形,视图8为零,即使添加了具有常量值的布局参数,android,android-layout,view,drawing,Android,Android Layout,View,Drawing,我有一个简单的自定义视图,我正在务实地添加到布局中。视图没有绘制。来自测量上的和仅布局上的值表明视图没有绘制,因为它没有高度。我尝试为布局参数应用带有常量的视图,但这并没有解决问题。我尝试设置不同的布局参数组合,覆盖测量上的,onDraw,onLayout,设置setMeasuredDimension,将setWillNotDraw设置为false,但似乎没有任何效果 此视图所附着的布局已设置为“包装内容”,并在适配器中创建。我已经发布了我的源代码 private void addGuessNu
和仅布局上的值表明视图没有绘制,因为它没有高度。我尝试为布局参数应用带有常量的视图,但这并没有解决问题。我尝试设置不同的布局参数组合,覆盖测量上的,onDraw
,onLayout
,设置setMeasuredDimension
,将setWillNotDraw
设置为false,但似乎没有任何效果
此视图所附着的布局已设置为“包装内容”,并在适配器中创建。我已经发布了我的源代码
private void addGuessNumeral(RowHolder row) {
LinearLayout.LayoutParams numeral_view_params = new LinearLayout.LayoutParams(100, 100);
NumeralView numeral_view = new NumeralView(context);
numeral_view.setLayoutParams(numeral_view_params);
Log.d("MyGamesAdapter", "row.game.getGuesses.length = " + row.game.getGuesses().length);
numeral_view.setCount(row.game.getGuesses().length);
row.layout_numeral.addView(numeral_view);
}
public class NumeralView extends View {
private static final int BAR_SPACING = 5;
private static final int BAR_WIDTH = 5;
private static final int BAR_HEIGHT = 15;
private static final int PADDING = 5;
private static final String TAG = "NumeralView";
private int count;
private Paint paint;
private int width;
private int height;
public NumeralView(Context context) {
super(context);
paint = new Paint (Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(BAR_WIDTH);
setWillNotDraw(false);
}
public void setCount(int count) {
this.count = count;
// this.setLayoutParams(new LayoutParams((PADDING*2) + (count * (BAR_SPACING + BAR_WIDTH)),
// BAR_HEIGHT + (PADDING*2)));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for(int i = 0; i < count; i++) {
//algorithm: each bar will occupy on tenth of the width. Bars are spaced with one tenth of the width apart
canvas.drawLine(i * (BAR_SPACING + BAR_WIDTH), 0, i * (BAR_SPACING + BAR_WIDTH) + BAR_WIDTH, height, paint);
if (i%5 == 0) {
canvas.drawLine(0, 0, width, height, paint);
}
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
Log.d("NumeralView", "left = " + left);
Log.d("NumeralView", "top = " + top);
Log.d("NumeralView", "right = " + right);
Log.d("NumeralView", "bottom = " + bottom);
height = bottom - top;
width = right - left;
Log.d("NumeralView", "height = " + height);
Log.d("NumeralView", "width = " + width);
super.onLayout(changed, left, top, right, bottom);
}
/* (non-Javadoc)
* @see android.view.View#onMeasure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthMeasureSpec, MeasureSpec.AT_MOST);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightMeasureSpec, MeasureSpec.AT_MOST);
Log.d("NumeralView", "widthMeasureSpec = " + widthMeasureSpec);
Log.d("NumeralView", "heightMeasureSpec = " + heightMeasureSpec);
setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/* (non-Javadoc)
* @see android.view.View#onSizeChanged(int, int, int, int)
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
}
private void addGuess数字(行持有者行){
LinearLayout.LayoutParams numeric_view_params=新的LinearLayout.LayoutParams(100100);
数词视图数词视图=新数词视图(上下文);
数字视图。setLayoutParams(数字视图参数);
Log.d(“mygamesdapter”、“row.game.getguesss.length=“+row.game.getguesss().length”);
numeric_view.setCount(row.game.getguesss().length);
行.布局\数字.添加视图(数字\视图);
}
公共类视图扩展了视图{
专用静态最终int BAR_间距=5;
专用静态最终整型条_宽度=5;
专用静态最终整流罩高度=15;
私有静态最终整数填充=5;
私有静态最终字符串标记=“数字视图”;
私人整数计数;
私人油漆;
私有整数宽度;
私人内部高度;
公共数字视图(上下文){
超级(上下文);
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.填充和笔划);
油漆。设置颜色(颜色。黑色);
油漆。设置行程宽度(条形宽度);
setWillNotDraw(假);
}
公共无效集合计数(整数计数){
this.count=计数;
//此.setLayoutParams(新的LayoutParams((填充*2)+(计数*(条形间距+条形宽度)),
//横杆高度+(填充*2));
}
@凌驾
受保护的void onDraw(画布){
canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
for(int i=0;i
如果有人知道一个好的资源,可以深入了解Android
查看系统的工作原理,一步一步地解释如何避免这些问题;我将非常感激
谢谢,
如果调用setMeasuredDimension,则不应调用super.onMeasure,因为这将调用默认测量李>
在onMeasure方法中,确保保存视图的宽度和高度,以供onDraw稍后使用
在包含视图的视图“查看”其布局参数之前获取视图的宽度和高度是不可能的,因为这些容器需要根据其周围环境来决定为其指定的大小
-“当此视图应为其所有子视图指定大小和位置时调用。”这意味着它仅适用于包含其他视图(ViewGroup)的视图
有关更多信息,请参见下一个链接:
谢谢!我会做出改变并让你知道。我还注意到,在将容器添加到容器之前,我正在添加contianer的子级。这也可能是问题的原因吗?顺序不重要。但是,为了获得视图的大小,您必须在布局完成后进行,而不是在您仍在组装时进行。我不太确定我是否理解。你把东西放在一起是什么意思?我如何证明布局已经完成?您可以使用我给出的解决方案在布局阶段之后,但在绘制视图之前获取视图的大小:。“把事情放在一起”——我指的是通常在onCreate方法上进行的全部初始化。它们除了为视图存储内容之外什么都不做,只是后来它们才真正进行布局计算