我有一个RelativeLayout,它在运行时充满了不同的视图(按钮,复选框......)。
此容器位于名为TwoDScrollView.java
的视图中。这基本上是一个scrollview,但允许我向两个方向滚动。甚至对角线。
如果内容比自身大,显然只能滚动。
如果我现在使用函数container
和setScaleX
更改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);
}
正如你所看到的,我已经尝试手动改变大小,但我似乎无法做到正确。它或者指数大于或小于我想要的指数。
答案 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)
我有完全相同的问题,这是我如何让它发挥作用。
首先,我缩放了子视图而不是容器。这样,您就不必尝试破解容器来报告不同的大小。容器的大小只是容器的大小:您在活动中看到的内容。它持有的观点变得越来越大。
但是,更改子视图的比例并不会导致子视图的报告大小发生变化。所以,我决定接受它。相反,我更改了我的父布局的滚动条,以便允许滚动比报告的视图大小更远。
因此,在我的父视图中,我覆盖了computeHorizontalScrollRange
和computeVerticalScrollRange
方法,以考虑子视图缩放的额外数量:
@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);
}
这应该可以解决问题。