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

#android #android-layout #android-3.0-honeycomb

#Android #android-layout #android-3.0-honeycomb

Вопрос:

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

Моя активность 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);
    }
  

Извините, это длинно. Спасибо!

Ответ №1:

Хорошо — я разобрался с проблемой. 1) Мне не хватало <uses-sdk android:minSdkVersion="11" /> строки в моем манифесте, поэтому она не заполняла экран Xoom.

2) Я не понимал, что вам не нужно просто использовать MATCH_PARENT или WRAP_CONTENT для параметров макета. Например, следующее создаст круг размером 500×500 и поместит его в нижний левый угол экрана (он исчезнет с экрана, как и ожидалось).

 RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(500,  
                    500);  
    params2.leftMargin = 0;
    params2.topMargin = 200;
rel.addView(new CustomViewGroup(this),1,params2);