Как установить размер и положение ViewGroup внутри RelativeLayout? (Все Java, без XML)

76
6

Я пытался понять, как рисовать графику на Android, используя иерархию пользовательских представлений, настраиваемых групп просмотра и relativeLayouts. Мне сложно понять, как родители рассказывают детям, где они могут позиционировать себя и в каком размере. Я думаю, что он работает, когда пользовательская ViewGroup сообщает своим дочерним пользователям определенный размер, но я не могу понять, как относить Relayout к своим дочерям ViewGroup, какому размеру и позиции быть. Прямо сейчас, следующий код рисует круг в верхней и центральной части экрана. (Это Android 3.0 на Xoom). Размер круга равен 295x295, поэтому я предполагаю, что это как-то размер по умолчанию и расположение макета? Может ли кто-нибудь дать мне код, который будет необходим, чтобы я мог программно выбирать размер и расположение группы просмотра, содержащей представление, содержащее круг? Края круга на четырех сторонах обрезаются именно так, поэтому я знаю, что relativelayout отключает остальную часть группы просмотра от печати. Если у меня есть вид ViewGroup() Вид меньшего размера, он будет печатать его с этим размером вверх в левом углу того же прямоугольника в верхней центральной части экрана.


Моя активность onCreate:


 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);
}


Жаль, что это длинный. Спасибо!

спросил(а) 2011-04-29T04:52:00+04:00 9 лет, 2 месяца назад
1
Решение
54

Хорошо. Я понял проблему.
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);

ответил(а) 2011-04-30T19:21:00+04:00 9 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема