2017-07-01 9 views
0

J'ai deux bitmaps que je dessine au centre d'une toile: On est seulement un fond, c'est un niveau à bulle en vue de dessus qui ne bouge pas. Le second est un bitmap ressemblant à une "bulle d'air". Lorsque l'utilisateur incline le téléphone, les capteurs lisent l'inclinaison et la bulle d'air se déplace en fonction des valeurs du capteur le long de l'axe des x. Cependant, je dois m'assurer que la bulle d'air ne bouge pas trop loin, par exemple de l'image en arrière-plan. J'ai donc essayé à quelle x coordonnée la bulle peut voyager, avant que je doive définir xPos = xPos -1 en utilisant l'essai et l'erreur Cela fonctionne très bien sur mon appareil. Pour clarifier: Sur mon téléphone, la bulle d'air pourrait se déplacer vers la coordonnée x = 50 à partir du milieu de l'écran. Ce serait le point, où le bitmap est à la toute gauche du niveau d'esprit d'arrière-plan. Sur un téléphone plus grand, la position x = 50 est trop à gauche, et ressemble donc à la bulle d'air qui sortait du niveau de l'eau.Utiliser les coordonnées x/y pour définir les limites d'une particule mobile

Maintenant j'ai essayé: J'ai calculé la zone en% dans laquelle la bulle d'air peut bouger. Disons que représente 70% de la largeur totale du bitmap. J'ai donc essayé de calculer les deux valeurs limites x:

leftBoundary = XmiddlePoint - (backgroundBitmap.getWidth() * 0.35); rightBoundary = XmiddlePoint + (backgroundBitmap.getWidth() * 0.35);

... qui ne marche pas le travail lors des tests avec différentes tailles d'écran :(

Est-il possible de compenser les différentes tailles d'écran et les densités à l'aide coordonnées absolues ou dois-je repenser mon idée?

Si vous avez besoin d'informations que j'ai oubliées, s'il vous plaît faites le moi savoir Si cette question a déjà reçu une réponse, j'apprécierais un lien :) Merci d'avance!

Edit: je charge mes bitmaps comme ceci:

private Bitmap backgroundBitmap; 
private static final int BITMAP_WIDTH = 1898; 
private static final int BITMAP_HEIGHT = 438; 

public class SimulationView extends View implements SensorEventListener{ 
public SimulationView(Context context){ 
Bitmap map = BitmapFactory.decodeResource(getResources, R.mipmap.backgroundImage); 
backgroundBitmap = Bitmap.createScaledBitmap(map, BITMAP_WIDTH, BITMAP_HEIGHT, true; 
} 

et dessine comme ceci:

protected void onDraw(Canvas canvas){ 
canvas.drawBitmap(backgroundBitmap, XmiddlePoint - BITMAP_WIDTH/2, YmiddlePont - BITMAP_HEIGHT/2, null); 
} 

backgroundBitmap.getWidth() et getHeight() imprime les dimensions correctes. Le calcul comme mentionné ci-dessus renverrait les limites suivantes:

DisplayMetrics displayMetrics = new DisplayMetrics(); 
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    int width = displayMetrics.widthPixels; 
    //which prints out width = 2392 
    xMiddlePoint = width/2; 
    // = 1196 
    leftBoundary = xMiddlePoint - (BITMAP.getWidth()* 0.35); 
    // = 531,7 

Cependant, quand je tâtonnement, le droit coordonnée x semble être autour de 700.

+0

Votre mise en œuvre semble bien. Pouvez-vous vous connecter ce que les valeurs de sortie et ce qu'ils pourraient être donnés à la taille de l'écran?Pouvez-vous confirmer que la largeur du bitmap est correcte et que la vue a été correctement gonflée avant de calculer la valeur? –

Répondre

0

Je suis venu à travers une grande explication sur comment résoudre mon problème here. En tant qu'utilisateur AgentKnopf expliqué, vous avez à l'échelle coordonnées ou bitmaps comme ceci:

X = (targetScreenWidth/defaultScreenWidth) * defaultXCoordinate

Y = (targetScreenHeight/defaultScreenHeight) * defaultYCoordinate

qui, dans mon cas, se traduit par:

int defaultScreenWidth = 1920; 
int defaultXCoordinate = 333; 
DisplayMetrics displayMetrics = new DisplayMetrics(); 
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
displayWidth = displayMetrics.widthPixels; 
leftBoundary = (displayWidth/defaultScreenWidth) * defaultXCoordinates