android中的通用缩放子视图

时间:2015-03-18 03:19:32

标签: android performance zoom scale

我有一个自定义视图组,应包含许多应该可触摸的直接子视图。所以我需要缩放来缩放整个视图而不仅仅是可绘制的部分。

我试图实现自己的解决方案。我在onScale回调中调用requestLayout然后修改子布局。

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int count = getChildCount();


        for(int i = 0; i < count; i++){
            final View child = getChildAt(i);

            float x = DeviceDimensionsHelper.convertDpToPixel(SchemeConstants.OFFSET.getValue()*10, getContext());
            float y = DeviceDimensionsHelper.convertDpToPixel(SchemeConstants.OFFSET.getValue()*6, getContext());

            x = ((x - mScaleGestureDetector.getFocusX())*mScaleFactor)+mScaleGestureDetector.getFocusX();
            y = ((y - mScaleGestureDetector.getFocusY())*mScaleFactor)+mScaleGestureDetector.getFocusY();

            if (child.getVisibility() != GONE){
                child.layout(
                        Math.round(x),
                        Math.round(y),
                        Math.round(x + child.getMeasuredWidth()*mScaleFactor),
                        Math.round(y + child.getMeasuredHeight()*mScaleFactor)
                );
            }
        }
    }

这只适用于儿童视图在缩放时闪烁一点(很少但他们仍然这样做)。请注意,当捏缩放时,所有内容都应围绕两个手指之间的枢轴点缩放。

我尝试了另一个使用setScaleX,setScaleY和setPivotX,setPivotY的解决方案,但该解决方案闪烁得更多(尽管仍然有效)。

我在stackoverflow上看到了一些带有矩阵的解决方案,但这些解决方案非常本地化(至少对我来说),一旦我尝试使用child.getMatrix.anything,我就会在logcat中遇到崩溃和异常。一些解决方案也适用于较旧的Android版本,所以我想我可能有更新的替代方案。

是否有一个中等难度的解决方案来缩放视图组中的子视图(没有闪烁)?

1 个答案:

答案 0 :(得分:1)

如果您还没有找到答案,请尝试一下。 https://github.com/Xjasz/AndroidZoomableViewGroup

我花了好几个小时才开始工作。 我希望它能让别人头疼。