缩放RelativeLayout中的内容

时间:2012-02-08 11:27:51

标签: android zoom scale relativelayout

我有 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

当比例为1(无缩放)时,与儿童视图的交互很好,但随着缩放我的缩放,就像触摸区域被翻译或其他东西一样,因为我不能再点击它们了。

我该如何解决这个问题?我试图像这样覆盖 ZoomableRelativeLayout 中的 onMeasure ;

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

如果有人可以的话,请帮助我!


好的,所以我改用了使用Matrix并使用画布比例来跟随;

@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>

我可以在布局中移动,一切都很好,但是当我缩放时,作为 ZoomableRelativeLayout 的孩子的RelativeLayouts不会被缩放..我该如何解决这个问题?我是否必须继承RelativeLayouts并覆盖 onMeasure() onLayout()或其他任何内容?

1 个答案:

答案 0 :(得分:2)

您在dispatchDraw()中所做的事实上只是缩放视图的绘图,而不是视图本身。视图的位置和大小(左,上,右,下)仍然相同,但您会看到画布中的视图正在缩放。试试这个:稍微缩放ZoomRelativeLayout,然后在原始(非缩放)位置与孩子互动,看孩子是否有所反应。

真正缩放视图/视图组,您需要转换实际视图,而不仅仅是绘图,即转换视图的(l,t,r,b),然后{ {1}} requestLayout(),但这可能会影响效果。