android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,
也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。
android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。
android:cursorVisible设定光标为显示/隐藏,默认显示。
android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”
android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
android:drawableLeft在text的左边输出一个drawable,如图片。
android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。
android:drawableRight在text的右边输出一个drawable。
android:drawableTop在text的正上方输出一个drawable。
android:editable设置是否可编辑。
android:editorExtras设置文本的额外的输入数据。
android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;
”marquee” ——以跑马灯的方式显示(动画横向移动)
android:freezesText设置保存文本的内容以及光标的位置。
android:gravity设置文本位置,如设置成“center”,文本将居中显示。
android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在EditView中使用,但是这里也可以用。
android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细
说明,此处无用。
android:imeActionId设置IME动作ID。
android:imeActionLabel设置IME动作标签。
android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。
android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。
android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。
android:linksClickable设置链接是否点击连接,即使设置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度
android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:maxLength限制显示的文本长度,超出部分不显示。
android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines设置文本的最小行数,与lines类似。
android:lineSpacingExtra设置行间距。
android:lineSpacingMultiplier设置行间距的倍数。如”1.2”
android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。
android:password以小点”.”显示文本
android:phoneNumber设置为电话号码的输入方式。
android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。
android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。
android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。
android:shadowDx设置阴影横向坐标开始位置。
android:shadowDy设置阴影纵向坐标开始位置。
android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine "
android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:text设置显示文本.
android:textAppearance设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的
外观。可设置的值如下:
textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmal
l/textAppearanceSmallInverse
android:textColor设置文本颜色
android:textColorHighlight被选中文字的底色,默认为蓝色
android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。
android:textColorLink文字链接的颜色.
android:textScaleX设置文字之间间隔,默认为1.0f。
android:textSize设置文字大小,推荐度量单位”sp”,如”15sp”
android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开
android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]
android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight设置文本区域的最大高度
android:minHeight设置文本区域的最小高度
android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width的区别看这里。
android:maxWidth设置文本区域的最大宽度
android:minWidth设置文本区域的最小宽度
1.TextView之跑马灯效果
android:ellipsize属性使用之跑马灯效果 android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置: "start"—–省略号显示在开头 "end"——省略号显示在结尾 "middle"—-省略号显示在中间 "marquee" ——以跑马灯的方式显示(动画横向向左移动) 布局文件中给TextView加入如下属性即可: android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:focusable="true" android:focusableInTouchMode="true"
<!-- 布局文件中设置如下(完整代码稍后给出) --> <TextView android:id="@+id/marquee_effect" android:layout_width="100dip" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="@string/marquee_effect" />
如果一个页面想实现多个TextView同时跑马灯效果解决方案:给要跑动的textview加上如下代码就行了
textview.setSelected(true);
2.TextView之阴影效果(可在布局文件里加入如下属性进行设置也可通过程序设置)
android:shadowDx——设置阴影横向坐标开始位置(相对于文本内容)
android:shadowDy——设置阴影纵向坐标开始位置(相对于文本内容)
android:shadowRadius——设置阴影的半径
android:shadowColor——指定文本阴影的颜色
//关键代码(完整代码稍后给出) textview.setShadowLayer(2.5f, 15, -10, 0xff00ff00);
3.html标签设置样式效果
补充:
textView.setAutoLinkMask(Linkify.WEB_URLS);// 当文本内容中包含超链接格式的文本时,自动转换成超链接样式,点击会自动跳转到指定的网页
textView.setAutoLinkMask(Linkify.PHONE_NUMBERS);//自动转手机号码点击它可进入系统拨号界面
textView.setAutoLinkMask(Linkify.EMAIL_ADDRESSES);//自动转邮件地址点击它可发送邮件(要提前设置好自己的电子邮件)
textView.setAutoLinkMask(Linkify.MAP_ADDRESSES);//自动转街道地址点击它可查看位置(前提已安装了google地图)
textView.setAutoLinkMask(Linkify.ALL);//包括上面4种情况
关键代码(完整代码稍后给出):
TextView tv = (TextView) findViewById(R.id.fromhtml_effect); StringBuffer sb = new StringBuffer(); sb.append("<h1><font color='#ff0000'>Html标签方式:</font></h1>"); sb.append("<h6><b><i><font color='#00ff00'><a href='http://www.cnblogs.com/bravestarrhu/'>"); sb.append(getString(R.string.fromhtml_effect)); sb.append("</a></font></i></b></h6>"); tv.setText(Html.fromHtml(sb.toString())); tv.setMovementMethod(LinkMovementMethod.getInstance());// 这句很重要,使超链接<a href>起作用
4.TextView之动画效果(rotate旋转、alpha透明度、scale缩放、translate移动)
实现动画需要在res/anim目录下新建对应的xml文件(稍后给出)
关键代码(完整代码稍后给出):
TextView tv = null; // TextView旋转 动画效果 tv = (TextView) findViewById(R.id.rotate); Animation mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.rotate); tv.setAnimation(mAnimationRight); // TextView透明度动画效果 tv = (TextView) findViewById(R.id.alpha); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.alpha); tv.setAnimation(mAnimationRight); // TextView缩放动画效果 tv = (TextView) findViewById(R.id.scale); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.scale); tv.setAnimation(mAnimationRight); // TextView移动动画效果 tv = (TextView) findViewById(R.id.translate); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.translate); tv.setAnimation(mAnimationRight);
5.TextView之霓虹灯效果
采用timer+TimerTask+Handler实现
主要用到SpannableStringBuilder对象
关键代码(完整代码稍后给出):
// 霓虹灯效果(此段代码会使"光"变红色) String wholeContent = "欢迎光临"; SpannableStringBuilder spannable = new SpannableStringBuilder( wholeContent); spannable.setSpan(new ForegroundColorSpan(Color.RED), 2, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); // 设置指定位置文字的颜色(索引0开始)
6.TextView之包含图片的效果
实现步骤(1.构建ImageGetter;2.直接使用append进行追加)
关键代码(完整代码稍后给出):
TextView tv = (TextView) findViewById(R.id.image_effect); tv.setText(R.string.image_effect); // 通过HTML标记获得res目录下指定的图片 ImageGetter imageGetter = new ImageGetter() { @Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); // 根据id从资源文件中获取图片对象 Drawable d = getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return d; } }; tv.append(Html.fromHtml("<img src='" + R.drawable.log + "'/>", imageGetter, null));
上图:
目录结构如下:
完整代码:
1>清单文件AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bravestarr.app.textvieweffect" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".TextViewEffectActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2>main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- android:ellipsize属性使用之跑马灯效果 android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置: "start"—–省略号显示在开头 "end"——省略号显示在结尾 "middle"—-省略号显示在中间 "marquee" ——以跑马灯的方式显示(动画横向向左移动) 关键代码: android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" 如果一个页面想实现多个TextView同时跑马灯效果解决方案:代码中给要跑动的textview加上textview.setSelected(true);就行了 --> <TextView android:id="@+id/marquee_effect" android:layout_width="100dip" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="@string/marquee_effect" /> <!-- TextView之阴影效果 android:shadowDx——设置阴影横向坐标开始位置(相对于文本内容) android:shadowDy——设置阴影纵向坐标开始位置(相对于文本内容) android:shadowRadius——设置阴影的半径 android:shadowColor——指定文本阴影的颜色 --> <TextView android:id="@+id/shadow_effect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" /> <!-- html设置样式效果 --> <TextView android:id="@+id/fromhtml_effect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" /> <!-- 动画效果 --> <TextView android:id="@+id/alpha" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/alpha_animation_effect" /> <TextView android:id="@+id/rotate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rotate_animation_effect"/> <TextView android:id="@+id/scale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/scale_animation_effect"/> <TextView android:id="@+id/translate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/translate_animation_effect"/> <!-- 霓虹灯效果 --> <TextView android:id="@+id/neonlights_effect" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- 包含图片的效果 --> <TextView android:id="@+id/image_effect" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
3>strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">TextView效果集锦</string> <string name="marquee_effect">跑马灯效果</string> <string name="shadow_effect">阴影效果</string> <string name="fromhtml_effect">fromhtml设置效果</string> <string name="alpha_animation_effect">文本透明度动画效果</string> <string name="rotate_animation_effect">文本旋转动画效果</string> <string name="scale_animation_effect">文本缩放动画效果</string> <string name="translate_animation_effect">文本移动动画效果</string> <string name="neonlights_effect">霓虹灯效果</string> <string name="image_effect">包含图片的TextView效果</string> </resources>
4>alpha.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.0" android:repeatCount="10"/> </set> <!-- fromAlpha:开始时透明度 toAlpha: 结束时透明度 duration:动画持续时间 应用: 例1:淡出效果 android:fromAlpha="1.0" android:toAlpha="0.0" 例2:淡入效果 android:fromAlpha="0.0" android:toAlpha="1.0" -->
5>rotate.xml
<?xml version="1.0" encoding="utf-8"?> <set> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromDegrees="0" android:interpolator="@android:anim/linear_interpolator" android:pivotX="50%" android:pivotY="50%" android:repeatCount="10" android:toDegrees="-90" /> </set> <!-- fromDegrees 动画开始时的角度 toDegrees 动画结束时物件的旋转角度,正代表顺时针 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 duration:动画持续时间 -->
6>scale.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator= "@android:anim/decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.5" android:fromYScale="0.0" android:toYScale="1.5" android:pivotX="50%" android:pivotY="50%" android:startOffset="0" android:duration="5000" android:repeatCount="3" android:repeatMode="reverse" /> </set> <!-- interpolator指定动画插入器,常见的有加速减速插入器accelerate_decelerate_interpolator,加速插入器accelerate_interpolator,减速插入器decelerate_interpolator。 fromXScale,fromYScale,动画开始前X,Y的缩放,0.0为不显示,1.0为正常大小 toXScale,toYScale,动画最终缩放的倍数,1.0为正常大小,大于1.0放大 pivotX,pivotY动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从屏幕中间开始 startOffset,动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒 duration,一次动画效果消耗的时间,单位毫秒,值越小动画速度越快 repeatCount,动画重复的计数,动画将会执行该值+1次 repeatMode,动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变 -->
7>translate.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="320" android:toXDelta="0" android:fromYDelta="480" android:toYDelta="0" android:duration="5000" android:repeatCount="10" /> </set> <!-- fromXDelta,fromYDelta起始时X,Y座标,屏幕右下角的座标是X:320,Y:480 toXDelta,toYDelta动画结束时X,Y的座标 -->
8>TextViewEffectActivity.java
package com.bravestarr.app.textvieweffect; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Html; import android.text.Html.ImageGetter; import android.text.method.LinkMovementMethod; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.TextView; import com.bravestarr.app.utils.SpannableStringBuilderUtils; /** * @Author BraveStarr * @QQ 1733259520 * @Blog http://www.cnblogs.com/bravestarrhu/,http://blog.sina.com.cn/ * wanghubravestarr * */ public class TextViewEffectActivity extends Activity { private static final int[] colors = new int[] { Color.RED, Color.GRAY, Color.GREEN, Color.LTGRAY, Color.BLUE }; private int currColor = 0;// 当前第一个文字的颜色 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = null; // 跑马灯效果文本框 tv = (TextView) findViewById(R.id.marquee_effect); tv.setTextSize(28); tv.setTextColor(0xffd0eeee); tv.setSelected(true);// 要实现界面上有多个跑马灯时需要加入这句 // 阴影效果 tv = (TextView) findViewById(R.id.shadow_effect); tv.setTextSize(28); tv.setTextColor(0xffd0eeee); tv.setText(R.string.shadow_effect); tv.setShadowLayer(2.5f, 15, -10, 0xff00ff00); // HTML标签实现效果 tv = (TextView) findViewById(R.id.fromhtml_effect); // 当文本内容中包含超链接格式的文本时,自动转换成超链接样式,点击会自动跳转到指定的网页,文本框还能实现自动转手机号码/邮件/地图 // Linkify.PHONE_NUMBERS为自动转手机号码点击它可进入系统拨号界面 // Linkify.EMAIL_ADDRESSES为自动转邮件地址点击它可发送邮件(要提前设置好自己的电子邮件) // Linkify.MAP_ADDRESSES为自动转街道地址点击它可查看位置(前提已安装了google地图) // Linkify.ALL包括WEB_URLS、EMAIL_ADDRESSES、PHONE_NUMBERS和MAP_ADDRESSES // tv.setAutoLinkMask(Linkify.WEB_URLS); StringBuffer sb = new StringBuffer(); sb.append("<h1><font color='#ff0000'>Html标签方式:</font></h1>"); sb.append("<h6><b><i><font color='#00ff00'><a href='http://www.cnblogs.com/bravestarrhu/'>"); sb.append(getString(R.string.fromhtml_effect)); sb.append("</a></font></i></b></h6>"); tv.setText(Html.fromHtml(sb.toString())); tv.setMovementMethod(LinkMovementMethod.getInstance());// 这句很重要,使超链接<a href>起作用 // TextView旋转 动画效果 tv = (TextView) findViewById(R.id.rotate); Animation mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.rotate); tv.setAnimation(mAnimationRight); // TextView透明度动画效果 tv = (TextView) findViewById(R.id.alpha); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.alpha); tv.setAnimation(mAnimationRight); // TextView缩放动画效果 tv = (TextView) findViewById(R.id.scale); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.scale); tv.setAnimation(mAnimationRight); // TextView移动动画效果 tv = (TextView) findViewById(R.id.translate); mAnimationRight = AnimationUtils.loadAnimation( TextViewEffectActivity.this, R.anim.translate); tv.setAnimation(mAnimationRight); // 霓虹灯效果,延时1秒转第一次,从此以后每隔1秒又开始执行执行 timer.schedule(task_neon, 1000, 1000); // 包含图片的效果(1.构建ImageGetter;2.直接使用append进行追加) tv = (TextView) findViewById(R.id.image_effect); tv.setText(R.string.image_effect); // 通过HTML标记获得res目录下指定的图片 ImageGetter imageGetter = new ImageGetter() { @Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); // 根据id从资源文件中获取图片对象 Drawable d = getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return d; } }; tv.append(Html.fromHtml("<img src='" + R.drawable.log + "'/>", imageGetter, null)); } Timer timer = new Timer(); TimerTask task_neon = new TimerTask() { public void run() { Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; final Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: // 霓虹灯效果 TextView tv = (TextView) findViewById(R.id.neonlights_effect); String neontext = getString(R.string.neonlights_effect); int len = neontext.length(); int colorsize = colors.length; List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); for (int i = 0; i < len; i++) { int index = currColor + i;// 颜色索引 if (index >= colorsize) index = index % colorsize; Map<String, Object> target = new HashMap<String, Object>(); target.put("content", neontext.substring(i, i + 1)); target.put("color", colors[index]); data.add(target); } currColor++; if (currColor == colorsize) currColor = 0; tv.setText(SpannableStringBuilderUtils .highlight(neontext, data)); break; } super.handleMessage(msg); } }; protected void onDestroy() { if (timer != null) { timer.cancel(); timer = null; } super.onDestroy(); } }
9>SpannableStringBuilderUtils.java
package com.bravestarr.app.utils; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; /** * @Author BraveStarr * @QQ 1733259520 * @Blog http://www.cnblogs.com/bravestarrhu/,http://blog.sina.com.cn/wanghubravestarr * * SpannableStringBuilder助手类 */ public class SpannableStringBuilderUtils { /** * 指定内容高亮显示(此方法缺点:变色目标文字有多处匹配时效果不好) * @param wholeContent 文本内容 * @param data Map<String, Object>数组包含"content"和"color"字段 * @return * * 如何使用 * * String content = "文本框局部改变颜色" * List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); Map<String, Object> target = null; target = new HashMap<String, Object>(); target.put("content", "改变");//指定要改变颜色的内容 target.put("color", Color.RED);//指定颜色 data.add(target); textview.setText(highlight(content, data)); */ public static SpannableStringBuilder highlight(String wholeContent, List<Map<String, Object>> data) { SpannableStringBuilder spannable = new SpannableStringBuilder( wholeContent); for (Map<String, Object> targetdata : data) { Pattern p = Pattern.compile(targetdata.get("content").toString()); Matcher m = p.matcher(wholeContent); while (m.find()) { spannable.setSpan( new ForegroundColorSpan(Integer.valueOf(targetdata.get("color").toString())), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } return spannable; } /** * * @param wholeContent 文本内容 * @param data Map<String, Object>数组包含"start"、"end"和"color"字段 * @return * 如何使用 * * String content = "文本框局部改变颜色" * List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); Map<String, Object> target = new HashMap<String, Object>(); target.put("start", "5");//指定要改变颜色的起始位置 target.put("end", "7");//指定要改变颜色的结束位置 target.put("color", Color.RED);//指定颜色 data.add(target); textview.setText(subHighlight(content, data)); */ public static SpannableStringBuilder subHighlight(String wholeContent, List<Map<String, Object>> data) { SpannableStringBuilder spannable = new SpannableStringBuilder( wholeContent); for (Map<String, Object> targetdata : data) { int color = Integer.valueOf(targetdata.get("color").toString()); int start = Integer.valueOf(targetdata.get("start").toString()); int end = Integer.valueOf(targetdata.get("end").toString()); spannable.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); // 设置指定位置文字的颜色(索引0开始) } return spannable; } }
附件下载:
apk安装包下载
源码打包下载
补充:连续动画实现,比如一个文本框在屏幕最底部,然后向上冒出,停留一会后,再向下移出屏幕
关键代码如下:
1.给指定的文本框设置内容(含图片)
tip = (TextView)findViewById(R.id.tip);
tip.setText(
"按下"
);
ImageGetter imageGetter =
new
ImageGetter() {
@Override
public
Drawable getDrawable(String source) {
int
id = Integer.parseInt(source);
// 根据id从资源文件中获取图片对象
Drawable d = getResources().getDrawable(id);
d.setBounds(
0
,
0
, d.getIntrinsicWidth(), d.getIntrinsicHeight());
return
d;
}
};
tip.append(Html.fromHtml(
"<img src='"
+ R.drawable.back_image +
"'/>"
,
imageGetter,
null
));
tip.append(
"可取消测速并返回选区界面"
);
|
2.
private TextView tip; private int currStatus;//当前状态,UP,STAY ,或DOWN private static final int UP = 1;//向上移动状态 private static final int STAY =2;//停留状态 private static final int DOWN = 3;//向下移动状态 private static final int UP_TIME = 2*1000;//向上移动用时 private static final int STAY_TIME = 3*1000;//到达目标后停留用时 private static final int DOWN_TIME = 2*1000;//向下移动用时 private int time;//(某)动画的运行时间 /** * 更新移动的当前状态 */ private void updateCurrStatus(){ if(currStatus<3){ currStatus++; }else{ currStatus = 1; } } /** * 移动动画处理 * @param StartX * @param StartY * @param EndX * @param EndY */ private void moveTip(int StartX,int StartY,int EndX,int EndY){ TranslateAnimation translateAnimation = new TranslateAnimation(StartX,EndX,StartY,EndY); translateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { updateCurrStatus(); //在动画结束时,重新启动动画 switch(currStatus){ case UP: time=STAY_TIME; //此处的68为tip文本框的背景图的高 moveTip(0, -68, 0, -68); break; case STAY: time = DOWN_TIME; moveTip(0, -68, 0, 0); break; case DOWN: break; } } }); translateAnimation.setDuration(time); tip.startAnimation(translateAnimation); }
3.(onCreate()方法中)启动动画时调用如下代码
time = UP_TIME;
moveTip(
0
,
0
,
0
,-
68
);<span style=
"color: #000000;"
><span style=
"color: #008000;"
>
//此处的68为tip文本框的背景图的高</span></span>
|