多向滚动和缩放缩放

时间:2017-10-14 02:23:55

标签: java android android-layout scrollview

我正在尝试使用Android Studio为我的IDE构建Android游戏。我遇到了障碍,我似乎无法找到很多信息。我正在尝试在我的项目中创建一个支持多向滚动/平移(水平,垂直和对角线)以及缩放缩放的活动。如果您曾经玩过Clash of Clans,那么主要活动就是一个完美的例子。它可以放大和缩小,并在其范围内平移任何方向。

我尝试的事情

1)嵌入式ScrollView

我尝试使用Vertical ScrollView嵌入水平ScrollView(反之亦然),但它不会让我对角滚动。用户体验也非常不稳定。

2)A"修改"滚动型

我已经尝试过"修改"按照此处的建议(two directional scroll view)进行ScrollView,但这并不起作用。它要么没有垂直滚动,要么根本没有工作。

我在StackOverflow和其他网站上看过很多问题,但似乎没有真正的答案。我知道这可以在Unity中完成,但我已经在Android Studio中设置了大部分代码,并且希望能够继续使用它。我在某处读到有人说我需要建立自己的渲染器"但那是我的头脑。

非常感谢任何建议。谢谢。

1 个答案:

答案 0 :(得分:0)

您可以覆盖任何布局或ViewGroup以实现此效果。然后将所有视图放在布局中以获得所需的平移/缩放。

您的onDraw或dispatchDraw应如下所示:

@Override
protected void dispatchDraw(Canvas canvas)
{
    float[] values = new float[9];
    matrix.getValues(values);
    canvas.save();
    canvas.translate(values[Matrix.MTRANS_X], values[Matrix.MTRANS_Y]);
    canvas.scale(values[Matrix.MSCALE_X], values[Matrix.MSCALE_Y]);
    super.dispatchDraw(canvas);
    canvas.restore();
}

然后你必须设置两个手势探测器来拦截缩放和平移。

@Override
public boolean onTouchEvent(MotionEvent event)
{

    matrix.set(savedMatrix);
    boolean gestureDetected = mGestureDetector.onTouchEvent(event);
    if (event.getPointerCount() > 1)
    {
        gestureDetected = mScaleGestureDetector.onTouchEvent(event) | gestureDetected;
        if (checkScaleBounds())
        {
            matrix.postScale(scale, scale, mid.x, mid.y);
        }

    }
    matrix.invert(matrixInverse);
    savedMatrix.set(matrix);
    invalidate();
    return gestureDetected;
}

此处提供ZoomLayout的完整代码: https://github.com/maxtower/ZoomLayout/blob/master/app/src/main/java/com/maxtower/testzoomlayout/ZoomLayout.java

相关问题