Android继承现有控件拓展实现自定义控件textView
通常情况下,android实现自定义控件无非三种方式。
ⅰ、继承现有控件,对其控件的功能进行拓展。
ⅱ、将现有控件进行组合,实现功能更加强大控件。
ⅲ、重写view实现全新的控件
本文重点讨论继承现有控件进行拓展实现自定义控件。这是一个非常重要的自定义控件的方法,可以站在原生控件这个巨人肩膀上,拓展自身的功能,一般来说,我们可以在ondraw方法中对原生控件进行绘制。
本文将以拓展textview为例,看我们是如何继承现有控件,来自定义一个强大控件。这个自定义控件就是带有边框文本框,并且边框与背景的颜色不一样。大体效果图是这样的:
我们来分析一下如何实现这样的效果。我们此时应当盯上ondraw方法,重写ondraw方法,在ondraw方法中分别画两个有带颜色背景矩形边框就可以了。这样,文本框就会有错落有致的层次感了。
要有这种错落有致的效果,我们第一步要做的是定义画内边框和外边框的画笔,定义的代码如下:
private void initview() { mpaint1 = new paint(); mpaint1.setcolor(color.blue); mpaint1.setstyle(style.fill); mpaint2 = new paint(); mpaint2.setcolor(color.yellow); mpaint2.setstyle(style.fill); }
我们定义了第一种画笔颜色为蓝色,画笔的填充模式为完全填充。第二种画笔颜色为黄色,同样填充模式为完全填充。
有了不同颜色画笔之后,我们所需要做的是在ondraw方法运用这两只画笔画不同矩形,这样代码又是这样:
canvas.drawrect(0, 0, getmeasuredwidth(), getmeasuredheight(), mpaint1); canvas.drawrect(10, 10, getmeasuredwidth() - 10, getmeasuredheight() - 10, mpaint2); canvas.save(); canvas.translate(10, 0); super.ondraw(canvas); canvas.restore();
我们画了两个长宽不等的矩形,并且画布平移了10个单位。这样画出来的自定义控件为:
这个例子,非常简单,可能大家对继承原生控件还是意犹未尽的话,我们百尺竿头更进一步。做个稍微复杂点自定义textview——带有闪烁文字的textview。
我们分析一下实现的思路:
①要实现这个效果,我们可以充分利用paint对象的shader(渲染器)对象。
②通过不断改变lineargradient的位置,来形成这闪烁的效果。
有了这样的思路以后,我们首先在onsizechanged方法初始化lineargradient对象,和进行图形变换的矩阵对象。源代码如下:
if (mwidth == 0) { mwidth = getmeasuredwidth(); if (mwidth > 0) { mpaint = getpaint(); mlineargradient = new lineargradient(0, 0, mwidth, 0, new int[] { color.gray, color.green, color.gray }, null, shader.tilemode.clamp); mpaint.setshader(mlineargradient); matrix = new matrix(); } }
我们将lineargradient对象颜色设置为灰绿相间的线性渐变对象,颜色的平铺模式为平铺。
然后在ondraw方法中,不断变换线性渐变对象的位置,从而就有了文字左右闪烁的效果。源代码如下:
if (matrix != null) { mtranslate = mtranslate + mwidth / 5; if (mtranslate > 2 * mwidth) { mtranslate = -mwidth; } matrix.settranslate(mtranslate, 0); mlineargradient.setlocalmatrix(matrix); postinvalidatedelayed(100); }
最终形成的效果为:
这就是自定义view三板斧之一——继承现有控件一点总结,希望对大家的学习有所帮助。