2017-04-04 4 views
0

Ich habe eine Anwendung läuft auf Android, auf dem ich ein Raster zeichnen muss. Ich mag die Zellen des Gitters auf allen Geräten der gleichen Größe sein, und ich habe diese Methode gefunden, das zu tun:Android - Kann nicht gleiche Größe Quadrat auf allen Geräten zeichnen

float scale = getResources().getDisplayMetrics().density; 
float SIZE = DESIRED_DP_VALUE * scale + 0.5f; 

DESIRED_DP_VALUE ist ein Wert, den ich für die Zellen Dimension gesetzt.
Ich habe die App auf zwei Smartphones und einem Tablet ausprobiert: Das Tablet und eines der Smartphones haben die Zellen der gleichen Größe, das andere Smartphone nicht.

Dies ist die Methode I verwenden um das Raster zu zeichnen:

protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    int count=0; 

    while(count<=row){ 
     float coordinate=count*SIZE; 
     canvas.drawLine(coordinate,0,coordinate,column*SIZE,whitePaint); 
     count++; 
    } 

    count=0; 

    while(count<=column){ 
     float coordinate=count*SIZE; 
     canvas.drawLine(0,coordinate,row*SIZE,coordinate,whitePaint); 
     count++; 
    } 
} 

Das Gitter auf jedem Gerät korrekt ziehen. Wo könnte das Problem sein?

+0

Ihr gewünschter DP-Wert ist wahrscheinlich so, wie er heißt - ein xy-dp-Wert. DPs werden auf verschiedenen Bildschirmgrößen unterschiedlich angezeigt (sie sind Dichtepixel und einige Geräte haben unterschiedliche Bildschirm-DPs). Dies bedeutet, dass Sie mehrere Gerätebildschirme unterstützen sollten, die in XMLs standardmäßig erstellt wurden. In Ihrem Fall würde ich versuchen, die Informationen über den Gerätebildschirm DP zu erhalten und eine switch-Anweisung zu machen, um zu sehen, in welche Kategorie es fällt. Und dann passe den "Wunsch-DP-Wert" für diese Bildschirme an. –

Antwort

0

Ich denke, Sie mischen einige Konzepte. Die Größe in Pixel ist, wie viele Punkte pro mit oder Höhe zählen. Jedes Gerät hat seine eigene Bildschirmgröße in Zoll und die Anzahl der Pixel oder Punkte, die in Breite und Höhe gezeichnet werden können. Die Beziehung zwischen Dimension und Pixeln ist die Dichte. Also, was willst du machen? Zeichnen Sie ein Quadrat, das die gleiche physikalische Größe auf dem Bildschirm oder ein Quadrat mit der gleichen Anzahl von Pixeln zeigt? Wenn Sie basierend auf Zoll zeichnen möchten, nehmen Sie es so. Zum Zeichnen eines 1-Zoll-Quadrats benötigen Sie für ein Gerät mit einer Dichte von 300 Pixel pro Zoll 300 Pixel. Wenn das Gerät 150 Pixel pro Zoll ist, müssen Sie ein Quadrat von 150 Pixel zeichnen. Also müssen Sie die Größe in Zoll festhalten, nicht die gewünschte DP.

+0

Ich möchte auf Basis von Zoll zeichnen, also was muss ich in meiner Formel ändern? – User999

+0

Sagen wir, Ihre Zielgröße ist 5 Zoll: float suchterWidth = 5.0f; Float gewünschtHeight = 5.0f; Sie können Ihre Gerätefunktionen und die dpi so erhalten: float deviceXdpi = getResources(). GetDisplayMetrics(). Xdpi; float deviceYdpi = getResources(). GetDisplayMetrics(). Ydpi; Und die Anzahl der Pixel benötigt: float pixelsWidthrequired = gewünschteWidth * deviceXdpi; float pixelsHeightrequired = gewünschtHeight * deviceYdpi; Also, da drawLine Pixel verwendet, sollten Sie in der Lage sein, basierend auf der angegebenen Größe zu zeichnen –

+0

Entschuldigen Sie die Störung wieder, aber ich habe Ihre Methode versucht und funktioniert immer noch nicht. Ich tat dies: 'float deviceXDpi = getResources(). GetDisplayMetrics(). Xdpi;' 'SIZE = deviceXDpi * sitedWidth;' Dann benutze ich drawline die Art, wie ich in der Frage geschrieben. Die Anzahl der Zeilen und Spalten, die gezeichnet werden, wird folgendermaßen berechnet: 'width = getWidth();' 'row = (int) (Breite/SIZE)' Das gleiche gilt für die Spalten, aber natürlich mit getHeight. Frage mich, ob das Problem hier ist ... – User999

Verwandte Themen