Skalieren von Grafiken per Code

D

Dawg

Neues Mitglied
0
Servus allerseits :laugh:

ich stecke mal wieder fest :winki:
Ich habe in der XML ein ImageView welches die Höhe von 1dp hat dies soll ein Balken werden welcher sich durch image.setScaleY(variable); verändert.

Wenn ich den Balken in der XML vergrößere (also die height dp erhöhe) erstreckt er sich NUR "nach oben" (liegt denke ich daran das der Balken mit margin positioniert ist - dies wünsche ich!).

Doch wenn sich z.b. die Variable vergrößert, vergrößert sich die ImageView in beide Richtungen (also "nach oben und unten").

Nun würde ich gerne Wissen:
-Gibt es eine Möglichkeit den Balken "nur nach oben wachsen" zu lassen
-Sollte dies nicht der Fall sein soll ich zum BottomMargin die hälfte des Balkens hinzufügen und somit den Mittelpunkt immer höher rücken?

Schonmal danke für die Infos und Hilfen! :rolleyes2:
 
oh, ich glaub das kommt auf das gesamte layout an, ob noch was oben drüber steht, oder nur darunter und wie dein layout definiert ist.

wenns eine skala ist, könnte man ja die höhe der view auf max (z.b. 100% oder 10dp) stellen und die margin top runterzählen. also mit margin top=10 wäre nix zu sehen, mit margin top 9 dann 1dp usw. bis margin top 0 dann 10dp wären. wäre zumindest mal meine theorie. geht bestimmt auch anders, aber müßte ich dann selbst programmieren und testen ;-)

hier mal noch ein link, der vielleicht weiterhilft oder denkanstöße gibt:
set the absolute position of a view in Android - Stack Overflow
 
Vielen dank werde es mir auf jedenfall mal durchlesen!:thumbup:

Habe es jetzt recht "schmutzig" gemacht:
Code:
float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (int)var, getResources().getDisplayMetrics());
barView.getLayoutParams().height = (int)pixels;

Denke mal aber dass ich später dann doch einen anderen Weg gehen muss da die App an sich schon sehr schwer ist :winki: (Performance technisch!)
 
Hmm, an sich sieht dein Code schon sehr gut aus.

Zwei kleine Hinweise hätte ich allerdings noch.
1. Die getDisplayMetrics-Methode würde ich durch einen finalen Density-Wert ersetzen, den sich vor Anpassung des Layouts die View zieht. So sparst du dir ggf. später weitere (doppelte) Funktionsaufrufe.
2. Egal welchen Weg du gehst: einen Pixel-Wert in Gleitkommazahlen darzustellen macht keinen Sinn. (wenn du mit den Augen nah genug an deinem Bildschirm bist, wirst du auch sehen warum das so ist)^^

Nachtrag:
Für den Density-Wert hingegen solltest du eine float reservieren.
 
Zuletzt bearbeitet:
Mhmm leider scheint meine Lösung nicht das gewünschte Ergebniss auf allen Bildschirmgrößen zu erzielen.
Hätte jemand eine Ahnung wieso das so ist oder wie ich es erzielen könnte?
 
Habe mir jetzt einen neuen Weg skizziert muss ihn mal Morgen testen. :winki:
Es sind halt tausende Berechnungen von denen ich weg wollte zwecks Performance. :sad:

Hoffentlich finde ich im Schlaf einen leichteren Weg, mal abschalten soll ja helfen. :sleep:
 
Sorry das ich mich erst jetzt wieder melde, war krank. :sad:
Für jeden den es jetzt nocht interessiert oder der den Thread ausgraben möchte ich habe eine Lösung die auf jedem Gerät zum gewünschten Ergebniss führt.
Ich hoffe es erspart dem nächstem mit dem gleichen Problem einige Zeit :razz:

Code:
// In OnCreate packen da der code ja nur einmal durchlaufen werden soll
[B]displayHeight = getResources().getDisplayMetrics().heightPixels;[/B]
[B]maxpixels = displayHeight * 0.9f;[/B]//0.9 ist die höhe meines Balkens in Prozent in Relation zur Bildschirmhöhe sprich 90% des Bildschirmes = 0.9
[B]minpixels = maxpixels / 30;[/B]//ich greife hier 1/30 von den 100% der maxpixels ab, welche ja 90% des Bildschirmes sind.
[B]actualpixels = maxpixels / 300;[/B]//da ich eine Skala neben meinem Balken habe und diese Skala in 300 Einheiten unterteilt ist möchte ich Wissen wie groß eine Einheit ist (in pixel)

//BEISPIEL
If(var <= 9){
balken.getLayoutParams().height = (int)minpixels;
}
else if(var >= 300){
balken.getLayoutParams().height = (int)maxpixels;
}
else if((var < 300)&&(var > 9)){
balken.getLayoutParams().height = (int)(actualpixels * var);
}
Bei einer Bildschirm höhe (Landscape only, also eigentlich die Breite S4 1920x1080) wären folgendes die Werte der Variablen (zur Verdeutlichung):
displayHeight = 1080
maxpixels = 972
minpixels = 32.4
actualpixels = 3.24
 
Zuletzt bearbeitet:
Hehe, in der Doku ist deine Lösung ebenfalls erklärt/thematisiert:
The DisplayMetrics.density field specifies the scale factor you must use to convert dp units to pixels, according to the current screen density. On a medium-density screen, DisplayMetrics.density equals 1.0; on a high-density screen it equals 1.5; on an extra-high-density screen, it equals 2.0; and on a low-density screen, it equals 0.75. This figure is the factor by which you should multiply the dp units on order to get the actual pixel count for the current screen. (Then add 0.5f to round the figure up to the nearest whole number, when converting to an integer.) For more information, refer to the DisplayMetrics class.

Dass die jetzige Lösung "100%tig" passt, bezweifle ich sehr stark. Wie Markus schon sagte: "einen goldenen Weg gibt es nicht".
Je nach Auflösung ist eine Differenz zwischen den "fertig skalieren Werten" immer möglich.
Krasses Beispiel: vergleiche eine Auflösung von 1920x1080 und 1024x2 (gibt es nicht, aber das Prinzip wird deutlich: nicht alle Verhältnisse gehen auf). Mein Tipp: Behalte die Sache im Auge, auch wenn derzeit alles "passt" (da es hier wohl um ein Spiel geht, ist es gut möglich, dass sich so besagte Differenzen aufaddieren und später im Programm auffallen. Im Nachhinein an diesen Stellen Fehler zu beheben ist nicht so prall).
 
ui_3k1 schrieb:
Krasses Beispiel: vergleiche eine Auflösung von 1920x1080 und 1024x2 (gibt es nicht, aber das Prinzip wird deutlich: nicht alle Verhältnisse gehen auf). Mein Tipp: Behalte die Sache im Auge, auch wenn derzeit alles "passt" (da es hier wohl um ein Spiel geht, ist es gut möglich, dass sich so besagte Differenzen aufaddieren und später im Programm auffallen. Im Nachhinein an diesen Stellen Fehler zu beheben ist nicht so prall).

Es handelt sich eher um einen Tachometer(zumindest nur der Balken). :tongue:
Habe den Code jetzt an 4 verschiedenen Geräten mit komplett unterschiedlicher Auflösung und unterschiedlichen Bildverhältnissen getestet es hat alles prima funktioniert.:drool:
Mir ist klar das dieser Balken auf sehr niedrigen Auflösungen sehr ungenau sein wird aber auf diese "Zielgruppe" wird die App sowieso nicht ausgerichtet sein da OFT kleine Handys in Sachen Performance doch ein weites Stück hinter ihren großen Brüdern stehen.
An sich wird die App auch ziemlich schwer (Viele GPS Berechnungen, viel UP/Download Traffic, Sensoren werden durchgehend ausgelesen usw.).
 
Ahh, okay.
Jo dann bist du auf der sicheren Seite, wie gesagt bei Spielen ist es von extremer Bedeutung, dass alles praktisch 100%tig stimmig ist, sonst muss man schlimmstenfalls das Spielprinzip ändern.
Wie auch immer...
Hmm, an sich sollte der GPS-Sensor zwar etwas Akku ziehen, aber von wirklicher Belastung bei der Performance sollte hier noch keine Rede sein. Selbst wenn du noch Daten über das Netz lädst, werden die niemals die CPU (GPU sowieso nicht) "auslasten". Im Prinzip sollte die Anwendung eigentlich ein Leichtgewicht werden. :)
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.062
jogimuc
J
S
Antworten
9
Aufrufe
1.240
swa00
swa00
P
  • pitweazle
Antworten
5
Aufrufe
1.466
pitweazle
P
Zurück
Oben Unten