Wie @hankide erwähnt, hat es mit der Tatsache zu tun, dass das native Betriebssystem Skalierung für UI-Elemente hat, so dass die App auf verschiedenen Geräten "die gleiche Größe" aussieht.
Dies ist ideal für Schaltflächen und alles, wie das OS sie zeichnet. Wenn der Button also größer ist, skaliert das Betriebssystem den Text einfach. Mit SkiaSharp haben wir jedoch keine Ahnung, was Sie zeichnen, so dass wir keine Skalierung vornehmen können. Wenn wir skalieren würden, würde das Bild auf den hochauflösenden Bildschirmen verschwommen oder verpixelt werden.
Eine Möglichkeit, alles, was die gleiche Größe zu erhalten, ist eine globale Ebene zu tun, bevor irgendetwas Zeichnung:
var scale = canvasWidth/viewWidth;
canvas.Scale(scale);
Und das ist oft gut genug, aber manchmal will man wirklich Elemente unterschiedlich auf einem hochauflösenden Bildschirm zeichnen . Ein Beispiel wäre ein gekachelter Hintergrund. Anstatt das Bild auf einer größeren Leinwand zu strecken, möchten Sie es vielleicht nur kacheln - unter Beibehaltung der Pixel.
Bei dieser Frage können Sie entweder die gesamte Leinwand skalieren vor dem Ziehen, oder Sie können den Text einfach skalieren:
var paint = new SKPaint {
TextSize = 40 * scale
};
Auf diese Weise wird die Textgröße erhöht, aber der Rest der Zeichnung ist auf einer größeren Leinwand.
Ich habe ein Beispiel auf GitHub: https://github.com/mattleibow/SkiaSharpXamarinFormsDemo
Dies vergleicht Xamarin.Forms, SkiaSharp und Native Etiketten. (Sie sollten alle genau die gleiche Größe haben)
Ich werde schauen und sehen, was passiert ... Ich denke, dass der Xamarin.Forms Wert auch durch Bildschirmdichte multipliziert werden könnte ... Sie könnten in der Lage sein zu bekommen weg mit 'paint.TextSize = 40 * dichte'. – Matthew