Jump to content
Unity Insider Forum

TouchScreenKeyboard.Open.../GUI hat jemand Erfahrung?


Recommended Posts

Hallo Leute,

 

wollte wissen ob ich die Methode "TouchScreenKeyboard.Open(...)" richtig verwende?

 

using UnityEngine;
using System.Collections;
public class Textbox : MonoBehaviour {
public string text;
public TextMesh textMesh;
public Color defaultColour;
public Color selectedColour;

private Material actualMaterial;
private TouchScreenKeyboard keyboard;
private bool showKeyboard = false;
private bool setTextOnce = false;

void Awake () {
 SetText();
}

void Start() {
 actualMaterial = renderer.material;
 actualMaterial.color = defaultColour;
}

void SetText()
{
 if (textMesh != null) {
  textMesh.text = text;
 }
}

void OnTouchDown() {
 if(!showKeyboard)
 {
  actualMaterial.color = selectedColour;
  showKeyboard = true;
//   ReadKeyboard();
 }
}

void OnTouchUp() {

 actualMaterial.color = defaultColour;
}

void OnTouchStay() {

 actualMaterial.color = selectedColour;
}

void OnTouchExit() {

 actualMaterial.color = defaultColour;
}
// void ReadKeyboard()
// {
//  if (showKeyboard)
//  {
//   keyboard = TouchScreenKeyboard.Open(text, TouchScreenKeyboardType.Default);
//   showKeyboard = !showKeyboard;
//  }
//  if (keyboard != null && keyboard.done)
//  {
//   text = keyboard.text;
//   SetText ();  
//  }
// }
void OnGUI()
{
 if (showKeyboard)
 {
  keyboard = TouchScreenKeyboard.Open(text, TouchScreenKeyboardType.Default);
  showKeyboard = !showKeyboard;
  setTextOnce = !setTextOnce;
 }
 if (setTextOnce && keyboard != null && keyboard.done)
 {
  text = keyboard.text;
  SetText ();  
  setTextOnce = !setTextOnce;
 }
}
}

 

Nachdem stundenlang das Debuggen mit meinem Handy nicht funktioniert hat, konnte ich den Fehler nicht finden. Denn leider gibt Debug.Log nicht in den LogCat aus - zumindest bei mir nicht.

 

1. Muss man die Mehtode in OnGUI aufrufen? Denn das wird ja immer und immer wieder durchlaufen.

2. Kennt ihr eine Eigenschaft/Methode wie ich ohne meine Flags feststellen kann, ob ein Text eingeben/abgschlossen wurde?

3. Gibt es eine Möglichkeit die Unity-GUI zuverwenden/zu scalen/skinnen...ich bekomme nur winzige Darstelllungen z.B. beim Silder auf meinem Android-Handy

4. Kann ich das Keyboard irgendwie Dispose/Destroy?

 

Vielen lieben Dank & Sevus

delspeedy

Link zu diesem Kommentar
Auf anderen Seiten teilen

...

 

Nachdem stundenlang das Debuggen mit meinem Handy nicht funktioniert hat, konnte ich den Fehler nicht finden. Denn leider gibt Debug.Log nicht in den LogCat aus - zumindest bei mir nicht.

 

1. Muss man die Mehtode in OnGUI aufrufen? Denn das wird ja immer und immer wieder durchlaufen.

2. Kennt ihr eine Eigenschaft/Methode wie ich ohne meine Flags feststellen kann, ob ein Text eingeben/abgschlossen wurde?

3. Gibt es eine Möglichkeit die Unity-GUI zuverwenden/zu scalen/skinnen...ich bekomme nur winzige Darstelllungen z.B. beim Silder auf meinem Android-Handy

4. Kann ich das Keyboard irgendwie Dispose/Destroy?

 

Vielen lieben Dank & Sevus

delspeedy

 

Was funktioniert denn ganz genau nicht ? Das Keyboard wird nicht angezeigt oder nur der eingegebene Text nicht ?

 

zu 1,2: Schau mal in die Doku der Eigenschaft done rein.

zu 3: Stichwort Matrix.. --Damit kannst Du die GUI skalieren. Oder einfacher: ScaleAroundPivot

zu 4: Mit active = false; kannst Du sie schließen schätze ich. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Schlumpf vielen lieben Dank gleich mal vorweg ;) Ich wollte zuerst mit der Unity-GUI einfach ein paar Steuerelemente (Button,Slider,Checkbox und Textbox) erzeugen. Was mir zwar gelungen ist aber eben alles zu klein am Handy. Darum hatte ich jetzt begonnen was eigenes zu basteln. Und da hatte ich das Problem mit der AndroidTastatur. Nicht das ich sie sehe sondern das auslesen des Textes. Im nachhinein ist es zwar lächerlich, aber mir war nicht bewusst, dass es immer wieder aufgefuhren wird bis es beendet wird. Das war mein grundlegender Fehler, dass ich dahinter den Text auslesen wollte was aber eben nicht funktionierte...

Der gepostete Code ist jetzt schon funktionfähig.

Was mir an der ganzen Geschichte trotzdem nicht gefällt ist das die AndroidTastatur den ganzen Bildschirm verdeckt. Das ist bei anderen Anwendungen ja nicht der Fall.

Gibt es eine kleine Version auch noch?

 

zu

1 u 2 Die Eigenschaft "done" ist leider nicht sehr hilfreich, da sie immer done ist sobald die Tastatur mal gestartet und wieder geschlossen wurde - das hatte zur folge das der Text endlos gesetzt wird also in OnGUI.Deshalb hatte ich ja die Frage ob es wirklich so sein muss

3. Das werde ich mir ansehen wahrscheinlich wie man skaliert und die verschiedenen Auslösungen/Seitenverhältnisse richtig reagiert - Danke

4. Ich denke auch das es mit active = false ausgeschalten werden kann, aber eben nur nicht sichtbar

 

Ich bin am überlegen welcher Aufwand der geringste ist um einfach ein paar Steuerelement auf den Handyschrim zu zaubern.

 

Bye

delspeedy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe jetzt die Eigenschaft gefunden mit der man das Texteingabefeld der Tastatur ausblenden kann.

https://docs.unity3d.com/Documentation/ScriptReference/TouchScreenKeyboard-hideInput.html

Was jetzt zwar schöner aussieht, aber die selbst gebastelte Textbox trotzdem von der Tastatur verdeckt wird. Leider gibt die Eigenschaft "area" https://docs.unity3d.com/Documentation/ScriptReference/TouchScreenKeyboard-area.html

angeblich auf Android ein zero-Rect zurück was dann beim Positionieren der Camara nicht sehr hilfreich ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

die android tastatur is nun weg

aber von welcher tastatur wird nun deine textbox verdeckt *kopfkratz

 

kannst du mal ein bild machen und eins wie es aussehen sollte bitte

 

 

btw hier was zum spielen :)

 

c# :


TouchScreenKeyboard keyboard2;
void keyboard2steuerung(){
#if UNITY_IPHONE || UNITY_ANDROID
  TouchScreenKeyboard.hideInput = true;
  TouchScreenKeyboard.autorotateToLandscapeLeft = true;
  TouchScreenKeyboard.autorotateToLandscapeRight = true;
  keyboard2 = TouchScreenKeyboard.Open("", TouchScreenKeyboardType.Default, false, false, false, true);
#endif

//vorlage fuer code 
#if UNITY_EDITOR
#elif UNITY_IPHONE || UNITY_ANDROID
#endif
}

autorotateToLandscapeLeft

TouchScreenKeyboard

 

die if abfrage erklärt :

https://docs.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

...

Was mir an der ganzen Geschichte trotzdem nicht gefällt ist das die AndroidTastatur den ganzen Bildschirm verdeckt. Das ist bei anderen Anwendungen ja nicht der Fall.

Gibt es eine kleine Version auch noch?

...

 

Du kannst mal versuchen die Parameter der Methode Open() zu ändern. Ganz besonders den Parameter TouchScreenKeyboardType.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bilder habe ich gemacht - aber nur über die Webcam...besser konnte ich es auf die schnelle nicht hinbekommen.

Wie es aussehen soll ist das *kopfkratz janz heftig* der sichtbare Bereich ober der Tastatur sollte auf die selbst erstellte Textbox zentriert sein.

Also angenommen die Textbox liegt im Bereich wo dann die Tastatur erscheind sollte die Camera eben das ausgleichen, damit man sieht was man eingibt. Was aber eben ein Glückspiel ist, da "area" ein zero-Rect bei Android zurückliefert - steht so in der Unity-Doku auch schon getestet.

Bei dem Bild wo bei der Tastatur das Textfeld (der Android Tastatur) ausgeblendet ist habe ich die Bereiche grob markiert. Grün = Unity-Bereich, Rot = Tastaturbereich, Gelb = Wo sich mein selbst gebasteltes Textfeld befindet

 

Die ganzen Parameter bis auf "keyboardType" bringen in Bezug auf die Größe der Tastatur nichts.

 

Parameters

text Text to edit. keyboardType Type of keyboard (eg, any text, numbers only, etc). autocorrection Is autocorrection applied? multiline Can more than one line of text be entered? secure Is the text masked (for passwords, etc)? alert

Is the keyboard opened in alert mode? textPlaceholder

Text to be used if no other text is present.

 

Thx & Bye

delspeedy

 

p.s. Gibt es ein Tool bzw. einen fertigen Code mit dem man aus Unity heraus Screenshot machen kann?

post-4299-0-61882800-1398255851_thumb.png

post-4299-0-63535500-1398255874_thumb.png

post-4299-0-22565300-1398255897_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Leider hat das nix gebracht...Application.CaptureScreenshot Methode wird ausgeführt aber es wird nichts am handy gespeichert -> mein nächstes Problem!

 

1. Habe das ganze Handy durchsucht

2. Es gibt eine Verzögerung wenn ich speichern auswähle -> also wird irgendetwas abgearbeitet. Auch schon debuggt

3. Auch wenn ich im LogCat nachsehe finde ich keine Fehlermelung/Info dass es nicht geschrieben werden kann.

4. Habe auch versucht in Unity bei den Playersettings "Write Access" einzuschalten auch prefer Internal/External alles schon getestet

 

Warum wird das Bild nicht am Handy gespeichert? Muss man etwas zum "AndroidManifest.xml" hinzufügen ? Permissions?

 

hier http://docs.unity3d....Screenshot.html steht das man keinen Pfad angeben muss da "Application.persistentDataPath" benutzt wird. Habe ich aber auch mal vorne weg probiert.... :wacko:

 

void OnTouchUp() {
 actualMaterial.color = defaultColour;
 SetUnpressedText();
 string path = Application.persistentDataPath;
 Application.CaptureScreenshot("aaaaaaaaaaaa.png");
}

 

Habe jetzt mal einen Screenshot zusammengestellt den ich in Unity gemacht habe. Blau = da verdeckt die Tastatur den Unity-Screen und in diesem Bereich ist die Textbox (selbst gebaute!!)

 

Ach noch was jetzt bekomme ich folgende Info wenn ich einen Screenshot am Handy mache.

"Received 2014-04-23_16h28m24s.heapshot

UnityEditor.HeapshotWindow:EventHeapShotReceived(String)"

 

Thx & bye

delspeedy

 

p.s Manchmal sind so einfache Dinge die nervigsten :P

post-4299-0-85403900-1398263100_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe es nach langem suchen und fluchen endlich geschafft einen Screenshot zu machen - Doch es wird keine Tastatur abgebildet sondern nur das von Unity gerenderte Bild.

 

Was ich an der ganzen Sache jetzt nicht verstehe warum man im Windows-Explorer wenn ich aufs Handy zugreife nur diesen Ordner von der Applikation nicht sehe "/storage/emulated/0/Android......" ???

Habe aber eine andere Applikation da sehe ich im Windows-Explorer den Ordner.

Habe beide Einstellungsmöglichkeiten Write-Access Internal/External SD ausprobiert kein Unterschied.

 

Bezüglich einer brauchbaren moblie-GUI bin ich noch nicht schlauer :unsure:

 

bye

delspeedy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst auch vom Handy bzw. dem Betriebssystem einen Screenshot machen lassen. Die Screenshot-Funktion von Unity ist etwas eigenwillig.. --die macht das Bild z.B. erst ganz am Ende des Frames. Nicht an der Stelle an der die Methode aufgerufen wird.

 

Einige Ordner werden vom Betriebssystem versteckt und somit nicht angezeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit dem versteckten Ordner kann sein, aber bei einer anderen Anwendung die mit Unity erstellt ist sehe ich den Odner/Files auch im Windows-Explorer.

Screenshots kann ich mit dem Betriebssystem machen, aber nur wenn man den Notifycation-Bar sehe. Finde keine Einstellung wie ich sonst vom Android-Betriebsystem einen Screenshot auslösen könnte.

Zu dem Punkt das erst am Ende des Frames ein Shot gemacht wird:

Habe eine Funktion eingebaut das erst z.b. nach 5 Frames ein Shot gemacht wird. Die Tastatur ist trotzdem nicht zu sehen.

Nur der Screen von Unity gerenderte.

 

Und das mit dem eigenwillig stimmt, denn es hat glaub ich erst funtioniert als ich den gesamten Pfad an Directory.Create("pfad") übergeben habe. Seit dem funtioniert es auch wenn ich den Ordner wieder lösche, und neu installiere.

 

Bin noch immer nicht zufrieden weil ich einfach keine Größe für die eingeblendete Tastatur erhalte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

 

Screenshots kann ich mit dem Betriebssystem machen, aber nur wenn man den Notifycation-Bar sehe. Finde keine Einstellung wie ich sonst vom Android-Betriebsystem einen Screenshot auslösen könnte.

 

 

Bei Android kann man mit einer Wischbewegung der Handkante einen Screenshot machen. Das muss allerdings in den Einstellungen aktiviert sein..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe das mit den Screenshots nicht wirklich hinbekommen. Unity macht wie schon erwähnt nur einen Screenshot der Unity-Camera-Ansicht. Die Geste mit dem auseinander ziehen funktioniert beim meinem Handy nicht. Höre zwar manchmal ein Geräusch wie das eines Screenshots, aber es sind keine Shots auf dem Handy zu finden.

Was ich geschafft habe ist den Statusbalken/Notifycationbar einzublenden - da gibt es bei den Playersettings in Presention u. Resolution eine Option die man ein- und ausschalten kann. Wenn ich aber von der Tastatur einen Shot machen möchte dann wird die Tastatur (ich glaube bewusst) ausgeblendet und dann erst der Shot gemacht.

Das passiert aber nur wenn ich das Texteingabefeld (das von dem AndroidOS) Keyboard ausschalten. Mit dem Eingabefeld habe ich einen Screenshot machen können. siehe Anhang

 

Jetzt ist mir noch zusätzlich etwas ausgefallen - wenn ich den Statusbar mit anzeigen lasse, dann wird das Unitybild so verkleinert, dass es über der Tastatur angezeigt wird. aber leider nur wenn ich den Statusbar anzeigen lasse.

 

Hat jemand noch eine Idee wie ich an die Größe der Tastatur ran komme oder welche anderen Möglichkeiten es noch gibt?

post-4299-0-25676800-1398867854_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe das mal verwendet.

 

Chat starten

public void openChat() {
 #if UNITY_ANDROID && !UNITY_EDITOR
 if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) {
  keyboard = TouchScreenKeyboard.Open("");
 }
 #endif
 _isChatOnFocus = true;
}

 

void OnGUI

 if(_isChatOnFocus) {
#if UNITY_ANDROID && !UNITY_EDITOR
if(!TouchScreenKeyboard.visible && keyboard.done && !keyboard.wasCanceled) {
 checkAndSendChat(keyboard.text);
 closeChat();
}
#endif
 } else if(InputHandler.InputKeyPress.GUIchatKeyPressed()) {
  openChat();
 }

 

public void closeChat() {
 _isChatOnFocus = false;
 chatinputField = "";
}

 

Ich hab nun etwas verkürzt und den Windowsteil raus genommen, um verständlicher zu machen.

 

Eigentlich braucht man hier _isChatOnFocus nicht mehr, aber dann musste man die Keyboard variable anders machen. Eventuell neu beschreiben, damit keyboard.done nicht immer done ist ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

@MaZy !TouchScreenKeyboard. visible ist die Lösung für das etwas umständliche Abfragen ob die Eingabe beendet wurde. Vielen Dank! :lol: Vergesse ab und zu die statischen Methoden/Eigenschaften :blink:

 

Das mit dem sichtbaren Bereich über dem Keyboard kann ich wahrscheinlich nur so lösen, das ich annehme die Tastatur verdeckt im Landscape-Mode ca. die hälfte des Bildschirms. :rolleyes:

 

bye

delspeedy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...