具有载入和载出动画的TextView

关于倒计时分析可点击查看

布局文件设置:

<?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="match_parent"><TextSwitcherandroid:id="@+id/textSwitcher"android:background="#e6e6e6"android:layout_width="100dp"android:layout_height="100dp"android:layout_centerInParent="true" />
</RelativeLayout>

java代码中的设置:

public class TextSwitchActivity extends Activity {private TextSwitcher textSwitcher;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_text_switch);textSwitcher = (TextSwitcher)findViewById(R.id.textSwitcher);/*** 初始化倒计时类*/TimeCount timeCount=new TimeCount(100*1000,1000);/*** 文字加载动画*/textSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_in));//载入动画/*** 设置文字退出动画*/textSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_out));//载入动画textSwitcher.setFactory(new ViewSwitcher.ViewFactory() {@Overridepublic View makeView() {TextView textView = new TextView(TextSwitchActivity.this);/*** 设置字体颜色*/textView.setTextColor(Color.RED);///*** 设置字体大小*/textView.setTextSize(40);/*** 设置内边距*/textView.setPadding(10,10,10,10);/*** 设置字体居中*/textView.setGravity(Gravity.CENTER);/*** 设置TextView 宽高属性*/textView.setLayoutParams(new TextSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));//设置宽高属性return textView;}});timeCount.start();//倒计时类开始}private int count;class TimeCount extends CountDownTimer {//倒计时类public TimeCount(long millisInFuture, long countDownInterval) {//必须重载的构造方法super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long millisUntilFinished) {//计时过程中触发count=(int)millisUntilFinished/1000;textSwitcher.setText(count+"");}@Overridepublic void onFinish() {//计时结束时触发textSwitcher.setText("Dead");}}}

使用到的动画文件 :

载入动画设置:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><scaleandroid:interpolator="@android:anim/accelerate_interpolator"android:duration="800"android:fromXScale="1.0"android:toXScale="1.0"android:fromYScale="0.0"android:toYScale="1.0"android:pivotX="0.5"android:pivotY="100%"/>
</set>

退出动画设置:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><scaleandroid:duration="800"android:fromXScale="1.0"android:toXScale="0.5"android:fromYScale="1.0"android:toYScale="0.0"android:pivotX="0.5"android:pivotY="0%"/></set>

TextView中对于特殊字符的自动处理

例如 :自动识别 、网址 、电话号码  、邮箱等 ... ...

 <TextViewandroid:id="@+id/textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:autoLink="all"android:text="@string/hello_world" />

上面的这个textView就会自动地去识别其中的特殊字符,识别后,如果可以自动的调用系统的默认的浏览器,拨号器等进行处理

这里面配制了属性autoLink

none: 不匹配任何链接(默认)

web: 匹配web网址

email:匹配识别E-mail地址

phone:匹配识别电话号码

all :匹配识别所有的链接

这里配制的是all,也就是可以支持自动识别所有的链接

例如:

         TextView textView = (TextView) findViewById(R.id.textview);textView.setText("我的博客:http://blog.csdn.net/zl18603543572 \n\n 我的电话 186******* \n\n 我的邮箱  928343994@qq.com");

在显示出来的页面中 点击相应的条目,就会打开系统默认的 浏览器 或者是系统默认的拨号器或者是发送邮件的应用

拦截点击超链接打开系统默认的这些应用

也就是说在点击链接的时候,指定打开的浏览器,或者是在自己的应用中打开相应的页面

// 实现超文本链接的点击 拦截
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView1 = (TextView) findViewById(R.id.textview1);final String text1 = "自信是一种魅力,它让自己和周围的人感到自在,自在的人是活的比较灵活的,是一种心灵的灵活,生活赋予我们一种巨大的和无限高贵的礼品,这就是青春:充满着力量,充满着期待志愿,充满着求知和斗争的志向,充满着希望信心和青春 https://www.baidu.com ldsfkl  哈哈 https://www.baidu.com";/*** String 是java中的字符串,它继承于CharSequence。* String类所包含的API接口非常多。为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序。* String 和 CharSequence 关系* String 继承于CharSequence,也就是说String也是CharSequence类型。* CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。* 需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!*/textView1.setText(text1);textView1.setMovementMethod(LinkMovementMethod.getInstance());CharSequence text = textView1.getText();/*** 获取 text中的超链接 */Spannable spannable = new SpannableString(text);URLSpan[] urls = spannable.getSpans(0, text1.length(), URLSpan.class);if (urls.length == 0) {return;}/*** 设置点击超链接*/for (URLSpan uri : urls) {String uriString = uri.getURL();if (uriString.indexOf("http://") == 0 || uriString.indexOf("https://") == 0) {MyClickableSpan myURLSpan = new MyClickableSpan(uriString, null);spannable.setSpan(myURLSpan, spannable.getSpanStart(uri), spannable.getSpanEnd(uri),Spannable.SPAN_INCLUSIVE_EXCLUSIVE);}}textView1.setText(spannable);}/*** 处理TextView中的链接点击事件 链接的类型包括:url,号码,email,地图 这里只拦截url,即 http:// 开头的URI  处 https://开头的URI*/private class MyClickableSpan extends ClickableSpan {private String mUrl; // 当前点击的实际链接MyClickableSpan(String url, LinkedList<String> urls) {mUrl = url;}@Overridepublic void updateDrawState(TextPaint ds) {/*** 设置超链接的颜色*/ds.linkColor = Color.parseColor("#000000");/*** 设置超链接的背景颜色*/ds.bgColor = Color.parseColor("#e6e6e6");}@Overridepublic void onClick(View widget) {/*** 在这里进行拦截后的操作*/System.out.println("click");}}

在使用的时候可以直接将上面的拦截操作的代码复制就行

textView解析相应的html文件

        String htmlString ="<font color ='red'>i love you </font><br>";htmlString+="<big><a href='https://baidu.com'>我的百度</a></big>";CharSequence sequence = Html.fromHtml(htmlString);//设置要显示的文本mTextView.setText(sequence);//必须进行下面的设置,否则点击链接无法进行浏览器的中转浏览mTextView.setMovementMethod(LinkMovementMethod.getInstance());

如果不进行setMovementMethod方法设置,是可以正常显示链接的

关于解析html的源码分析

这里用到的Html.fromHtml()方法,在源码中

    public static Spanned fromHtml(String source) {return fromHtml(source, null, null);}public static Spanned fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler) {Parser parser = new Parser();try {parser.setProperty(Parser.schemaProperty, HtmlParser.schema);} catch (org.xml.sax.SAXNotRecognizedException e) {// Should not happen.throw new RuntimeException(e);} catch (org.xml.sax.SAXNotSupportedException e) {// Should not happen.throw new RuntimeException(e);}HtmlToSpannedConverter converter =new HtmlToSpannedConverter(source, imageGetter, tagHandler,parser);return converter.convert();}

可以看到这里有两个重载的方法 ,不过最终都是调用到了多参数的那个方法

其中涉及到的第一个参数source就是带标签的html文字, formHtml方法中 使用到HtmlToSpannedConverter这个类,这个类是用来转换html文本的,这个类就 定义在Html.java中,

在HtmlToSpannedConverter类中,我们很容易的找到两个方法

private void handleStartTag(String tag, Attributes attributes) {if (tag.equalsIgnoreCase("br")) {// We don't need to handle this. TagSoup will ensure that there's a </br> for each <br>// so we can safely emite the linebreaks when we handle the close tag.} else if (tag.equalsIgnoreCase("p")) {handleP(mSpannableStringBuilder);} else if (tag.equalsIgnoreCase("div")) {handleP(mSpannableStringBuilder);} else if (tag.equalsIgnoreCase("strong")) {start(mSpannableStringBuilder, new Bold());} else if (tag.equalsIgnoreCase("b")) {start(mSpannableStringBuilder, new Bold());} else if (tag.equalsIgnoreCase("em")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("cite")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("dfn")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("i")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("big")) {start(mSpannableStringBuilder, new Big());} else if (tag.equalsIgnoreCase("small")) {start(mSpannableStringBuilder, new Small());} else if (tag.equalsIgnoreCase("font")) {startFont(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("blockquote")) {handleP(mSpannableStringBuilder);start(mSpannableStringBuilder, new Blockquote());} else if (tag.equalsIgnoreCase("tt")) {start(mSpannableStringBuilder, new Monospace());} else if (tag.equalsIgnoreCase("a")) {startA(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("u")) {start(mSpannableStringBuilder, new Underline());} else if (tag.equalsIgnoreCase("sup")) {start(mSpannableStringBuilder, new Super());} else if (tag.equalsIgnoreCase("sub")) {start(mSpannableStringBuilder, new Sub());} else if (tag.length() == 2 &&Character.toLowerCase(tag.charAt(0)) == 'h' &&tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {handleP(mSpannableStringBuilder);start(mSpannableStringBuilder, new Header(tag.charAt(1) - '1'));} else if (tag.equalsIgnoreCase("img")) {startImg(mSpannableStringBuilder, attributes, mImageGetter);} else if (mTagHandler != null) {mTagHandler.handleTag(true, tag, mSpannableStringBuilder, mReader);}
}private void handleEndTag(String tag) {
...
}

可以看到这两个方法就是用于分析html文本的开头与结尾

textView中设置固定文字的背景颜色

private void setTextViewBackground(){String test = "设置固定部分的字符串的背景颜色....";//将字符串转换成SpannableString对象SpannableString  spannableString = new SpannableString(test);//确定要设置的子字符串的开始位置和结束位置int start = 2;int end = 6;//创建BackgroundColorSpan对象BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.BLUE);//使用setSpan方法 将指定的子字符串转换成BackgroundColorSpan对象spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置显示到textView上mTextView2.setText(spannableString);}

textView中设置固定文字的背景色 与 显示 颜色

 private void setTextViewBackGroudnAndTextColor(){String test = "设置固定部分的字符串的背景颜色以及字体的颜色....";//将字符串转换成SpannableString对象SpannableString  spannableString = new SpannableString(test);//确定要设置的子字符串的开始位置和结束位置int start = 2;int end = 6;//创建BackgroundColorSpan对象ColorSpan backgroundColorSpan = new ColorSpan(Color.BLUE,Color.YELLOW);//使用setSpan方法 将指定的子字符串转换成BackgroundColorSpan对象spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置显示到textView上mTextView3.setText(spannableString);}
class ColorSpan extends CharacterStyle{private int mTextColor;private int mBackgroundColor;public ColorSpan(int textColor,int backgroundColor){ColorSpan.this.mBackgroundColor = backgroundColor;ColorSpan.this.mTextColor = textColor;}@Overridepublic void updateDrawState(TextPaint tp) {//设置背景颜色tp.bgColor = mBackgroundColor;//设置显示字体的颜色tp.setColor(mTextColor);}}
updateDrawState(TextPaint tp)

会在系统设置指定文字样式之前调用,以修改绘制文字的属性

TextView中设置文字的行间距

常用方法:

在布局文件中使用android:lineSpacingExtra

android:lineSpacingExtra="20dp"

第一行文本与第二文本之间的行间距是20dp

在布局文件中使用android:lineSpancingMultiplier属性

android:lineSpancingMltiplier = “1.8”

第一行文本与第二行文本之间的行间距是默认的行间距的1.8倍

使用style

<style name="line-space"><item name="android:lineSpacingMultiplier">1.5</item>
</style>

java代码中使用setLineSpancing方法设置

textView.setLineSpacing(50,1.2f);

这里面有两个参数,第一个相当于android:lineSpacingExtra属性,第二个参数相当于android:lineSpancingMultiplier属性,系统会采用表示行间距大的那个值

在TextView中设置省略号

当文字过多的时候 ,我们可以在文字的最后 或者是最前面或者 是中间添加省略号,使用的时候就是在TextView中设置属性ellipsize

1. 在开头设置省略号

android:ellipsize="middle"

2 .在中间设置省略号

android:ellipsize="start"

3. 在结尾设置省略号

android:ellipsize="end"

4.不显示省略号

android:ellipsize="none"

这是在布局文件中进行设置

5.在代码中进行设置

textView.setEllipsize(TextUtils.TruncateAt.END);

TextView设置走马灯的效果

http://blog.csdn.net/zl18603543572/article/details/49980623

TextView设置滚动效果

<TextViewandroid:id="@+id/txtview4"android:scrollbars="vertical"android:scrollbarStyle="insideOverlay"android:scrollbarFadeDuration="5000"android:maxLines="4"android:padding="10dp"android:textSize="20sp"android:layout_marginTop="10dp"android:singleLine="false"android:text="@string/textstring_1"android:layout_width="wrap_content"android:layout_height="wrap_content"/>

其中:

scorllbarFadeDuration 设置的是滚动条从出现到消失的时间 ,单位是毫秒;

在布局文件中设置后,在代码中还必须设置

 mTextView4.setMovementMethod(ScrollingMovementMethod.getInstance());

EditText中输入表情

public void addFaceEmotionClick(View view){//随机产生1到44的整数int randomId = 1+new Random().nextInt(44);try {//根据随机产生的整数从R.drawable类中获得相应资源ID的Field对象Field field = R.drawable.class.getDeclaredField("ee_" + randomId);//获得资源ID的值int resurceId = Integer.parseInt(field.get(null).toString());//根据资源ID获得资源图像的Bitmap对象Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resurceId);//根据bitmap对象创建imagespan对象ImageSpan imageSpan = new ImageSpan(this,bitmap);//创建spannableString对象,插入用Imagespan对象封装的图像SpannableString spannableString = new SpannableString("ee_");//用imageSpan对象替换ee_spannableString.setSpan(imageSpan,0,3,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//将随机获得的图像追加到EditText控件的最后mEditText.append(spannableString);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}

这里面使用到的"ee_" 是文件中的表情的名称

使用field.get方法来获取值的时候,如果获取的是静态变量,field.get方法的值设为Null即可,如果不是静态变量,需要指定一个变量所在的对象为值

EditTex中不能直接插入span对象,因此需要先使用SpannableString对象封装span对象,然后再将SpannableString对象插入到EditText控件中

设置下面的这个方法,弹出的系统软件盘不会遮挡文字的输入框

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

效果图

源码:

Android中TextView的使用详情综述相关推荐

  1. Android中TextView加横线的属性

    textView.getPaint().setAntiAlias(true); // 抗锯齿textview.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FL ...

  2. Android中TextView文本或富文本内容自行换行的问题

    Android中TextView设置文本或富文本的时候出现没有到头就换行的问题. 网上有很多相关内容. 但大多都是关于文本换行的情况, 对于有富文本内容的情况, 如设置Spanned对象的内容, 会出 ...

  3. android中TextView中文字体粗体的方法 (android:textStyle=bold)

    android中TextView中文字体粗体的方法 (android:textStyle="bold"来使字体显示为粗体,但是这只对英文有效) TextView在xml中可以定义a ...

  4. Android中TextView的SetText()方法注意事项

    忙活了一个下午才研究出来的.... 学习Android的Intent时候跟着Mars老师做简单的乘法程序,在第一个activity输入两个正整数,通过一个intent跳转到第二个intent,在第二个 ...

  5. Android中textView自动识别电话号码,电子邮件,网址(自动加连接)

    转自:http://blog.csdn.net/wx_962464/article/details/8471195 其实这个是很简单的,在android中已经为我们实现了,但是我估计很多人都不知道.包 ...

  6. android settext里面的参数,Android中TextView的SetText()方法注意事项

    忙活了一个下午才研究出来的.... 学习Android的Intent时候跟着Mars老师做简单的乘法程序,在第一个activity输入两个正整数,通过一个intent跳转到第二个intent,在第二个 ...

  7. Android中Textview文字设置不同颜色、下划线、加粗、超链接

    在项目中会遇到在一行文字,部分需要不同的文字颜色.下划线以及超链接来展示,下面介绍两种方式实现: 1.SpannableString来实现 1)简介 对于给Textview设置不同颜色,就不得不提Sp ...

  8. android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动

    一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...

  9. android 中TextView设置部分文字背景色和文字颜色

    通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...

最新文章

  1. spring 事物的传播特性
  2. AJAX实现简单的注册页面异步请求
  3. Jackson ObjectMapper
  4. 让代码更简洁 和@Autowired说分手, 迎接 @RequiredArgsConstructor注解
  5. 软件开发安全性_开发具有有效安全性的软件的最佳方法
  6. 小数加分数怎样计算讲解_反渗透阻垢剂的加药量怎样计算?
  7. kafka最好用的脚本一:kafka-topic
  8. 安卓服务service全解,生命周期,前台服务、后台服务,启动注销、绑定解绑,注册
  9. [公告]决定博客园杂志所采用的标题
  10. 最近粉丝涨得比较快,可能是系统推荐了
  11. java的安装包下载 百度云_Java开发相关安装包网盘下载链接分享
  12. 关于求数列极限的方法的总结
  13. Java获取一个月每周星期一至星期日的日期
  14. 最值得爸爸妈妈学习的儿童教育书籍推荐
  15. Linux软件安装管理的三种方式——源码安装/deb/rpm/yum/apt
  16. 美国计算机专业gre314,美国东北大学计算机专业CS硕士录取
  17. 控制台报错For input string: ““、empty String
  18. MyBatis-plus从入门到精通(全)
  19. perf 性能分析实例——使用perf优化cache利用率
  20. 转:王树国,怎样的校长才是一位好校长?

热门文章

  1. 在改善人类生活的路上,CV能做的还有很多!
  2. 700 页的机器学习笔记火啦,图文生动形象
  3. 计算机视觉论文-2021-06-23
  4. Github | 商汤出品-可在视频里追踪单个对象PySOT
  5. 学校邮箱注册IDEA、pycharm等全家桶(正式版就是香)
  6. 面向小姐姐的编程——JAVA面向对象之封装(一)
  7. caffe 图片数据的转换成lmdb和数据集均值(转)
  8. android alarmmanager定时任务,AlarmManager 实现定时任务
  9. VDO-SLAM论文阅读
  10. 2021年上半年系统集成项目管理工程师案例分析真题及答案解析