0

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

网格画得很好,水平和垂直滚动也很好。然后,当我用手指分开(缩放)做一个两指手势时,尽管收到了 onScale 已被调用的日志消息,但什么也没有发生。当我将两根手指移入(捏)时,所有视图都消失了(尽管我的滚动条在左边)。

我看过矩阵变换,但没有看到这些变换除了图像视图之外的任何东西。

基本布局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。

4

1 回答 1

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... 方法。

这种模式有很多不同的变体。我希望这种特殊的皱纹对其他人有帮助。

于 2014-03-04T14:35:57.147 回答