Wie dreht TextView ohne übersteuerung seine Grenzen?
Ich versuche zu drehen mein Unterklasse von TextView
mit canvas.rotate()
:
canvas.save();
final int w = getWidth();
final int h = getHeight();
float px = w/2f;
float py = h/2f;
canvas.rotate(mAngle, px, py);
super.draw(canvas);
canvas.restore();
TextView gedreht wird, jedoch die Grenzen meiner Ansicht beschnitten sind:
Ich verstehe, dass dies ist, weil meiner Ansicht die Größe - es wird nicht geändert werden, während der Drehung, während es sein sollte. Aber wenn werde ich ändern Breite\Höhe in onMeasure
problem wird bleiben - ich bin mit LayoutParams.WRAP_CONTENT
, so TextView
einfach ändern Sie die Größe entsprechend Werte in setMeasuredDimensions
.
Wie kann ich dieses problem lösen?
- versuchen Sie, android:clipChildren=false; und android:clipToPadding=false; TextView Eltern werden.
- es bewirkt, dass seltsame Artefakte beim drehen. Außerdem hab ich mit dem clip einige Ansichten, ich kann also nicht einfach festlegen
clipChildren=false
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass das ganze problem hier ist, dass Sie mit WRAP_CONTENT. Die clip-rect für die Ansicht, wenn Sie das tun, ist die Größe der text-Inhalt. Der einfachste Weg, um das problem zu beheben ist die Verwendung von Polsterung. So etwas wie dies, funktioniert gut für mich:
Natürlich, wenn Sie tun es auf diese Weise, müssen Sie eine etwas andere Polsterung für jeden Inhalt. Wenn Sie dies nicht tun können, überschreiben onMeasure, so dass genau das tut, was TextView ist onMeasure tut, fügt dann entsprechende Polsterung, die als notwendig für die rotation.
Später Hinzugefügt:
Tatsächlich, das war ein bisschen Spaß, um herauszufinden. Ich habe Folgendes onMeasure, das funktioniert Recht gut:
Das einzige Verbleibende problem ist, dass der text wird umgebrochen, nach dem pre-rotation Abmessungen. Man müsste das auch fix...
sinA und cosA werden berechnet, wenn die Fähigkeit 'zerfleischen' gesetzt ist.
Ok, wenn Sie nicht drehen textView in der aktuellen Ansicht hierarch, sollten Sie animieren, es in einer anderen.
Erstellen Sie eine bitmap-represantation Ihrer textView. Verwenden Sie eine Halterung für diese bitmap wie Bildansicht. Verbinden Sie die Bildansicht zu einem anderen layout, das oben ist und wo es nicht beschnitten werden. Verstecken Sie Ihre textView. Führen Sie die animation auf Bildansicht. Wenn die animation fertig, update textView Darstellung, zeigen textView und entfernen Bildansicht.
Ich kann nicht finden, die genaue code-Beispiel für das, was Sie wollen, aber nehmen Sie einen Blick auf diese eine. Die interecting Ort:
Auf den ersten Blick Lösung zur Verfügung gestellt von G. Blake Meike ist ein guter Weg, um zu starten, aber es gibt eine Menge Probleme upcome.
Um Probleme zu überwinden es gibt einen anderen Weg. Es ist ganz einfach, aber in der Regel nicht verwendet werden sollte (da habe ich gerade gelöscht unneccesary für mich Sachen aus dem original-android-Quelle). Um die Kontrolle über die Zeichnung von Beton
View
können Sie überschreibendrawChild
Methode der Eltern (ja, Sie müssen Ihre eigenen Unterklasse vonViewGroup
oder etwas konkreter, wieFrameLayout
). Hier ist ein Beispiel meiner Lösung:Haupt-Idee ist, dass ich Einräumung nicht abgeschnitten Leinwand zu Kind.
drawChild
- Methode - Kontrolle über die Zeichnung. Aber Ihre Antwort führt schließlich zu mehr "richtige" Lösung, also gebe ich Sie ein Kopfgeld )Man könnte prüfen, https://github.com/grantland/android-autofittextview
Vor allem seine refitText () - Methode.
Rotationg Ihre Textview sollte doch das Ergebnis in der Anrufung der onMeasure () - Methode, wo die Magie beginnt.