icon fontawesome font favicons content bootstrap awesome android

android - favicons - fontawesome io 3.2 1 icons



Animate MaxLines y Ellipsize (4)

Tengo vista de texto que contiene una parte de un texto. Cuando el usuario hace clic en la flecha, la vista de texto cambia de tamaño para que se muestre el texto completo. Vea las imágenes de abajo para un ejemplo:

TextView tiene una altura de wrap_content y, cuando se contrajo, maxLines = "4".

El onClick de la flecha contiene este código:

if (isExpanded) { btnToggle.setImageDrawable(getResources().getDrawable( R.drawable.arrow_down)); tvText.setMaxLines(4); tvText.setEllipsize(TruncateAt.END); } else { btnToggle.setImageDrawable(getResources().getDrawable( R.drawable.arrow_up)); tvText.setMaxLines(Integer.MAX_VALUE); tvText.setEllipsize(null); } isExpanded = !isExpanded;

Este código funciona, pero no está animado. Necesito animar la expansión, por lo que TextView se anima a su altura máxima. No puedo encontrar nada acerca de animar propiedades como MaxLines. ¿Quién me puede ayudar?


La respuesta aceptada es fundamentalmente errónea, porque obliga a la llamada de TextView.setMaxLines () muchas veces con el mismo valor sin razón, lo que hace que la animación resultante sea desigual.

Podría usar un simple ValueAnimator con un indicador lastValue en su lugar:

ValueAnimator animator = ValueAnimator.ofInt(fromThisLineCount, toThisLineCount).setDuration(250); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { int lastValue = -1; @Override public void onAnimationUpdate(ValueAnimator animation) { int value = (int) animation.getAnimatedValue(); if (value == lastValue) { return; } lastValue = value; yourTextView.setMaxLines(value); } }); animator.start();

Recuerde que la animación agrega / elimina 1 línea completa cada vez, por lo que aún puede verse desigual si la duración de la animación es demasiado alta o si afecta solo a unas pocas líneas. El mejor enfoque es crear una vista personalizada y realizar las mediciones adecuadas en Medida (consulte, por ejemplo, https://github.com/Manabu-GT/ExpandableTextView ).


Mientras que la animación de maxLines funciona, el resultado es un poco entrecortado ya que la altura de la vista maxLines mucho.

int startHeight = content.getMeasuredHeight(); content.setMaxLines(Integer.MAX_VALUE); content.measure( View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); int endHeight = content.getMeasuredHeight();

content es un TextView con maxLines establecido en 2. Ahora puede animar la altura de TextView lugar. Edición: TextView desplaza cuando no puede ajustarse a su contenido verticalmente, necesitarás soluciones. setMovementMethod(null) deshabilita el desplazamiento, pero también desactiva el clic del enlace. Porque el androide.


Puedes lograr esto usando un ObjectAnimator

ObjectAnimator animation = ObjectAnimator.ofInt( tvText, "maxLines", 25); animation.setDuration(4000); animation.start();

Esto aumentará la propiedad "maxLines" del TextView "tvText" de lo que inicialmente está configurado a, a 25, durante el período de 4000 milisegundos.

Ver más here y here .


Todas las otras soluciones no funcionaron muy bien para mí. La animación fue entrecortada o incluso parpadeando.

Lo que elegí hacer es animar la altura de LayParams en su lugar. Es posible que esta solución no se ajuste a todos los casos, pero para mí, parece funcionar bien. Aquí hay una demostración:

MainActivity.kt

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val expectedWidthOfTextView = resources.displayMetrics.widthPixels val originalMaxLines = textView.maxLines if (originalMaxLines < 0 || originalMaxLines == Integer.MAX_VALUE) Log.d("AppLog", "already unbounded textView maxLines") else { textView.maxLines = Integer.MAX_VALUE textView.measure( View.MeasureSpec.makeMeasureSpec(expectedWidthOfTextView, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) ) val measuredLineCount = textView.lineCount val measuredTargetHeight = textView.measuredHeight Log.d("AppLog", "lines:$measuredLineCount/$originalMaxLines") textView.maxLines = originalMaxLines if (measuredLineCount <= originalMaxLines) Log.d("AppLog", "fit in original maxLines") else { Log.d("AppLog", "exceeded original maxLines") textView.setOnClickListener { textView.setOnClickListener(null) textView.maxLines = Integer.MAX_VALUE val layoutParams = textView.layoutParams val animation = ValueAnimator.ofInt(textView.height, measuredTargetHeight) animation.addUpdateListener { valueAnimator -> val value: Int = valueAnimator.animatedValue as Int layoutParams.height = value textView.requestLayout() } animation.start() layoutParams.height = textView.height } } } } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:gravity="center_horizontal" android:layout_height="match_parent" android:animateLayoutChanges="true" tools:context=".MainActivity"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_def_app_icon"/> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ellipsize="end" android:maxLines="4" android:clickable="true" android:focusable="true" android:paddingEnd="16dp" android:paddingStart="16dp" android:textColor="#c1000000" android:textSize="14sp" android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_def_app_icon"/> </LinearLayout>