2016-12-20 1 views
6

Je fais une nouvelle application, et j'utilise un canevas. Je suis mise à l'échelle de la toile mais je paramétrez la taille à:Scaling Toile dans SurfaceView à une taille supérieure à la taille de l'écran

public static final int WIDTH = 1920; 
public static final int HEIGHT = 1080; 

(l'écran est dans le paysage C'est pourquoi la largeur est plus grande que la hauteur.) Signification si cette application a été destiné à l'orientation portrait:

public static final int WIDTH = 1080; 
public static final int HEIGHT = 1920; 

Scaled comme la toile est généralement:

public void render(Canvas c) { 
    super.draw(c); 
    final float scaleFactorX = getWidth()/(WIDTH*1.f); 
    final float scaleFactorY = getHeight()/(HEIGHT*1.f); 
    if (c != null) { 
     final int savedState = c.save(); 
     c.scale(scaleFactorX, scaleFactorY); 
     /////render 


     /////render end 
     c.restoreToCount(savedState); 
    } 
} 

la plupart des téléphones sont aujourd'hui HD ou mieux, et très peu ont le pire résolution. Mais il y a toujours des téléphones, et je suis préoccupé par la façon dont la mise à l'échelle va réagir sur d'autres téléphones non-HD/meilleurs que mon application poussera pour une meilleure résolution que l'écran prend en charge.

Des idées comment le téléphone va répondre à cela? Certains téléphones peuvent ajuster automatiquement la mise à l'échelle, mais est-ce une fonction générale ou une fonction que certains téléphones ont?

Le SurfaceView est activé dans une activité et définie à l'aide setContentView:

@Override 
public void onCreate(Bundle sis){ 
    super.onCreate(sis); 

    CustomSurfaceView sf = new CustomSurfaceView(this); 
    setContentView(sf); 
    //initialize 
    sf.init(this, this); 

} 

EDIT

Pour clarifier:

Je suis mise à l'échelle de la toile à une taille spécifique qui est la même comme résolution HD 1080. Les écrans HD 1080 n'effectuent aucune mise à l'échelle par rapport à l'écran. Les écrans 2K atteignent la résolution HD 1080, ce qui signifie que la résolution sera inférieure à la résolution maximale de l'écran.
La taille de HD1080 est 1080x1920 qui sera appliquée à une toile sur un écran plus petit que cette taille.
Mais comment la mise à l'échelle va-t-elle agir sur les écrans HD 720 ou, en général, sur une résolution inférieure à la HD 1080? L'application va pousser une plus grande taille que l'écran prend en charge. Comment le téléphone réagira-t-il à cela?


Exécution de l'application sur un émulateur de lien (nexus 4, api 23) résultats sur la toile étant légèrement poussé hors de l'écran. Tous les téléphones se comportent comme lien que le firmware a été modifié par les fabricants, donc juste parce qu'il va de l'écran sur le Nexus ne signifie pas qu'il sera sur un Sony ou toute autre marque


Note: HD références à HD 1080 sauf indication contraire.

+2

Pourquoi vous hardcoding une résolution spécifique? C'est le problème principal ici: vous pouvez rechercher la résolution réelle du téléphone et l'utiliser lorsque vous dessinez. –

+0

C'est vrai, mais l'échelle du contenu peut aussi être importante. Lorsque la toile est mise à l'échelle de cette manière, elle met également à l'échelle le contenu qui rend le contenu à une taille que l'on peut voir. – Zoe

+0

Lors du dessin sur la toile est de 100 px pas 100px sur chaque téléphone. En tant que tel, je redimensionne la toile et j'ai pensé qu'il serait bon d'avoir une haute résolution sur ce projet. C'est pourquoi j'utilise les standards HD1080 et pourquoi je le code dur. Avec une échelle codée en dur 100px est 100px sur le bord 1 et 7 de Nexus. – Zoe

Répondre

-1

Ne pas effectuer de résolution de code fixe. Ce n'est pas recommandé. Android dispose d'un mécanisme intégré pour la mise à l'échelle des graphiques en utilisant l'unité DP pendant le dessin. detail on unit
Convertir DP en pixels par dps * getResources().getDisplayMetrics().densitydetail
marcher également en docs officiels

Par ailleurs dessin sur fixe toile HD-1080, puis la redimensionner pour d'autres résolution fonctionnera comme suit.

  • Laissez votre CustomSurfaceView prendre en plein écran de l'appareil. (N'affichez pas la taille de votre vue comme une toile)
  • Utilisez le même facteur d'échelle pour xScale et yScale pour préserver le ratio. Gardez à l'esprit que vous obtiendrez un écran noir sur les côtés des appareils ayant un format autre que 16: 9. (Vous pouvez repositionner votre toile pour centrer et dessiner une sorte de cadre sur les côtés)
  • Utilisez le code suivant pour calculer le ratio. (L'aide est prise de here et here)

public void render(Canvas c) { 
    super.draw(c); 
    float scaleFactor = 1f; 
    if ((getWidth()> 0) || (getHeight() > 0)) { 
     scaleFactor = Math.min(WIDTH/getWidth()*1f, HEIGHT/getHeight()*1f); 
    } 
    if (c != null) { 
     c.scale(scaleFactor, scaleFactor); 
     //your code 
    } 
} 
+0

En utilisant un Rect fixe (0,0, WIDTH, HEIGHT) dessiné à l'écran rien ne s'affiche. J'ai copié le code pour m'assurer que je l'ai ajouté correctement mais il ne montre toujours rien à l'écran. – Zoe

+0

@LunarWatcher S'il vous plaît, informez-moi si ma réponse d'édition récente a un sens – Qamar