• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > android实现文字渐变效果和歌词进度的效果

android实现文字渐变效果和歌词进度的效果

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android 复制文字,android 文字识别,android 绘制文字,android 文字颜色,android 文字转语音等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

android实现文字渐变效果和歌词进度的效果


要用TextView使用渐变色,那我们就必须要了解LinearGradient(线性渐变)的用法。

LinearGradient的参数解释

LinearGradient也称作线性渲染,LinearGradient的作用是实现某一区域内颜色的线性渐变效果,看源码你就知道他是shader的子类。
这里写图片描述

它有两个构造函数

public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)


public LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);

其中,参数x0表示渐变的起始点x坐标;参数y0表示渐变的起始点y坐标;参数x1表示渐变的终点x坐标;参数y1表示渐变的终点y坐标 ;color0表示渐变开始颜色;color1表示渐变结束颜色;参数tile表示平铺方式。

Shader.TileMode有3种参数可供选择,分别为CLAMP、REPEAT和MIRROR:

CLAMP的作用是如果渲染器超出原始边界范围,则会复制边缘颜色对超出范围的区域进行着色

REPEAT的作用是在横向和纵向上以平铺的形式重复渲染位图

MIRROR的作用是在横向和纵向上以镜像的方式重复渲染位图

LinearGradient的简单使用

先实现文字效果的水平渐变:

Shader shader_horizontal= new LinearGradient(btWidth/4, 0, btWidth, 0, Color.RED, Color.GREEN, Shader.TileMode.CLAMP);
                tv_text_horizontal.getPaint().setShader(shader_horizontal);

这里写图片描述
再实现文字的垂直渐变效果:

Shader shader_vertical=new LinearGradient(0, btHeight/4, 0, btHeight, Color.RED, Color.GREEN, Shader.TileMode.CLAMP);
                tv_text_vertical.getPaint().setShader(shader_vertical);

这里写图片描述
接下来来实现文字的颜色动态渐变效果:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> import android.content.Context; import android.graphics.Canvas; 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 on 2016/3/13. */ public class GradientHorizontalTextView extends TextView { private LinearGradient mLinearGradient; private Matrix mGradientMatrix;//渐变矩阵 private Paint mPaint;//画笔 private int mViewWidth = 0;//textView的宽 private int mTranslate = 0;//平移量 private boolean mAnimating = true;//是否动画 private int delta = 15;//移动增量 public GradientHorizontalTextView(Context ctx) { this(ctx,null); } public GradientHorizontalTextView(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); if (mViewWidth == 0) { mViewWidth = getMeasuredWidth(); if (mViewWidth > 0) { mPaint = getPaint(); String text = getText().toString(); int size; if(text.length()>0) { size = mViewWidth*2/text.length(); }else{ size = mViewWidth; } mLinearGradient = new LinearGradient(-size, 0, 0, 0, new int[] { 0x33ffffff, 0xffffffff, 0x33ffffff }, new float[] { 0, 0.5f, 1 }, Shader.TileMode.CLAMP); //边缘融合 mPaint.setShader(mLinearGradient);//设置渐变 mGradientMatrix = new Matrix(); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mAnimating && mGradientMatrix != null) { float mTextWidth = getPaint().measureText(getText().toString());//获得文字宽 mTranslate += delta;//默认向右移动 if (mTranslate > mTextWidth+1 || mTranslate<1) { delta = -delta;//向左移动 } mGradientMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(30);//刷新 } } }

这里写图片描述

实现歌词进度效果

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。它的思路和java.awt.FontMetrics的基本相同。
FontMetrics对象它以四个基本坐标为基准,分别为:

FontMetrics.top
FontMetrics.ascent
FontMetrics.descent
FontMetrics.bottom

这里写图片描述

// FontMetrics对象
  FontMetrics fontMetrics = textPaint.getFontMetrics();  
  String text = "abcdefghijklmnopqrstu";  
  // 计算每一个坐标
  float baseX = 0;  
  float baseY = 100;  
  float topY = baseY + fontMetrics.top;  
  float ascentY = baseY + fontMetrics.ascent;  
  float descentY = baseY + fontMetrics.descent;  
  float bottomY = baseY + fontMetrics.bottom;  

下面是具体实现代码:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created  on 2016/3/13.
 */
public class SongTextView extends View {
    private int postIndex;
    private Paint mPaint;
    private int delta = 15;
    private float mTextHeight;
    private float mTextWidth;
    private String mText="梦 里 面 看 我 七 十 二 变";
    private PorterDuffXfermode xformode;
    public SongTextView(Context ctx)
    {
        this(ctx,null);
    }
    public SongTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SongTextView(Context context,  AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    public void init()
    {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        xformode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
        mPaint.setColor(Color.CYAN);
        mPaint.setTextSize(60.0f);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setXfermode(null);
        mPaint.setTextAlign(Paint.Align.LEFT);
        //文字精确高度
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        mTextHeight = fontMetrics.bottom-fontMetrics.descent-fontMetrics.ascent;
        mTextWidth  = mPaint.measureText(mText);
    }
    /**
      *计算 控件的宽高
      */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      final  int mWidth;
      final  int mHeight;
        /**
         * 设置宽度
         */
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY)// match_parent , accurate
            mWidth = widthSize;
        else
        {
            // 由图片决定的宽
            int desireByImg = getPaddingLeft() + getPaddingRight()
                    + getMeasuredWidth();
            if (widthMode == MeasureSpec.AT_MOST)// wrap_content
                mWidth = Math.min(desireByImg, widthSize);
             else
                mWidth = desireByImg;



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • android实现文字渐变效果和歌词进度的效果
  • Android 点击文字实现跳转,android跳转

相关文章

  • 2017-05-26Android程序中--不能改变的事情,android程序--改变
  • 2017-05-26Android之DOM解析XML,androiddomxml
  • 2017-05-26《转》深入理解Activity启动流程(一)–Activity启动的概要流程,《转》activity
  • 2017-05-26Jar mismatch错误的解决,jarmismatch错误
  • 2017-05-26android:Activity启动模式之singleInstance
  • 2017-05-26golang错误处理之error
  • 2017-05-26Android开发技巧——定制仿微信图片裁剪控件
  • 2017-05-26浅谈Kotlin(二):基本类型、基本语法、代码风格,浅谈kotlin
  • 2017-05-26Android中使用开源框架android-image-indicator实现图片轮播部署,
  • 2017-05-26Apache Cordova开发Android应用程序——番外篇,cordovaandroid

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 策略模式,java策略模式
    • activity的横屏和竖屏设置,activity
    • Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示
    • Android Studio下NDK的使用
    • andriod读写XML,andriodxml
    • Android开发找工作之前先看看这些知识点吧
    • Android 博客园客户端 (五) 查看评论、搜索博主,android查看评论
    • Android开发:优化ListView实践解析
    • 高效地分析Android内存--MAT工具解析
    • Activity、View、Window三者之间的关系

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有