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.
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>