首页 文章 精选 留言 我的

精选列表

搜索[view],共10001篇文章
优秀的个人博客,低调大师

02.自定义View(RippleTextView可颜色渐变的TextView)

感谢红橙Darren博主 package com.rzm.commonlibrary.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; /** * Created by renzhenming on 2018/3/22. * 颜色渐变效果的TextView,可用于音乐播放的字幕 */ public class RippleTextView extends TextView{ //最初的画笔 private Paint mOriginPaint; //颜色改变后的画笔 private Paint mChangedPaint; //当前滑动进度 private float mCurrentPercent = 0.6f; //当前设置的文本 private String mText; // 当前朝向 private Direction mDirection = Direction.DIRECTION_LEFT; // 绘制的朝向枚举 public enum Direction { DIRECTION_LEFT, DIRECTION_RIGHT } public RippleTextView(Context context) { this(context,null); } public RippleTextView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,-1); } public RippleTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } private void initPaint() { mOriginPaint = getPaintByColor(Color.BLACK); mChangedPaint = getPaintByColor(Color.RED); } private Paint getPaintByColor(int color) { Paint paint = new Paint(); //抗锯齿 paint.setAntiAlias(true); //防抖动 paint.setDither(true); paint.setColor(color); // 字体的大小设置为TextView的文字大小 paint.setTextSize(getTextSize()); return paint; } /** * 自己绘制,不继承super * @param canvas */ @Override protected void onDraw(Canvas canvas) { //获取textView的文本 mText = getText().toString().trim(); //获取textView宽度 int width = getWidth(); if (!TextUtils.isEmpty(mText)){ //mCurrentPercent进度下,滑动到控件的位置 int position = (int) (width* mCurrentPercent); // 根据不同的朝向去画字体 if (mDirection == Direction.DIRECTION_LEFT) { drawOriginDirectionLeft(canvas, position); drawChangeDirectionLeft(canvas, position); } if (mDirection == Direction.DIRECTION_RIGHT) { drawOriginDirectionRight(canvas, position); drawChangeDirectionRight(canvas, position); } } } /** * 画朝向右边变色字体 */ private void drawChangeDirectionRight(Canvas canvas, int position) { drawText(canvas, mChangedPaint, getWidth() - position, getWidth()); } /** * 画朝向左边默认色字体 */ private void drawOriginDirectionRight(Canvas canvas, int position) { drawText(canvas, mOriginPaint, 0, getWidth() - position); } /** * 画朝向左边变色字体 */ private void drawChangeDirectionLeft(Canvas canvas, int position) { drawText(canvas, mChangedPaint, 0, position); } /** * 画朝向左边默认色字体 */ private void drawOriginDirectionLeft(Canvas canvas, int position) { drawText(canvas, mOriginPaint, position, getWidth()); } /** * 设置当前的进度 * @param currentProgress 当前进度 */ public void setCurrentProgress(float currentProgress) { this.mCurrentPercent = currentProgress; // 重新绘制 invalidate(); } /** * 设置绘制方向,从右到左或者从左到右 * @param direction 绘制方向 */ public void setDirection(Direction direction) { this.mDirection = direction; } /** * 根据滑动位置绘制文本 * @param canvas * @param paint * @param start * @param end * * 基准点是baseline * Ascent是baseline之上至字符最高处的距离 * Descent是baseline之下至字符最低处的距离 * Top指的是指的是最高字符到baseline的值,即ascent的最大值, * bottom指的是最下字符到baseline的值,即descent的最大值,字能达到的最小值 */ private void drawText(Canvas canvas, Paint paint, int start, int end) { //保存画笔状态 canvas.save(); //截取绘制的内容,该方法用于裁剪画布,也就是设置画布的显示区域 //主要用于部分显示以及对画布中的部分对象进行操作的场合。 canvas.clipRect(start,0,end,getHeight()); //获取文字的范围 Rect bounds = new Rect(); mOriginPaint.getTextBounds(mText,0,mText.length(),bounds); // 获取文字的Metrics 用来计算基线 Paint.FontMetricsInt fontMetrics = mOriginPaint.getFontMetricsInt(); //获取文字的高度 int fontHeight = fontMetrics.bottom - fontMetrics.top; // 计算基线到中心点的位置,fontHeight/2是文字中心点, fontMetrics.bottom是基线到文字最低点的高度, int offY = fontHeight/2 - fontMetrics.bottom; // 计算基线位置,为什么基线的位置这样计算,如果想不通,可以这样,假设,文字在控件正中间,控件高度的一半 //也就是控件顶部到文字中心点的垂直距离,文字高度的一半也就是文字中心点到文字最顶部或者最底部的距离,二者相加 //可以看作是从控件顶部到文字最底部的距离,这个距离是等于控件顶部到基线的距离加上 int baseline = (getMeasuredHeight() + fontHeight) / 2 - offY; //绘制文字 canvas.drawText(mText,getMeasuredWidth()/2-bounds.width()/2,baseline,paint); //恢复画笔状态 canvas.restore(); } }

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册