setScaleX()不会改变实际视图大小。

3
我有一个RelativeLayout,其中包含不同的视图(按钮、复选框等)在运行时填充。
这个容器位于名为TwoDScrollView.java的View中。这基本上是一个ScrollView,但允许我在两个方向上滚动,甚至是对角线。
如果它的内容比自身大,那么显然只有在它的内容超出了它本身的大小时才能滚动。
如果我使用setScaleX和setScaleY函数改变RelativeLayout container的比例,它显然会正确地缩放。问题是,我的容器的实际大小根本没有改变。(container.getWidth()和container.getHeight()始终给出相同的值)
这是我的onClick函数:
    @Override
    public void onClick(View v) {       
        int currentPageId = pager.getCurrentItem();
        PageFragment page = (PageFragment)pagePagerAdapater.getItem(currentPageId);
        View view = page.getView();
        RelativeLayout container = (RelativeLayout) view.findViewById(R.id.container);

        float prevScale = pageZoomFactor[currentPageId];

        if(v.getId() == R.id.bttZoomIn){
            pageZoomFactor[currentPageId] += 0.1f;
        }else if(v.getId() == R.id.bttZoomOut){
            pageZoomFactor[currentPageId] -= 0.1f;
        }else if(v.getId() == R.id.bttZoomReset){
            pageZoomFactor[currentPageId] = 1;
        }

        container.setPivotX(0);
        container.setPivotY(0);
        container.setScaleX(pageZoomFactor[currentPageId]);
        container.setScaleY(pageZoomFactor[currentPageId]);

        android.widget.FrameLayout.LayoutParams lp = (android.widget.FrameLayout.LayoutParams) container.getLayoutParams();
        lp.width = Math.round((container.getWidth() / prevScale) * pageZoomFactor[currentPageId]);
        lp.height = Math.round((container.getHeight() / prevScale) * pageZoomFactor[currentPageId]);

        container.setLayoutParams(lp);

        System.out.println("Width: "+lp.width);
        System.out.println("Height: "+lp.height);
    }

正如你所看到的,我已经尝试手动调整大小,但似乎无法得到正确的大小。它要么变得比我想要的更大,要么变得比我想要的更小。

2个回答

1

我找到了一个解决方案:

在提到的TwoDScrollView中,我将measureChild函数更改为以下内容:

@Override
protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
   ViewGroup.LayoutParams lp = child.getLayoutParams();
   int childWidthMeasureSpec;
   int childHeightMeasureSpec;

   int scaledWidth = Math.round(lp.width * child.getScaleX());
   int scaledHeight = Math.round(lp.height * child.getScaleY());

   childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(scaledWidth, MeasureSpec.EXACTLY);
   childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(scaledHeight, MeasureSpec.EXACTLY);

   child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
 }

我希望这能帮助其他遇到类似问题的人。

实际上,在测试了一下之后,它似乎不太对。在手动更改布局大小后,Android 再次应用缩放(我猜这是有道理的),因此我将缩放倍增了。 - Mazen

0

我曾经遇到过完全相同的问题,这是我解决它的方法。

首先,我缩放了子视图而不是容器。这样,您就不必尝试破解容器以报告不同的大小。容器的大小只是容器的大小:您在活动中看到的内容。它所持有的视图会变得更大或更小。

然而,改变子视图的比例也不会导致子视图报告的大小发生变化。因此,我决定接受它。相反,我修改了父布局的滚动条,以便允许滚动超出视图报告的大小。

因此,在我的父视图中,我覆盖了computeHorizontalScrollRangecomputeVerticalScrollRange方法,以考虑子视图缩放的额外量:

@Override
protected int computeHorizontalScrollRange() {
    return (int)(childView.getWidth() * childView.getScaleX()) + getPaddingLeft() + getPaddingRight();
}

@Override
protected int computeVerticalScrollRange() {
    return (int)(childView.getHeight() * childView.getScaleY()) + getPaddingTop() + getPaddingBottom();
}

然后,我只是覆盖了scrollTo以强制执行边界。(我假设你有一个手势检测器或其他东西来实现滚动;调用scrollBy或scrollTo的东西。)
@Override
public void scrollTo(int x, int y) {
    if (x < 0) x = 0;
    else {
        int maxWidth = computeHorizontalScrollRange() - getWidth();
        if (maxWidth < 0) x = 0;
        else if (x > maxWidth) x = maxWidth;
    }

    if (y < 0) y = 0;
    else {
        int maxHeight = computeVerticalScrollRange() - getHeight();
        if (maxHeight < 0) y = 0;
        if (y > maxHeight) y = maxHeight;
    }

    super.scrollTo(x, y);
}

这样就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接