These days in the imitation of Sina Weibo client, in the processing of micro-blog information need to deal with the keyword highlighting and Weibo expression, check some information, decided to record something
First look at the following:
Like the above # topic #, @XXX nickname, HTTP: Web links and other elements, in the micro-Borrie is highlighted as a blue effect.
So how should we dynamically implement these effects in our Android program development?
Actually very simple, I wrote a small example, first look at:
In fact, to achieve this effect is very simple, in Android has helped us to encapsulate a series of tools, such as:
android.text.Spanned
Android.text.SpannableString
Android.text.SpannableStringBuilder
Spannablestring and Spannablestringbuilder can be used to set different spans, can easily be personalized textview, such as bold, italic, foreground color, background color, font size, font style and so on, A number of span types are defined in android.text.style.* to be used.
In fact, there is nothing to say, this is just a tool class, only need to master his general use of the method can be, here directly on the code (annotated)
1 Packagecom.example.spannabletest;2 3 ImportJava.util.HashMap;4 ImportJava.util.Map;5 ImportJava.util.regex.Matcher;6 ImportJava.util.regex.Pattern;7 8 Importandroid.app.Activity;9 ImportAndroid.graphics.Color;Ten Importandroid.graphics.drawable.Drawable; One ImportAndroid.os.Bundle; A Importandroid.text.SpannableString; - Importandroid.text.Spanned; - ImportAndroid.text.style.ForegroundColorSpan; the ImportAndroid.text.style.ImageSpan; - ImportAndroid.text.style.RelativeSizeSpan; - ImportAndroid.widget.TextView; - + Public classMainactivityextendsActivity { - + PrivateTextView TextView; A at //string to convert - PrivateString info= "#我爱JAVA # my Weibo name: @Balla_ rabbit [Rabbit]http://weibo.com/lichenwei1992]; - - @Override - protected voidonCreate (Bundle savedinstancestate) { - Super. OnCreate (savedinstancestate); in Setcontentview (r.layout.activity_main); -textview=(TextView) Findviewbyid (R.ID.TX); to + - the * /** $ * There are many tools for personalizing TextView content on Android, which can be used instead of regular string. Panax Notoginseng * android.text.Spanned - * android.text.SpannableString the * Android.text.SpannableStringBuilder + * A * Since the Spannable class finally implements the Charsequence interface, it is possible to direct spannablestring and Spannablestringbuilder through Textview.settext () Set to TextView. the */ + - //instantiate a Spannable object $Spannablestring spannablestring=Newspannablestring (info); $ //Use the Setspan () method to define different style content - //Set Font - //mode one: direct positioning theSpannablestring.setspan (NewForegroundcolorspan (Color.Blue), 0, 8, spanned.span_exclusive_exclusive); - //mode two: matching string tool class positioningWuyiSpannablestring.setspan (NewForegroundcolorspan (Color.Blue), Info.indexof ("@"), Info.indexof (""), spanned.span_exclusive_exclusive); the //method Three, using regular expression to match the positioning -Map<string,integer> map=gethttppostion (); WuSpannablestring.setspan (NewForegroundcolorspan (Color.Blue), Map.get ("Start"), Map.get ("End"), spanned.span_exclusive_exclusive); - About //Set Font size $Spannablestring.setspan (NewRelativesizespan ((float) 1.5, Map.get ("Start")), Info.length (), spanned.span_exclusive_exclusive); - //Set Picture Emoticons -Drawable drawable=getresources (). getdrawable (R.drawable.d_tuzi); -Drawable.setbounds (0, 0, Drawable.getintrinsicwidth (), Drawable.getintrinsicheight ()); ASpannablestring.setspan (NewImagespan (drawable), Info.indexof ("["), Info.indexof ("]") +1, spanned.span_inclusive_inclusive); + the - Textview.settext (spannablestring); $ the the } the the PublicMap<string,integer>gethttppostion () { -Map<string,integer> map=NewHashmap<string,integer>(); inPattern pattern=pattern.compile ("http:.*"); theMatcher matcher=Pattern.matcher (info); the if(Matcher.find ()) { AboutMap.put ("Start", Matcher.start ()); theMap.put ("End", Matcher.end ()); the } the returnmap; + - } the Bayi the the -}
How to use:
1, to use personalized textview, we need to create a spannablestring or Spannablestringbuilder, the difference is that spannablestring like a string, A string is passed in when the object is constructed, and then the contents of the string cannot be changed, and multiple spannablestring cannot be spliced, while the Spannablestringbuilder is more like StringBuilder. It can use its append () method to stitch multiple strings.
Spannablestring class:
Spannablestringbuffer class:
2. After you have created the Spannable objects, you can set span for them to achieve the desired personalization (both spannablestring and Spannablestringbuilder have an identical span method)
Here is the API:
Parameter one: Object what (here refers to the style)
Absolutesizespan (int size): Sets the font size, which is an absolute value, equivalent to the font size in Word.
Relativesizespan (float proportion): Sets the font size, and the argument is a multiple of the default font size.
Scalexspan (float proportion): Scaled font, similar to the above, the default is 1, set is the original multiplied by proportion, greater than 1 o'clock magnification (zoon in), smaller than when zoomed out (zoom out).
Backgroundcolorspan (int color): Background coloring, parameters are color values, you can directly use the constants defined in Android.graphics.Color, or with COLOR.RGB (int, int, int).
Foregroundcolorspan (int color): foreground shading, which is the coloring of words, with parameters consistent with background coloring.
Typefacespan (String family): font, parameter is the name of the font such as "sans", "Sans-serif" and so on.
Stylespan (Typeface style): Font style, such as bold, italic, parameters are Android.graphics.Typeface defined constants, such as Typeface.bold,typeface.italic and so on.
Strikethroughspan: If this style is set, a line will pass through all the words in the middle, as if it were crossed out.
For these sytle spans, it is common to use only the construction parameters described above, you do not need to set other properties, and if necessary, you can also set other properties, see the API documentation for details .
Parameters Two and three: (int start,int end)
Here is the location of the personalization match: There are many ways to achieve, such as direct write dead position, can also be used with some methods of the string class, such as: IndexOf (), can also write a regular matching method, if you want to match the match can be stored in a map collection, the case, According to your own project choice ha.
Parameter four: (int flags)
Commonly used are: (This is understood as a mathematical interval definition, open or closed interval)
Spanned.span_exclusive_exclusive---does not contain endpoints where both start and end are located
Spanned.span_exclusive_inclusive---does not contain end start, but contains the endpoint where end
Spanned.span_inclusive_exclusive---Contains both ends of start, but does not contain the endpoint where end
Spanned.span_inclusive_inclusive---contains endpoints where both start and end are located
There are some other attributes that are not listed here, so let's go through the API documentation.
Again to look at the source of spannablestring and Spannablestringbuffer, we can find that they have implemented the Charsequence interface, so they can directly in the Textview.settext () set
All right
Android Development Note-Personalized TextView (Sina Weibo)