捏缩放无效,在屏幕上消失

时间:2014-02-22 21:14:42

标签: android zoom grid-layout pinchzoom scaleanimation

我必须遗漏一些显而易见的东西,因为这个星球上的每个人似乎都能够完成整个缩放的工作。主要的区别是大多数人似乎在放大图像,而我有一堆GridLayout(android-support-v7-gridlayout)和一堆文本视图。目标似乎很简单:允许用户放大,以便他们可以以更大的尺寸查看整个网格的一部分。

网格画得精细,横向和水平。垂直滚动工作正常。然后,当我用手指分开(缩放)做双指手势时,尽管获得了onScale被调用的日志消息,但没有任何反应。当我将两个手指移入(捏合)时,所有视图都会消失(尽管我的滚动条已经离开)。

我看过Matrix转换,但没有看到那些除了图像视图以外的任何工作。

基本布局xml:

<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<HorizontalScrollView
android:id="@+id/chooser_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
 </HorizontalScrollView>
</ScrollView>

然后在活动中

private ZoomGridLayout playerGrid;

并在onCreate:

    ViewGroup gridParent = (ViewGroup) findViewById(R.id.chooser_layout);
    playerGrid = new ZoomGridLayout(getBaseContext());
    playerGrid.setRowCount(8);
    playerGrid.setColumnCount(8);
    LayoutParams layout = 
            new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
                                            ViewGroup.LayoutParams.WRAP_CONTENT);
    playerGrid.setDetector();
    gridParent.addView(playerGrid, layout);

然后我继续向网格添加~150个小文本视图。 这是ZoomGridLayout的第一次拍摄:

public class ZoomGridLayout extends GridLayout {

    private final static String TAG = "ZGL";

    private ScaleGestureDetector scaleDetector;
    private Context context;
    public void setDetector() {
        scaleDetector = new ScaleGestureDetector(context, new ScaleGesture());
    }
    public ZoomGridLayout(Context c) {
        super(c);
        context = c;
    }

    @Override
    public boolean onTouchEvent (MotionEvent event) {
        scaleDetector.onTouchEvent(event);
        return true;
    }

    private class ScaleGesture
    extends ScaleGestureDetector.SimpleOnScaleGestureListener
    {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            Log.v(TAG, detector.toString());
            ScaleAnimation scale = 
                    new ScaleAnimation(detector.getPreviousSpan(), 
                    detector.getCurrentSpan(), 
                     detector.getPreviousSpan(), 
                    detector.getCurrentSpan());
            scale.setFillAfter(true);
            startAnimation(scale);
            return true;
        }
    }
}

我几天来一直在反对这一点。我是Android编程的新手,所以不太熟悉这些库,但我是一位经验丰富的开发人员。任何指针都会很精彩。 TIA。

1 个答案:

答案 0 :(得分:0)

我放弃了动画(虽然最终我想尝试做到这一点)。这是新的onScale方法:

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            Log.v(TAG, detector.toString());
            mScaleFactor *= detector.getScaleFactor();

            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(MIN_SCALE, Math.min(mScaleFactor, MAX_SCALE));

            invalidate();

            return true;
        }

然后通过覆盖draw方法来补充:

    @Override
    public void dispatchDraw(Canvas canvas) {
        String disp = String.valueOf(mScaleFactor);
            Log.v(TAG, "dispatch draw " + disp);

        canvas.save();
        canvas.scale(mScaleFactor, mScaleFactor);
        super.dispatchDraw(canvas);
        canvas.restore();
    }

我还了解到,由于父级是ViewGroup而不是View,因此需要覆盖dispatch ...方法而不是on ...方法。

这种模式有很多不同的变体。我希望这种特殊的皱纹可以帮助别人。