我正在尝试以编程方式在height和width中设置自定义视图到wrap_content。问题在于,无论我做什么,它总是呈现为match_parent。
这是视图
public class Circle extends View
{
public Circle(Context context) {
super(context);
}
public Circle(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public Circle(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(0xffff0000);
canvas.drawCircle(mmToPx(4), mmToPx(4), mmToPx(4), paint);
}
public float mmToPx(int mm) {
DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
return mm * displayMetrics.xdpi * (1.0f/25.4f);
}
这是主要代码
public void addCircle()
{
Circle circle = new Circle(this);
Random r = new Random();
FrameLayout.LayoutParams cParams = new FrameLayout.LayoutParams(-1, -2);
cParams.setMargins(r.nextInt((int) (w - (mmToPx(diam)))), r.nextInt((int) (h - (mmToPx(diam)))), 0, 0);
circle.setLayoutParams(cParams);
circle.setBackgroundColor(0xff00ff00);
Log.v("sd", circle.getLayoutParams().width + "");
circle.setId(R.id.circle);
circle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++; scoreTv.setText("Score:\n"+count);
frame.removeView(findViewById(R.id.circle));
addCircle();
}
});
frame.addView(circle);
}
感谢您的帮助:)
答案 0 :(得分:0)
首先 - 永远不要使用像-2这样的幻数。使用ViewGroup.LayoutParams.WRAP_CONTENT。否则,您的代码将变得难以阅读并且可能包含错误(例如,如果他们更改了值)。
其次 - 你实际上并没有在任何地方使用cParams。您想使用带有视图和布局参数的addView版本。否则,如何在该视图中使用那些布局参数。
第三,您的视图中没有onMeasure功能。如果没有它,它将如何知道您的视图有多大,以便它实际上可以在其上包装内容?您需要定义onMeasure,以便它可以获得视图的宽度和高度。
答案 1 :(得分:0)
try this:
view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))