Cambiar la altura y el ancho de EditText en Runtime con alguna animación
Tengo cuatro EditText con diverso fondo. Se parece a esto:
Quiero cubrir la pantalla completa cuando un EditText se selecciona con That EditText. Para eso necesito cambiar el anchura y la altura de EditText con una cierta animación en tiempo de ejecución.
- NullPointerException en el adaptador personalizado getView
- Cómo rellenar un listview asincrónicamente?
- Fila personalizada en una listaPreferencia?
- GridView OnItemClickListener no está llamando a onItemClick
- Cómo controlar ListView con el patrón MVP para Android
Cuando se selecciona Debe tener este aspecto:
¿Cómo puedo cambiar el tamaño de EditText con animación en tiempo de ejecución?
- ListView de Android con casilla de verificación: desactiva automáticamente
- Acceder a objetos personalizados en una vista de lista
- ¿Los servicios del sistema no están disponibles para las actividades antes de crear?
- Desplazarse a / establecer la posición de la preferencia de lista personalizada
- android: ¿cómo conservo los datos en mi arrayadapter / listview cuando cambia la orientación?
- Cómo terminar una actividad desde un adaptador ..?
- CursorLoader para varios ContentProviders
- ¿Devolver la fila vacía en Custom ArrayAdapter?
No estoy seguro de si se puede hacer con Animations
. En la vista de Android se tarda todo el espacio antes de terminar la animación, por lo que verá que otros editTexts desaparece y selecciona uno que aumenta lentamente. Aquí está el ejemplo aproximado cómo hacerlo sin animaciones estándar, pero cambiando pesos en hilo separado:
diseño:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/ll0" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" > <EditText android:id="@+id/et00" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="top|left" android:text="00" /> <EditText android:id="@+id/et01" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="top|left" android:text="01" /> </LinearLayout> <LinearLayout android:id="@+id/ll1" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" > <EditText android:id="@+id/et10" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="top|left" android:text="10" /> <EditText android:id="@+id/et11" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="top|left" android:text="11" /> </LinearLayout> </LinearLayout>
Y en código añadir acciones en el cambio de enfoque:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); OnFocusChangeListener focusListener = new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { LinearLayout parent = (LinearLayout) v.getParent(); EditText forDecresing = null; for (int i = 0; i < parent.getChildCount(); i++) { if (parent.getChildAt(i) != v) { forDecresing = (EditText) parent.getChildAt(i); break; } } LinearLayout pp = (LinearLayout) parent.getParent(); LinearLayout layoutForDecreasing = null; for (int i = 0; i < pp.getChildCount(); i++) { if (pp.getChildAt(i) != parent && pp.getChildAt(i) instanceof LinearLayout) { layoutForDecreasing = (LinearLayout) pp.getChildAt(i); break; } } startAnimation((EditText) v, forDecresing, layoutForDecreasing, parent); } else { } } }; ((EditText) findViewById(R.id.et00)).setOnFocusChangeListener(focusListener); ((EditText) findViewById(R.id.et01)).setOnFocusChangeListener(focusListener); ((EditText) findViewById(R.id.et11)).setOnFocusChangeListener(focusListener); ((EditText) findViewById(R.id.et10)).setOnFocusChangeListener(focusListener); } public void onBackPressed() { setWeight(findViewById(R.id.et00), 1); setWeight(findViewById(R.id.et01), 1); setWeight(findViewById(R.id.et11), 1); setWeight(findViewById(R.id.et10), 1); setWeight(findViewById(R.id.ll1), 1); setWeight(findViewById(R.id.ll0), 1); } Thread animationThread; private void startAnimation(final EditText forIncreasing, final EditText forDecresing, final LinearLayout layoutForDecreasing, final LinearLayout layoutForIncreasing) { if (animationThread != null) animationThread.interrupt(); animationThread = new Thread(new Runnable() { @Override public void run() { int iterations = 0; int maxIterations = 30; setWeight(forIncreasing, maxIterations - 1); setWeight(layoutForIncreasing, maxIterations - 1); setWeight(forDecresing, maxIterations - 1); setWeight(layoutForDecreasing, maxIterations - 1); while (iterations < maxIterations) { iterations++; setWeight(forIncreasing, maxIterations - 1 + iterations); setWeight(layoutForIncreasing, maxIterations - 1 + iterations); setWeight(forDecresing, maxIterations - 1 - iterations); setWeight(layoutForDecreasing, maxIterations - 1 - iterations); try { Thread.sleep(10); } catch (InterruptedException e) { return; } } animationThread = null; } }); animationThread.start(); } private void setWeight(final View view, final float weight) { runOnUiThread(new Runnable() { @Override public void run() { LayoutParams params = (LayoutParams) view.getLayoutParams(); params.weight = weight; view.setLayoutParams(params); } }); }
No sé si esto es posible para usted, pero en este ejemplo puede agregar algunos movimientos más fácil.
No recomiendo su uso de producción, si sólo tiene algunas otras opciones.
RESPUESTA ACTUALIZADA:
Utilice este código en drawable / animation_sample.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="0%" android:toXDelta="100%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="500" />
Y fije la animación al texto de la edición usando:
Animation anim=AnimationUtils.loadAnimation( this, R.anim.righttoleft); editText = (EditText)findViewById(R.id.editText1); Display display = getWindowManager().getDefaultDisplay(); int width=display.getWidth(); int height = display.getHeight(); editText.setWidth(width); editText.setHeight(height); editText.startAnimation(anim);
He tratado de explicar mi lógica para su problema … espero que funcione para usted ..
EditText editText = new EditText(this); editText.setOnClickListener(new OnClickListener() { public void onClick(){ // Before getSize was introduced (in API level 13), you could use // the getWidth and getHeight methods that are now deprecated: Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); editText.setWidth(width); editText.setHeight(height); } }
- Android Development en Eclipse: Siempre abre nuevo emulador
- Picasso java.lang.IllegalStateException: La llamada al método no debería ocurrir desde el hilo principal