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

时间:2015-02-18 10:03:04

标签: android scaling

我有一个RelativeLayout,它在运行时充满了不同的视图(按钮,复选框......)。

此容器位于名为TwoDScrollView.java的视图中。这基本上是一个scrollview,但允许我向两个方向滚动。甚至对角线。

如果内容比自身大,显然只能滚动。

如果我现在使用函数containersetScaleX更改RelativeLayout setScaleY的比例,它显然可以正确缩放。 问题是,我的容器的实际大小根本没有变化。 (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 个答案:

答案 0 :(得分: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);
 }

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

答案 1 :(得分: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);
}

这应该可以解决问题。