【问题标题】:Android: How to Zoom, Pan(Scroll) Tic Tac Toe Board ViewAndroid:如何缩放、平移(滚动)井字游戏板视图
【发布时间】:2015-04-22 13:56:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 首先:我在这里看不到任何赏金。秒:我怀疑有人会为您编写代码,您应该尝试自己编写代码并在此处发布一个包含您无法修复的问题列表的问题。
  • 我没有说给我写代码,解决问题需要代码。设置赏金功能将在两天后出现,我将被设置赏金。 @aga 感谢您的评论。
  • 检查了你的 github 项目,它立即崩溃了。在寻求其他任何帮助之前,我会先解决这个问题。
  • @PaulBurke 这不是我使用 GestureDetectorCompat 的崩溃,请将 support4 库和 v7-appcompact 添加到项目中

标签: android view touch zooming


【解决方案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();
}

【讨论】:

  • 如果用户进行多点触控需要缩放,我只需要一键滚动。我编辑了我的问题,如果有时间请看看
  • 我添加了赏金,您可以完全回答我的问题
  • 这太疯狂了——为什么不使用GestureDetector
  • 我不知道有ScaleGestureDetector。很好的发现:)
【解决方案2】:

看看我的回答here。如果答案看起来令人满意,请查看我的github 代码。我觉得你的第三点实现起来并不难

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

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

【讨论】:

  • 感谢您的回答,但我厌倦了运行您的项目但 initializeScrollbars(a); MyView.java 和 View 类中为什么不存在方法?
  • 我评论了这个方法并看到了你的项目,但是你的滚动实现非常好,但是缩放逻辑不是很好。我已经找到了我的问题的解决方案,我想改进我的代码或找到新的最佳解决方案。
  • @mr.boyfox 也许我不确定我的缩放逻辑。无论如何感谢您的回复。
  • 也谢谢你!如果我无法为我的问题找到另一个最佳解决方案,那么我将在本周接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2015-07-18
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多