Не удается добавить пользовательский вид динамически с WRAP_CONTENT как высота и ширина - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь добавить несколько пользовательских видов в макет фрейма, но он всегда занимает всю ширину и высоту макета фрейма. Пользовательский вид содержит только изображение 50x50, которое я хочу иметь возможность перемещать по макету фрейма, но поскольку пользовательский вид занимает все пространство и накладывается друг на друга, я не могу выбрать другие пользовательские виды, поэтому я хочу его обернуть.

Вот как я добавляю пользовательские виды:

OverlayView overlayView = new OverlayView(EditorActivity.this, themeFilter.drawable);
frameLayout.addView(overlayView, 1, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));

Вот вид OverlayView:

public class OverlayView extends View {

    Bitmap bitmap;
    float x,y;
    float centerX, centerY;

    public OverlayView(Context context, int drawable) {
        super(context);
    bitmap = BitmapFactory.decodeResource(context.getResources(), drawable);
    centerX = (float)getWidth() /2;
    centerY = (float)getHeight() /2;
    x = centerX;
    y = centerY;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (x != centerX && y != centerY) {
        canvas.drawBitmap(bitmap, x-bitmap.getWidth()/2, y-bitmap.getHeight()/2, null);
    } else {
        //INITIALIZE BITMAP ON CENTER OF SCREEN
        canvas.drawBitmap(bitmap, (float)getWidth()/2 - bitmap.getWidth()/2, (float)getHeight()/2 -bitmap.getHeight()/2, null);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN :
            break;
        case MotionEvent.ACTION_MOVE :
            x = event.getX();
            y = event.getY();
            invalidate();
            break;
        case MotionEvent.ACTION_UP :
            x = event.getX();
            y = event.getY();
            invalidate();
    }
    return true;
}

}

Прямо сейчас я думаю оставить все как есть. Это означает, что OverlayView занимает весь экран, и мне просто нужно переключить фокус между другими OverlayViews, чтобы иметь возможность перемещать их (я даже не знаю, возможно ли это - переключение фокуса между сложенными OverlayViews), но я беспокоюсь о потраченное впустую пространство, влияющее на память и производительность, поскольку изображение составляет только 50x50.

1 Ответ

0 голосов
/ 14 марта 2019

Размер OverlayView вычисляется в onMeasure (). Попробуйте эту реализацию:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    int width = View.MeasureSpec.makeMeasureSpec(bitmap.getWidth(), MeasureSpec.EXACTLY);
    int height = View.MeasureSpec.makeMeasureSpec(bitmap.getHeight(), MeasureSpec.EXACTLY);
    setMeasuredDimension(width, height);
}

Также посмотрите на эту реализацию для onMeasure .

...