欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-23 11:00:16
对现有控件进行扩展 1、绘制如下所示的两层背景的textview 创建bordertextview继承textview 在构造函数中初始化一些基本数据...

对现有控件进行扩展

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

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

创建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、闪光的文字

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

该实现主要通过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对象。该对象主要用于改变渲染器的值,具体讲解请看此博客

在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

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