Увеличить содержимое в RelativeLayout - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть приложение для Android 2.1 , где у меня есть корневая раскладка для детей, которую я могу щелкать, перемещать и масштабировать.Все в порядке, пока макет корня не увеличен.

У меня есть такая настройка;

<ZoomableRelativeLayout ...>  // Root, Moveable and zoomable
    <ImageView ....>
    <RelativeLayout ...> // Clickable, moveable and zoomable
    <RelativeLayout ...> // Clickable, moveable and zoomable
</ZoomableRelativeLayout>

И мне нравится увеличивать содержимое в моем ZoomableRelativeLayout .Я так масштабирую свое содержимое в своем классе ZoomableRelativeLayout;

protected void dispatchDraw(Canvas canvas) {
    canvas.save(Canvas.MATRIX_SAVE_FLAG);
    canvas.scale(mScaleFactor, mScaleFactor, mXPointCenter, mYPointCenter);
    super.dispatchDraw(canvas);
    canvas.restore();
}

Я получаю желаемый результат масштабирования, но проблема в том, что я хочу щелкнуть по Childviews до ZoomableRelativeLayout , когда canvasмасштабируется ..

Когда масштаб равен 1 (без масштабирования), взаимодействие с дочерними представлениями в порядке, но при масштабировании по мере увеличения масштабирования он аналогичен переводу области касания или чего-то еще, потому что я не могу нажатьих больше.

Как мне это исправить?Я пытался переопределить onMeasure в ZoomableRelativeLayout вот так;

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension((int) (widthSize * mScaleFactor), (int) (heightSize * mScaleFactor));
}

Пожалуйста, помогите мне, если кто-нибудь может!


Хорошо, такЯ перешел с использования матрицы и масштабирования холста на следующее:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != View.GONE) {
            child.layout((int) mPosX, (int) mPosY, (int) (mPosX + getWidth()), (int) (mPosY + getHeight()));
        }
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension((int) (widthSize * mScaleFactor), (int) (heightSize * mScaleFactor));
}

У меня все еще есть настройки;

<ZoomableRelativeLayout ...>  // Root, Moveable and zoomable
    <ImageView ....>
    <RelativeLayout ...> // Clickable, moveable and zoomable
    <RelativeLayout ...> // Clickable, moveable and zoomable
</ZoomableRelativeLayout>

Я могу перемещаться по макету, и все в порядке, но когда язум, RelativeLayouts, который является детским ZoomableRelativeLayout , не масштабируется .. Как я могу это исправить?Нужно ли создавать подкласс RelativeLayouts и переопределять onMeasure () или onLayout () или что-нибудь еще?

1 Ответ

2 голосов
/ 09 февраля 2012

То, что вы делаете в вашем dispatchDraw(), на самом деле просто увеличивает рисунок вида, а не самого представления.Расположение и размер вида (слева, сверху, справа, снизу) остается прежним, хотя вы видите, что чертеж вида на холсте масштабируется.Попробуйте это: немного увеличьте ZoomRelativeLayout, а затем пообщайтесь с детьми в их оригинальном (не увеличенном) месте и посмотрите, реагируют ли дети.

На действительно масштабирование вида / видовой группы, вам необходимо преобразовать фактический вид, а не только чертеж, т.е. преобразовать (l, t, r, b) вида, затем requestLayout() invalidate(),но это может повлиять на производительность.

...