【问题标题】:Zoom Content in a RelativeLayout在相对布局中缩放内容
【发布时间】:2012-02-29 20:02:50
【问题描述】:

我有一个适用于 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();
}

我得到了我想要的缩放结果,但问题是我想在缩放画布时单击子视图以 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));
}

如果有人可以请帮助我!


好的,所以我从使用矩阵和使用画布比例更改为跟随;

@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() 或其他任何东西?

【问题讨论】:

    标签: android zooming scale android-relativelayout


    【解决方案1】:

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

    真正缩放一个视图/视图组,你需要变换实际的视图,而不仅仅是绘图,即变换视图的(l,t,r,b),然后@ 987654324@invalidate(),但这可能会影响性能。

    【讨论】:

    • 嗨 Ricky,是的,我可以在孩子们的原始位置与他们互动。我是否必须以某种方式翻译 MotionEvent 的位置?我还尝试了另一种方法,在我的 onTouchEvent 中构建一个矩阵(平移和缩放),并在我的绘图中构建一个 canvas.setMatrix。如何以正确的方式转移 (l,t,r,b)?已经搜索了那里的示例,但没有发现任何有用的:(
    • 在您的onTouchEvent() 中,您需要根据比例因子计算新的 (l,t,r,b)。然后用新的维度布置孩子。您不再需要设置canvas.setMatrix(),因为您现在正在缩放/操作实际视图,而不是绘图画布。
    • 您建议如何转换视图的 l,t,r,b?我也在使用 dispatchDraw 方法。
    • @RickyLee 你能给我们一个关于如何实现这一目标的sn-p吗?我在这里有同样的问题。我正在使用这个 ZoomView:github.com/Polidea/android-zoom-view/blob/master/src/pl/polidea/…
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多