Cómo hacer que el primer carácter sea mucho más grande que otro en un TextView
Me gustaría mostrar un párrafo de texto largo como sigue. Esta es la instantánea de Flipboard.
Para lograr este efecto, intenté usar 2 TextView
.
<LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:text="T" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="76dp" android:text="op British supermarket Tesco (LSE: TSCO) (NASDAQOTH: TSCDY.US) is due to announce its half year results on" /> </LinearLayout>
Consigo el resultado siguiente.
Muy cerca. Pero no lo que quiero. Esto se debe a que la segunda línea y la tercera línea no se alinean a la izquierda. El espacio más a la izquierda para la segunda línea y tercera línea, está ocupado por el TextView
con fuente grande.
¿Hay alguna mejor técnica que pueda usar, como la de Flipboard?
Mediante el uso de un único TextView
con BufferType.SPANNABLE
resolverá el problema.
final SpannableString spannableString = new SpannableString(title); int position = 0; for (int i = 0, ei = title.length(); i < ei; i++) { char c = title.charAt(i); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { position = i; break; } } spannableString.setSpan(new RelativeSizeSpan(2.0f), position, position + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //titleTextView.setText(spannableString.toString()); titleTextView.setText(spannableString, BufferType.SPANNABLE);
Para mí probablemente usted tiene uso de 3 TextViews: 1 – Letra de párrafo 2 – primera y segunda línea 3 – resto del texto.
Prueba esto.
Diseño XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/bigChar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_vertical" android:text="T" android:textSize="40sp" /> <TextView android:id="@+id/sideText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_toRightOf="@id/bigChar" android:gravity="center_vertical" android:maxLines="2" /> <TextView android:id="@+id/spillText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/bigChar" android:layout_alignParentLeft="false" android:layout_below="@id/bigChar" android:layout_marginLeft="5dp" android:layout_marginTop="-5dp" android:gravity="center_vertical" /> </RelativeLayout>
Clase de actividad
public class MainActivity extends Activity { private String inputString = "op British supermarket Tesco (LSE: TSCO) (NASDAQOTH: TSCDY.US) is due to announce its half year results on and this is the extra bit of spill text"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView bigChar = (TextView) findViewById(R.id.bigChar); final TextView sideText = (TextView) findViewById(R.id.sideText); final TextView spillText = (TextView) findViewById(R.id.spillText); ViewTreeObserver vto = sideText.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout layout = sideText.getLayout(); int numOfLines = layout.getLineEnd(2); // split the string now String spillTextString = inputString.substring(numOfLines, inputString.length()); spillText.setText(spillTextString); } }); } }