Android自定义View之边框文字、闪烁发光文字

对现有控件进行扩展

1、绘制如下所示的两层背景的TextView

创建BorderTextView继承TextView

在构造函数中初始化一些基本数据

 //外边框
    mPaint1 = new Paint();
    mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_bright));
    //画笔的样式,充满
    mPaint1.setStyle(Paint.Style.FILL);

    //内边框
    mPaint2 = new Paint();
    mPaint2.setColor(Color.YELLOW);
    mPaint2.setStyle(Paint.Style.FILL);

重写onDraw()方法,在此方法中主要通过canvas对象,来进行绘画。

 @Override
  protected void onDraw(Canvas canvas) {

    //绘制外层矩形
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);

    //绘制内层矩形
    canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);

    canvas.save();//保存之前的状态

    //水平平移10px
    canvas.translate(10,10);

    //回调父类方法之前,实现自己的逻辑,则会被文本遮盖
    super.onDraw(canvas);
    //方法之后实现,则内容会覆盖文本

    canvas.restore();//恢复之前的状态

  }

如果以上结束之后运行,会发现文字无法完全显示,是因为,我们平移了文字之后,但文字本身的大小并没有变化,导致文字显示不全,我们需要去重载onMeasure()方法,对TextView的宽高重新计算。

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //因为我们重绘了TextView的上下左右的边框,所以其宽高应该各增大10*2
    setMeasuredDimension(getMeasuredWidth()+20,getMeasuredHeight()+20);
  }

总结:
1. onMeasure()方法用来决定控件大小,onDraw()方法用来绘制。
2. setMeasuredDimension(width,height)设置控件的宽高

2、闪光的文字

该实现主要通过LinearGradient线性渲染对象来进行颜色的改变。

在onSizeChanged()方法中进行初始化操作。

 @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();
        mLinearGradient = new LinearGradient(0,0,mViewWidth,0,
                new int[]{Color.BLUE,0XFFFFFFFF,Color.BLUE},
                null,
            Shader.TileMode.CLAMP
            );

        mPaint.setShader(mLinearGradient);
        mGradientMatrix = new Matrix();
      }
    }
  }

获取我们文字的大小,并获取该文字的Paint对象,同时初始化LinearGradient对象。

创建LinearGradient并设置渐变颜色数组

public LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);
// 第一个,第二个参数表示渐变起点 可以设置起点终点在对角等任意位置
// 第三个,第四个参数表示渐变终点
// 第五个参数表示渐变颜色
// 第六个参数可以为空,表示坐标,值为0-1 new float[] {0.25f, 0.5f, 0.75f, 1 }
// 如果这是空的,颜色均匀分布,沿梯度线。
// 第七个表示平铺方式
// CLAMP重复最后一个颜色至最后
// MIRROR重复着色的图像水平或垂直方向已镜像方式填充会有翻转效果
// REPEAT重复着色的图像水平或垂直方向

初始化Matrix对象。该对象主要用于改变渲染器的值,具体讲解请看此博客http://blog.csdn.net/flash129/article/details/8234599

在onDraw()方法中进行改变Matrix对象,并设置给渲染器,同时刷新试图,形成循环。

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(mGradientMatrix!=null){
      mTranslate += mViewWidth/5;

      //当该控件渲染器的颜色变化正好移除屏幕时,从左侧进入
      if(mTranslate>2*mViewWidth){
        mTranslate = - mViewWidth;
      }
      mGradientMatrix.setTranslate(mTranslate,0);
      mLinearGradient.setLocalMatrix(mGradientMatrix);

      //100ms 后继续刷新试图,即调用onDraw()方法。
      postInvalidateDelayed(100);
    }
  }

总结:
1. 通过LinearGradient来设置图像的渐变色。
2. Matrix改变渐变色的平移对象
关于自定义View的源码已上传到github。如需源码请移步https://github.com/AlexSmille/CustomView

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Shader应用开发之霓虹闪烁文字效果

    本文实例为大家分享了Android霓虹闪烁文字效果的具体代码,供大家参考,具体内容如下 package com.example.apple.shaderdemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; i

  • Android图像处理之霓虹滤镜效果

    霓虹是用来描绘图像的轮廓,勾画出颜色变化的边缘,加强其过度效果,使图像产生轮廓发光的效果. 主要步骤为 1.根据当前像素与其右方和下方像素的梯度运算: 2.然后将结果值作为当前像素值,即将原图当前下像素的RGB分量与其右方和下方像素做梯度 运算(差的平方和平方根): 3.然后将梯度值作为处理后的像素的RGB三个分量: 用代码实现如下: //霓虹 public static Bitmap Neon(Bitmap bitmap){ int w = bitmap.getWidth(); int h =

  • Android自定义View之边框文字、闪烁发光文字

    对现有控件进行扩展 1.绘制如下所示的两层背景的TextView 创建BorderTextView继承TextView 在构造函数中初始化一些基本数据 //外边框 mPaint1 = new Paint(); mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_bright)); //画笔的样式,充满 mPaint1.setStyle(Paint.Style.FILL); //内边框 mPaint2 = new P

  • Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子View产生滚动效果menuView.layout(menuLeft, 0, menuLeft + menuWidth, menuHeight); 相应的,由于没有使用scrollBy方法,就没有产生getScrollX值,所以不能通过Scroller的startScroll方法来完成手指离开后的平

  • Android 自定义View实现多节点进度条功能

    前言 最近项目有一个节点进度条的小需求,完成后,想分享出来希望可以帮到有需要的同学. 真机效果图 自定义View完整代码 开箱即用~,注释已经炒鸡详细了 /** * @description: 节点进度条 * @author: DMingO * @date: 2020/4/15 */ public class PointProcessBar extends View { /** * 未选中时的连线画笔 */ private Paint mLinePaint; /** * 选中时的连线画笔 */

  • Android自定义View验证码输入框

    本文实例为大家分享了Android自定义View验证码输入框的具体代码,供大家参考,具体内容如下 验证码输入框 1.先看下样式 2.直接上代码 public class MyVcode extends AppCompatEditText { private int mFigures = 0;// 验证码个数 private int mCodeMargin = 0;// 验证码之间的间距 private int mSelectColor = 0;// 选中框的颜色 private int mNor

  • Android自定义View实现时钟效果

    本文实例为大家分享了Android自定义View实现时钟效果的具体代码,供大家参考,具体内容如下 自定义时钟 初学自定义View,先画一个不太成熟的时钟(甚至只有秒针) 时钟效果 @SuppressLint("DrawAllocation") public class ClockView extends View {     private final Context mContext;     private Canvas mCanvas;// 画布     private Pain

  • Android自定义view实现滚动选择控件详解

    目录 前言 需求 编写代码 主要问题 前言 上篇文章通过一个有header和footer的滚动控件(Viewgroup)学了下MeasureSpec.onMeasure以及onLayout,接下来就用一个滚动选择的控件(View)来学一下onDraw的使用,并且了解下在XML自定义控件参数. 需求 这里就是一个滚动选择文字的控件,还是挺常见的,之前用别人的,现在选择手撕一个,核心思想如下: 1.有三层不同大小及透明度的选项,选中项放在中间 2.接受一个列表的数据,静态时显示三个值,滚动时显示四个

  • Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又称减幅振动.衰减振动.[1] 不论是弹簧振子还是单摆由于外界的摩擦和介质阻力总是存在,在振动过程中要不断克服外界阻力做功,消耗能量,振幅就会逐渐减小,经过一段时间,振动就会完全停下来.这种振幅随时间减小的振动称为阻尼振动.因为振幅与振动的能量有关,阻尼振动也就是能量不断减少的振动.阻尼振动是非简谐运

  • Android 自定义View 密码框实例代码

    暴露您view中所有影响可见外观的属性或者行为. •通过XML添加和设置样式 •通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 效果图展示: 支持的样式 可以通过XML定义影响外边和行为的属性如下 边框圆角值,边框颜色,分割线颜色,边框宽度,密码长度,密码大小,密码颜色 <declare-styleable name="PasswordInputView"> <attr name="borde

  • Android自定义View实现等级滑动条的实例

     Android自定义View实现等级滑动条的实例 实现效果图: 思路: 首先绘制直线,然后等分直线绘制点: 绘制点的时候把X值存到集合中. 然后绘制背景图片,以及图片上的数字. 点击事件down的时候,换小图片为大图片.move的时候跟随手指移动. up的时候根据此时的X计算最近的集合中的点,然后自动吸附回去. 1,自定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <de

  • Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. 先自定义一个View,继承自LinearLayout,在Layout中,添加布局控件 /** * Created by xiedong on 2017/3/7. */ public class Loading_view extends LinearLayout { private Context m

随机推荐