Android:如何缩放,平移(滚动)Tic Tac Toe Board查看

时间:2015-04-22 13:56:01

标签: android view touch zooming

所以,我有一个自定义的BoardView类扩展View。当用户按下单元格时,我实现了绘图板,线条和绘制“O”drawable。

但是,我无法正确实现以下问题:

1。当用户进行捏合(多点触控)时,缩放BoardView。

2. 如果BoardView大于BoardView的初始宽度或高度,则将BoardView向左,向右,向上,向下滚动。

3。在用户在缩放或滚动后按下单元格时找到右侧单元格坐标。

这是我的第一个游戏项目,请帮助我,如果有人知道如何解决这个问题。

我试过但没有正常工作。 BoardView宽度等于宽度,BoardView高度等于BoardView宽度。这是方板视图。

我给了200个赏金来实现这个问题。

这是我的项目,每个人都可以下载和编辑:https://drive.google.com/file/d/0BxNIUTd_m1x8cUQ2NGpSMDBuVVE/view?usp=sharing

Github:https://github.com/boyfox/GameTicTacToe

BoardView代码:http://pastie.org/10109253http://pastebin.com/TRU8Ybds

我找到了自己的解决方案,但需要改进代码,您可以使用您的解决方案回答我的问题!

2 个答案:

答案 0 :(得分:1)

你能把你的代码移到github吗?下载,编辑和建议更改会更容易。

如果您正在寻找两个手指缩放/旋转的通用实现,请查看我的游戏(https://github.com/ZieIony/Gravity)。最有趣的部分是GamePanel视图和dispatchTouchEvent方法:

private PointF prevPos = new PointF(), prevPos2 = new PointF();
float scale = 1;
final float MIN_SCALE = 0.2f, MAX_SCALE = 2.0f;
float rotation = 0;
Matrix matrix = new Matrix();
private float prevDist;

public boolean dispatchTouchEvent(android.view.MotionEvent event) {
        if (event.getPointerCount() == 2) {
            float d = dist(event.getX(0), event.getY(0), event.getX(1),
                    event.getY(1));
            float pivotX = (event.getX(0) + event.getX(1)) / 2;
            float pivotY = (event.getY(0) + event.getY(1)) / 2;
            float prevPivotX = (prevPos.x + prevPos2.x) / 2;
            float prevPivotY = (prevPos.y + prevPos2.y) / 2;
            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                float newScale = scale * d / prevDist;
                newScale = Math.max(MIN_SCALE,
                        Math.min(newScale, MAX_SCALE));
                float scaleFactor = newScale / scale;
                scale = newScale;

                matrix.postScale(scaleFactor, scaleFactor, pivotX, pivotY);
                float prevAngle = (float) Math.atan2(
                        prevPos.x - prevPos2.x, prevPos.y - prevPos2.y);
                float angle = (float) Math.atan2(
                        event.getX(0) - event.getX(1), event.getY(0)
                                - event.getY(1));
                rotation += prevAngle - angle;
                matrix.postRotate(
                        (float) ((prevAngle - angle) * 180.0f / Math.PI),
                        pivotX, pivotY);

                matrix.postTranslate(-prevPivotX + pivotX, -prevPivotY
                        + pivotY);
            }
            prevPos.x = event.getX(0);
            prevPos.y = event.getY(0);
            prevPos2.x = event.getX(1);
            prevPos2.y = event.getY(1);
            prevDist = d;
        }
        return true;
}

此方法生成一个转换矩阵,您应该将其用于绘图。

protected void dispatchDraw(Canvas canvas) {
    canvas.save();
    canvas.setMatrix(matrix);

    // do your drawing here

    canvas.restore();
}

答案 1 :(得分:1)

看看我的回答here。如果答案似乎令人满意,请查看我的github代码。我认为实施你的第三点并不困难

" 3。当用户在缩放或滚动后按下单元格时,找到正确的单元格坐标。",

因为scaleFactorMyView.java可用,getScrollX()getScrollY()可以通过简单的数学运算获得滚动偏移。