c# - script - obtener la posicion de un objeto unity
¿Cómo cambiar el tamaño de la vista cuando el teclado de la pantalla táctil está visible en Android con Unity? (2)
En Unity no puedo controlar el teclado de la pantalla táctil. La clase TouchScreenKeyboard tiene solo un parámetro para Android.
if(TouchScreenKeyboard.visible)
{ float keyboardHeight = TouchScreenKeyboard.area.height;
// will resize the view here! But this return zero!
}
¿Hay alguna otra forma de saber la altura del teclado en Android?
Esto debería hacer el truco (se encuentra aquí ):
public int GetKeyboardSize()
{
using(AndroidJavaClass UnityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
AndroidJavaObject View = UnityClass.GetStatic<AndroidJavaObject>("currentActivity").Get<AndroidJavaObject>("mUnityPlayer").Call<AndroidJavaObject>("getView");
using(AndroidJavaObject Rct = new AndroidJavaObject("android.graphics.Rect"))
{
View.Call("getWindowVisibleDisplayFrame", Rct);
return Screen.height - Rct.Call<int>("height");
}
}
}
Fue hace mucho tiempo, pero por si acaso alguien está luchando con él de nuevo, logré encontrar una solución para un panel con un InputField usando esta clase MonoBehaviour. Lo adjunté al InputField y vinculé el panel que debería cambiar de tamaño.
public class InputFieldForScreenKeyboardPanelAdjuster : MonoBehaviour {
// Assign panel here in order to adjust its height when TouchScreenKeyboard is shown
public GameObject panel;
private InputField inputField;
private RectTransform panelRectTrans;
private Vector2 panelOffsetMinOriginal;
private float panelHeightOriginal;
private float currentKeyboardHeightRatio;
public void Start() {
inputField = transform.GetComponent<InputField>();
panelRectTrans = panel.GetComponent<RectTransform>();
panelOffsetMinOriginal = panelRectTrans.offsetMin;
panelHeightOriginal = panelRectTrans.rect.height;
}
public void LateUpdate () {
if (inputField.isFocused) {
float newKeyboardHeightRatio = GetKeyboardHeightRatio();
if (currentKeyboardHeightRatio != newKeyboardHeightRatio) {
Debug.Log("InputFieldForScreenKeyboardPanelAdjuster: Adjust to keyboard height ratio: " + newKeyboardHeightRatio);
currentKeyboardHeightRatio = newKeyboardHeightRatio;
panelRectTrans.offsetMin = new Vector2(panelOffsetMinOriginal.x, panelHeightOriginal * currentKeyboardHeightRatio);
}
} else if (currentKeyboardHeightRatio != 0f) {
if (panelRectTrans.offsetMin != panelOffsetMinOriginal) {
SmartCoroutine.DelayedExecute(this, () => {
Debug.Log("InputFieldForScreenKeyboardPanelAdjuster: Revert to original");
panelRectTrans.offsetMin = panelOffsetMinOriginal;
}, 0.5f);
}
currentKeyboardHeightRatio = 0f;
}
}
private float GetKeyboardHeightRatio() {
if (Application.isEditor) {
return 0.4f; // fake TouchScreenKeyboard height ratio for debug in editor
}
#if UNITY_ANDROID
using (AndroidJavaClass UnityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
AndroidJavaObject View = UnityClass.GetStatic<AndroidJavaObject>("currentActivity").Get<AndroidJavaObject>("mUnityPlayer").Call<AndroidJavaObject>("getView");
using (AndroidJavaObject rect = new AndroidJavaObject("android.graphics.Rect")) {
View.Call("getWindowVisibleDisplayFrame", rect);
return (float)(Screen.height - rect.Call<int>("height")) / Screen.height;
}
}
#else
return (float)TouchScreenKeyboard.area.height / Screen.height;
#endif
}
}