Как вы устанавливаете размер и положение ViewGroup, которая находится внутри RelativeLayout? (Вся Java, без XML)
Я пытался понять, как рисовать графику на Android, используя иерархию настраиваемых представлений, настраиваемых групп просмотра и относительных раскладок. Я с трудом пытаюсь понять, как родители должны сказать детям, где они себя позиционируют и в каком размере. Я думаю, что это работает, когда пользовательская ViewGroup сообщает, что ее дочерние элементы имеют определенный размер, но я не могу понять, как сделать, чтобы относительный Layout сообщал своим дочерним элементам ViewGroup, какой размер и положение быть. Прямо сейчас следующий код рисует круг в верхней и центральной части экрана. (Это Android 3.0 на Xoom). Размер круга 295x295, так что я предполагаю, что это как-то размер и положение макета по умолчанию? Может ли кто-нибудь дать мне код, который был бы необходим для того, чтобы я мог программно выбрать размер и местоположение группы представлений, которая содержит представление, которое содержит круг? Края круга с четырех сторон обрезаются именно так, поэтому я знаю, что относительное расположение отрезает остальную часть видовой группы от печати. Если у меня есть мера ViewGroup () для представления в меньшем размере, он будет печатать его с таким размером вверх в левом углу того же прямоугольника в верхней центральной части экрана.
Моя активность на создание:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CustomViewGroup custVG = new CustomViewGroup(this);
RelativeLayout rel = new RelativeLayout(getApplicationContext());
rel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
rel.addView(custVG);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rel.addView(new CustomViewGroup(getApplicationContext()),1,
new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
setContentView(rel);
}
Моя заказная группа ViewGroup:
CustomView cust;
int _height;
int _width;
public CustomViewGroup(Context context) {
super(context);
cust = new CustomView(context);
Canvas canvas = new Canvas();
this.addView(cust,new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
@Override
public void onDraw(Canvas canvas){
this.drawChild(canvas,cust,0);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
cust.layout(this.getLeft(), this.getTop(), this.getRight(), this.getBottom());
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
//Measure the only child
this.measureChild(cust,widthMeasureSpec, heightMeasureSpec);
_height = View.MeasureSpec.getSize(heightMeasureSpec);
_width = View.MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(_height, _width);
}
Мой Пользовательский Вид
public CustomView(Context context){
super(context);
}
@Override
public void onDraw(Canvas canvas) {
float noteRadius = _width/2;
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.YELLOW);
paint.setStyle(Paint.Style.STROKE);
float strokeWidth = paint.getStrokeWidth();
paint.setStrokeWidth(strokeWidth);
canvas.drawCircle(_height/2, _width/2, noteRadius, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
_height = View.MeasureSpec.getSize(heightMeasureSpec);
_width = View.MeasureSpec.getSize(widthMeasureSpec);
Log.i("CustomView onMeasure","Width: " + _width + " Height: " + _height);
setMeasuredDimension(_height, _width);
}
Извините, это долго. Спасибо!
1 ответ
Хорошо, я понял проблему.
1) мне не хватало <uses-sdk android:minSdkVersion="11" />
в моем манифесте, чтобы он не заполнил экран Xoom.
2) Я не осознавал, что вам не нужно просто использовать MATCH_PARENT или WRAP_CONTENT для параметров макета. Например, следующее создаст круг размером 500x500 и поместит его в нижний левый угол экрана (он уходит с экрана, как и ожидалось).
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(500,
500);
params2.leftMargin = 0;
params2.topMargin = 200;
rel.addView(new CustomViewGroup(this),1,params2);