很多时候我们也需要制作一些彩色字体的文本,文本的霓虹灯效果,以及链接字体哈,字体背景色,下标之类的,而很多时候我们却用多个textview去达到这个效果,可以说是很浪费时间浪费经精力的,这时候怎么办呢?下面就有详解。

文章结构:1.自定义TextView实现彩色字体与霓虹灯字体 2.一个可以字体实现多项效果的类(封装好了,可直接使用)

先上图看看我们要做的效果

这里写图片描述

一、自定义TextView之彩色字体,直接上代码解释

package com.demo.myview.colourfulFontOrNeonTextView;

import android.content.Context;

import android.graphics.Color;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Shader;

import android.util.AttributeSet;

import android.widget.TextView;

/**

* Created by 符柱成 on 2016/8/19.

*/

public class ColourfulFontTextview extends TextView {

int TextViewWidth; //TextView的宽度

private LinearGradient mLinearGradient; //渲染器

private Paint paint;

public ColourfulFontTextview(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

//在 onSizeChanged 方法中获取到宽度,并对各个类进行初始化

if (TextViewWidth == 0) {

TextViewWidth = getMeasuredWidth();

if (TextViewWidth > 0) {

//得到 父类 TextView 中写字的那支笔

paint = getPaint();

//初始化线性渲染器

mLinearGradient = new LinearGradient(0, 0, TextViewWidth, 0,

new int[]{Color.BLUE, Color.YELLOW, Color.RED, Color.GREEN, Color.GRAY}, null, Shader.TileMode.CLAMP);

//把渲染器给笔套上

paint.setShader(mLinearGradient);

}

}

}

}

2.在xml中的引用:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/white"

android:orientation="vertical"

tools:context=".colourfulFontOrNeonTextView.ColourfulFontOrNeonAcitivity">

android:layout_width="match_parent"

android:layout_height="50dp"

android:text="彩色字体!彩色字体!彩色字体!"

android:textSize="28sp" />

android:layout_width="match_parent"

android:layout_height="70dp"

android:text="霓虹灯字体!霓虹灯字体!霓虹灯字体!"

android:textSize="28sp" />

android:id="@+id/tv_content"

android:layout_width="match_parent"

android:layout_height="130dp"

android:layout_marginTop="10dp"

android:background="@color/colorPrimary"

android:text="baiduoryouku正常粗体斜体粗斜体上标下标前景色背景色图片"

android:textSize="25sp"/>

二、自定义TextView之霓虹灯字体,直接上代码解释啦

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.LinearGradient;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Shader;

import android.util.AttributeSet;

import android.widget.TextView;

/**

* Created by 符柱成 on 2016/8/19.

*/

public class NenoTextview extends TextView {

int mViewWidth; //TextView的宽度

private LinearGradient mLinearGradient; //渲染器

private Matrix mMatrix; //图片变换处理器

private Paint mPaint; //字体的笔

int mTranslate=0; //表示平移的速度

public NenoTextview(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

//在 onSizeChanged 方法中获取到宽度,并对各个类进行初始化

if (mViewWidth == 0) {

mViewWidth = getMeasuredWidth();

if (mViewWidth > 0) {

//得到 父类 TextView 中写字的那支笔.,注意是继承Textview

mPaint = getPaint();

//初始化线性渲染器 不了解的请看上面连接

mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0,

new int[]{Color.BLUE, Color.YELLOW, Color.RED, Color.GREEN}, null, Shader.TileMode.CLAMP);

//把渲染器给笔套上

mPaint.setShader(mLinearGradient);

//初始化 Matrix,Matrix的原意是对一个Bitmap的图片变化进行处理,它本身不能对图像或者View进行变换,但是可以与其他的API结合进行图形和View的变换,比如Canvas

mMatrix = new Matrix();

}

}

}

@Override

protected void onDraw(Canvas canvas) {

//先让父类方法执行,由于上面我们给父类的 Paint 套上了渲染器,所以这里出现的文字已经是彩色的了

super.onDraw(canvas);

if (mMatrix != null) {

//利用 Matrix 的平移动作实现霓虹灯的效果,这里是每次滚动1/10

mTranslate += mViewWidth / 10;

//如果滚出了控件边界,就要拉回来重置开头,这里重置到了屏幕左边的空间

if (mTranslate > mViewWidth) {

mTranslate = -mViewWidth/2;

}

//设置平移距离

mMatrix.setTranslate(mTranslate, 0);

//平移效果生效

mLinearGradient.setLocalMatrix(mMatrix);

//延迟 100 毫秒再次刷新 View 也就是再次执行本 onDraw 方法

postInvalidateDelayed(50);

}

}

}

xml中的引用已经在上面给出了。

三、多项字体效果,下面将给出一个封装好的类以及调用方法

package com.demo.myview.colourfulFontOrNeonTextView;

import android.content.Context;

import android.graphics.Color;

import android.graphics.drawable.Drawable;

import android.text.SpannableString;

import android.text.Spanned;

import android.text.TextPaint;

import android.text.style.AbsoluteSizeSpan;

import android.text.style.BackgroundColorSpan;

import android.text.style.ForegroundColorSpan;

import android.text.style.ImageSpan;

import android.text.style.StyleSpan;

import android.text.style.SubscriptSpan;

import android.text.style.SuperscriptSpan;

import android.text.style.TypefaceSpan;

import android.text.style.URLSpan;

import android.text.style.UnderlineSpan;

import com.demo.myview.R;

/**

* Created by 符柱成 on 2016/8/19.

*/

//封装好了Textview多种字体

public class SpannableStringFont {

public static SpannableString changeFont(Context context, String content) {

SpannableString ss = new SpannableString(content);

// flag:标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果

// Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、

// Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、

// Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、

// Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)

//设置字体(default,default-bold,monospace,serif,sans-serif)

ss.setSpan(new TypefaceSpan("monospace"), 6, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置网络超链接

ss.setSpan(new URLSpan("http://www.baidu.com"), content.indexOf("baidu"), content.indexOf("or"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ss.setSpan(new URLSpan("http://www.youku.com"), content.indexOf("youku"), content.indexOf("正常"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置字体颜色

ss.setSpan(new ForegroundColorSpan(Color.parseColor("#ff0000")), content.indexOf("baidu"), content.indexOf("or"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ss.setSpan(new ForegroundColorSpan(Color.parseColor("#0000FF")), content.indexOf("or"), content.indexOf("youku"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ss.setSpan(new ForegroundColorSpan(Color.parseColor("#ff00ff")), content.indexOf("youku"), content.indexOf("正常"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置字体大小

ss.setSpan(new AbsoluteSizeSpan(sp2px(context, 25)), content.indexOf("baidu"), content.indexOf("or"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ss.setSpan(new AbsoluteSizeSpan(sp2px(context, 30)), content.indexOf("youku"), content.indexOf("正常"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置下划线

ss.setSpan(new MyUnderlineSpan(), content.indexOf("youku"), content.indexOf("正常"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//设置字体样式正常,粗体,斜体,粗斜体

ss.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), content.indexOf("正常"), content.indexOf("粗体"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //正常

ss.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), content.indexOf("粗体"), content.indexOf("斜体"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗体

ss.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), content.indexOf("斜体"), content.indexOf("粗斜体"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //斜体

ss.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), content.indexOf("粗斜体"), content.indexOf("上标"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗斜体

//设置上下标

ss.setSpan(new SubscriptSpan(), content.indexOf("上标"), content.indexOf("下标"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //下标

ss.setSpan(new SuperscriptSpan(), content.indexOf("下标"), content.indexOf("前景色"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //上标

//设置字体前景色

ss.setSpan(new ForegroundColorSpan(Color.MAGENTA), content.indexOf("前景色"), content.indexOf("背景色"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置前景色为洋红色

//设置字体背景色

ss.setSpan(new BackgroundColorSpan(Color.CYAN), content.indexOf("背景色"), content.indexOf("图片"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置背景色为青色

//设置图片

Drawable drawable = context.getDrawable(R.drawable.home_serve_dot_pressed);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

ss.setSpan(new ImageSpan(drawable), content.indexOf("图片"), ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

return ss;

}

//这里是干嘛的呢?为了设置下划线呗

static class MyUnderlineSpan extends UnderlineSpan {

@Override

public void updateDrawState(TextPaint ds) {

ds.setUnderlineText(true);

}

}

//这又是干嘛的呢?计算字体大小嘛

private static int sp2px(Context context, float spValue) {

final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

return (int) (spValue * fontScale + 0.5f);

}

}

嗯,,还缺个调用,为了方便新手使用,下面也贴出来:

public class ColourfulFontOrNeonAcitivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_colourful_font_or_neon_acitivity);

initView();

}

private void initView(){

TextView textView = (TextView) findViewById(R.id.tv_content);

String content = textView.getText().toString();

textView.setText(SpannableStringFont.changeFont(ColourfulFontOrNeonAcitivity.this,content));

textView.setMovementMethod(LinkMovementMethod.getInstance());

}

}

好了,彩色字体与霓虹灯字体以及TextView的多项字体效果都写清楚了,欢迎大家在下方指出错误,共同学习!

转载请注明:【JackFrost的博客】

更多精彩的内容,可以访问JackFrost的博客

android课程设计多彩的霓虹,Android-自定义TextView(彩色字体与霓虹灯字体以及TextView的多项字体效果)...相关推荐

  1. Android课程设计--网上购物商城

    Android的特征: 提供访问硬件的API函数,简化访问过程等 具有自己的运行时和虚拟机 提供了丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性 提供 ...

  2. Android课程设计(健康管理软件开发)

    Android 课程设计 Android开发使用软件(RecyclerView+ListView+SQLite) 一个实用的健康管理软件,可以查询各种食物的热量,每天健身打卡,发表动态,可以点击图片链 ...

  3. 音频播放器android课程设计,Android课程设计:Android音乐播放器的设计与实现

    内容简介: Android课程设计:Android音乐播放器的设计与实现,共21页,7729字,附源程序等. 摘要:本文主要介绍了一个基于Andriod的音乐播放器的设计与实现.主要包括可行性分析,需 ...

  4. Android课程设计大作业-音乐播放器

    Android课程设计大作业-音乐播放器 一.**主要实现界面效果** 1)登录界面 2)音乐列表界面 3)音乐播放界面 二.**系统设计** 1)使用Service播放音乐 2) 前台界面(Acti ...

  5. Android课程设计本地游戏厅app开发(已开源)

    Android课程设计本地游戏厅app开发(已开源) 见链接

  6. Android尺寸标注设计大全和Android切图规范

    转载地址:http://www.25xt.com/appdesign/4256.html 安卓app设计规范整理和Android APP设计篇 http://www.25xt.com/appdesig ...

  7. android应用课程设计报告,基于Android的多媒体播放器课程设计报告.doc

    基于Android的多媒体播放器课程设计报告.doc 基于Android的多媒体播放器课程设计报告2014-01-02 224652 转载标签 android多媒体播放器嵌入式课程设计报告it分类 我 ...

  8. Android课程设计之视频播放器

    CSDN下载:https://download.csdn.net/download/eseszb/10463442 移动互联网开发   课程设计报告 学生姓名:学 号: 专业:计算机科学与技术 班级: ...

  9. 俄罗斯android课程设计,基于Android的俄罗斯方块的设计与实现毕业设计报告.docx...

    PAGE \* MERGEFORMAT 24湖南商学院 <移动互联网应用开发> 课程设计报告 题 目 基于Android的俄罗斯方块的设计与实现 姓 名:学 号:专 业:班 级:指导教师: ...

  10. Android课程设计:基于离线地图服务器的Android地图应用

    Android开发课程设计:基于离线地图服务器的Android地图应用 此项目的灵感来源于伯克利cs61b的Project3: cs61b的官网地址:Project 3: Bear Maps 我的实验 ...

最新文章

  1. 锁的升级与synchronized锁的关系
  2. 二元函数洛必达求极限_由一类特殊的洛必达法则情形展开的讨论 ——小领域的大作用...
  3. plot与legend画图与图例
  4. 线程(Thread,ThreadPool)、Task、Parallel
  5. python map(function, iterable, ...) 内置函数的用法 (序列迭代调用并返回)
  6. Spring项目启动加载xml配置文件替换数据库提高响应速度
  7. 数据 3 分钟 | Oracle 首度失去榜首位置、PingCAP 发布 TiDB 荣耀体验官活动、华为召开开发者大会 2021
  8. ubuntu中wine的安装位置
  9. nodejs mysql 执行多条sql语句
  10. 华中科技大学计算机作业试题,华中科技大学2009大学计算机基础考试试题A
  11. android studio svn 忽略文件
  12. 华为vrrp默认优先级_【干货】华为vrrp配置
  13. html 手机录视频,手机怎么录制视频 怎么用手机录视频?
  14. 关于svn提交performing vcs refresh 卡住的解决办法
  15. 读于博士SI设计手记有感
  16. Oracle数据库(三)可插拔数据库使用
  17. python怎么筛选excel数据_python筛选数据excel表格-如何利用python提取两个excel对比后的重复值的信息?...
  18. python 函数与部分使用示例
  19. jsp依据id元素值获取值及相关赋值
  20. 阅读Logback文档笔记--Logback的Appender配置

热门文章

  1. 线性系统的矫正方法——PID控制理论学习笔记
  2. SAI绘制小树基础教程
  3. IDEA 开启远程调试
  4. mysql汽车品牌系列_爬取汽车之家汽车品牌型号系列数据
  5. 侧信道实验实验二 S盒DPA侧信道攻击
  6. 【机器人学:运动规划】快速搜索随机树(RRT---Rapidly-exploring Random Trees)入门及在Matlab中演示
  7. android车载导航测试,大众全系车载DVD导航之路畅安卓4.1测试
  8. Servlet菜鸟教程
  9. 自动化立体仓库AS/RS货架|分离式仓库货架与整体式仓库货架如何运用?
  10. 20201130-C语言-重新认识ASCII码表