2017-10-14 5 views
0

Je tente de construire un jeu pour Android en utilisant Android Studio a mon IDE. J'ai rencontré une barrière sur laquelle je n'arrive pas à trouver beaucoup d'informations. J'essaie de créer une activité dans mon projet qui prend en charge le défilement/panoramique multidirectionnel (horizontal, vertical et diagonal) ainsi que le zoom par pincement. Si vous avez déjà joué Clash of Clans, l'activité principale est un exemple parfait. Il peut zoomer et dézoomer, et faire un panoramique dans n'importe quelle direction dans ses limites.Zoom multidirectionnel et pincement

choses que j'ai essayé

1) embarqué ScrollView

J'ai essayé l'intégration d'une ScrollView horizontale withing verticale ScrollView (et vice versa), mais il ne m'a pas laissé défiler en diagonale . L'expérience utilisateur était également très agitée.

2) "Modifié" ScrollView

J'ai essayé le "modifié" ScrollView comme suggéré ici (two directional scroll view), mais cela ne fonctionne pas. Il ne faisait pas défiler verticalement ou ne fonctionnait pas du tout.

J'ai vu pas mal de questions sur StackOverflow et d'autres sites, mais pas de vraies réponses qui semblent fonctionner. Je sais que cela peut être fait dans Unity, mais j'ai déjà la plupart de mon code installé dans Android Studio et je voudrais rester avec. J'ai lu quelque part que quelqu'un a dit que j'aurais besoin de "construire votre propre Renderer", mais cela m'a traversé la tête.

Toutes les suggestions sont grandement appréciées. Je vous remercie.

+0

tout ce que vous avez besoin est un détecteur de geste qui lit votre 'MotionEvents' et modifie le monde' Matrix' en traduisant/rotation/mise à l'échelle - ce matrice est ensuite utilisé lors du dessin de votre monde - vous pouvez trouver un simple 'MatrixGestureDetector' [ici] (https://stackoverflow.com/a/21657145/2252830) – pskink

Répondre

0

Vous pouvez remplacer n'importe quelle mise en page ou ViewGroup pour obtenir cet effet. Ensuite, placez toutes vos vues à l'intérieur de la mise en page pour obtenir le panoramique/zoom que vous voulez.

Votre onDraw ou dispatchDraw devrait ressembler à ceci:

@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(); 
} 

Ensuite, vous devez mettre en place deux détecteurs de geste pour intercepter l'échelle et le panoramique.

@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; 
} 

Le code complet pour un ZoomLayout est disponible ici: https://github.com/maxtower/ZoomLayout/blob/master/app/src/main/java/com/maxtower/testzoomlayout/ZoomLayout.java