2017-10-14 89 views
0

我正在嘗試爲使用Android Studio的Android構建遊戲,並有我的IDE。我遇到了一個我似乎無法找到很多信息的障礙。我正在嘗試在支持多向滾動/平移(水平,垂直和對角線)以及縮放縮放的項目中創建一個活動。如果你曾經玩過Clash of Clans,主要活動就是一個完美的例子。它可以放大和縮小,並在其範圍內平移任何方向。多向滾動和縮放變焦

事情我已經試過

1)嵌入式滾動型

我試圖嵌入一個水平滾動型withing一個垂直滾動型(反之亦然),但它不會讓我是斜向滾動。用戶體驗也很不穩定。

2)「修改時間」滾動型

我嘗試了「修改時間」滾動型這裏(two directional scroll view)建議,但沒有奏效。它要麼不垂直滾動,要麼根本不工作。

我在StackOverflow和其他網站上看過不少問題,但似乎沒有真正的答案。我知道這可以在Unity中完成,但我已經在Android Studio中設置了大部分代碼,並且希望繼續使用它。我在某處看到有人說我需要「建立自己的渲染器」,但是這一切都超出了我的想象。

任何建議,非常感謝。謝謝。

+0

所有你需要的是一個姿態探測器,上面寫着你的'MotionEvents'和平移/旋轉/縮放改變世界'Matrix' - 這矩陣然後用於繪製你的世界 - 你可以找到一個簡單的'MatrixGestureDetector' [here](https://stackoverflow.com/a/21657145/2252830) – pskink

回答

0

您可以覆蓋任何Layout或ViewGroup以實現此效果。然後將所有視圖放置在Layout中以獲取所需的平移/縮放。

你的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