Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo hacer un borde de selección que rastrea el botón de radio marcado?

Tengo un sistema de RadioButton s con un estilo de encargo. Quiero mostrar un borde alrededor del botón que está actualmente marcado. Esto debería ser bastante fácil con XML, pero ahora quiero que el borde sea animado. Si se marca un nuevo botón de opción, el borde debe volar a su nueva ubicación con una animación de fantasía:

 +------+ |* btn1| o btn2 +------+ +------+ ob|n1 * |tn2 +------+ +------+ o btn1 |* btn2| +------+ 

Debido a esto, decidí hacer el borde en un objeto separado de la View , así que puedo animarlo correctamente. El problema está en el seguimiento de la ubicación del botón de opción correspondiente en la pantalla.

Estoy tratando de hacerlo funcionar sin animaciones primero. Mi intento actual se parece a esto (solo mostrando los atributos relevantes):

  <RelativeLayout android:layout_alignParentLeft="true" android:layout_alignParentTop="true"> <RadioGroup android:id="@+id/radio_group"> <RadioButton/> <RadioButton/> <RadioButton/> </RadioGroup> <View android:id="@+id/selection_border" android:layout_alignParentLeft="true" android:layout_alignParentTop="true"/> </RelativeLayout> 

En el OnCheckedChangeListener del grupo de RadioGroup , muevo el borde de la selección alrededor fijando su margen (podría fijar la posición, pero eso es un poco más difícil con un RelativeLayout ):

 View radioButton = findViewById(checkedId); View selectionBorder = findViewById(R.id.selection_border); ViewGroup radioGroup = (ViewGroup)findViewById(R.id.radio_group); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(selectionBorder.getLayoutParams()); params.leftMargin = radioGroup.getLeft() + radioButton.getLeft(); params.topMargin = radioGroup.getTop() + radioButton.getTop(); selection.setLayoutParams(params); selection.requestLayout(); 

Sin embargo, los problemas ocurren en la inicialización. Dado que todavía no se ha realizado ningún diseño, la posición del borde se establece incorrectamente. No parece ser posible forzar un relayout de inmediato, y también no parece ser posible obtener un evento después de que se haya hecho el diseño.

Todo este lío me lleva a creer que debe haber una manera más limpia de lograr lo que quiero. ¿Ideas brillantes?

  • ¿Cómo inserto una imagen en una actividad con android studio?
  • Cómo obtener clics en RecyclerView (NO los niños)
  • Comprender cómo funcionan las coordenadas de drawRect o de dibujo en Android
  • Android UnsupportedOperationException: No se puede convertir a color: type = 0x2
  • Android DrawerLayout falla al usar las gravedades TOP e BOTTOM
  • Colores hexagonales en Android son algunas veces 8 dígitos. ¿Cómo? ¿Cuál es la diferencia entre #FFFFFF y # FFFFFF00
  • Distribución relativa No está por debajo de lo definido
  • Esta versión de la biblioteca de renderizado es más reciente que su versión de Android Studio. Actualiza Android Studio
  • 2 Solutions collect form web for “¿Cómo hacer un borde de selección que rastrea el botón de radio marcado?”

    La mejor manera que pienso es la caja de cheque del convite como imagen. Dos tipos comprobados / no comprobados. Entonces usted está básicamente moviendo una imagen a través de la pantalla. Maneje everthing con TouchEvents e imágenes si el usuario ratón abajo con la región radious de la imagen que usted sabe que han seleccionado. Esto es fácil porque ahora sólo se trata de imágenes, un lienzo y las coordenadas x, y estrellas.

    Para solucionar tu problema con la inicialización (he tenido muchos problemas en el pasado con esto mismo): Si necesito saber cuándo se completa el diseño de una vista, le doy un runnable en Activity.onCreate () y luego ejecutarlo desde View .onSizeChanged (). He llegado a utilizar este patrón un poco y lo he encontrado muy fiable. Sólo tiene que recordar llamar a la ejecución de onSizeChanged () si el nuevo ancho y la altura son mayores que 0 y si no son iguales a la anchura y la altura de edad.

    Así que en su actividad:

     public void onCreate() { ... yourView.setLayoutRunnable(new Runnable() { @Override public void run() { //do post-layout stuff... } }); ... } 

    Y en su opinión:

     public Runnable layoutRunner; public void setLayoutRunnable(Runnable runner) { layoutRunner = runner; } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { if (w > 0 && h > 0 && (w != oldw || h != oldh)) { if (layoutRunner != null) layoutRunner.run(); } } 

    Si tiene varias vistas que todos necesitan tener sus diseños terminados antes de hacer sus cosas, usted tiene que mantener un recuento a medida que recibe las notificaciones para que sepa cuando se hace.

    Y con respecto a su tema en general, he implementado algo similar a su concepto de botón de radio en un juego que escribí, pero decidí anular View desde cero para hacerlo. Tenía todas las opciones para un conjunto en una sola vista, por lo que realmente he reemplazado la vista RadioGroup en lugar de la vista RadioButton. Cada opción tenía un valor y una extensión. Siempre usaba el texto, pero las imágenes funcionaban con la misma facilidad. Luego sólo rastreé los grifos y arrastra en relación con las extensiones de las opciones y movió el "selector" en un controlador temporizado (a la animaciones en javascript).

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.