通常情况下,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三板斧之一——继承现有控件一点总结,本人才疏学浅,恳请吐槽。

Android 自定义View 三板斧之一——继承现有控件的更多相关文章

  1. Android 自定义View 三板斧之二——组合现有控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 上文说过了如何继承现 ...

  2. Android 自定义View 三板斧之三——重写View来实现全新控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文来讨论最难的一种 ...

  3. Android自定义控件View(三)组合控件

    不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看.它是怎么实现的呢?这篇博客来揭开它的神秘面纱.先上效果图 相信很多人都知道Android自定义控件的三种方式,An ...

  4. Android自定义垂直滚动自动选择日期控件

    ------------------本博客如未明正声明转载,皆为原创,转载请注明出处!------------------ 项目中需要一个日期选择控件,该日期选择控件是垂直滚动,停止滚动时需要校正日期 ...

  5. Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

    在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着 ...

  6. Android Folding View(折叠视图、控件)

    版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的,   也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...

  7. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...

  8. 【Android - 自定义View】之MeasureSpec简介

    MeasureSpec是View测量过程中的一个重要的类,它被用来将View的尺寸规格(SpecSize)和尺寸模式(SpecMode)封装在一起,并提供打包和解包的方法. MeasureSpec虽然 ...

  9. Android自定义View和控件之一-定制属于自己的UI

    照例,拿来主义.我的学习是基于下面的三篇blog.前两是基本的流程,第三篇里有比较细致的绘制相关的属性.第4篇介绍了如何减少布局层次来提高效率. 1. 教你搞定Android自定义View 2. 教你 ...

随机推荐

  1. 2016/12/14---- C3P0

    查询查询一条记录 public UserBean findActiver(String ac) throws SQLException { QueryRunner qr = new QueryRunn ...

  2. 文章“Redcing the Dimensiongality of Data with Neural Networks”的翻译

    注明:本人英语水平有限,翻译不当之处,请以英文原版为准,不喜勿喷,另,本文翻译只限于学术交流,不涉及任何版权问题,若有不当侵权或其他任何除学术交流之外的问题,请留言本人,本人立刻删除,谢谢!! 本文原 ...

  3. redis基础使用

    redis分linux,window两个版本分支. redis在window下的使用先下载相关包.下载地址:https://github.com/MSOpenTech/redis/releases 下 ...

  4. oracle replace函数

    replace 函数用法如下: replace('将要更改的字符串','被替换掉的字符串','替换字符串') 例如: select t.dqsj,replace(t.dqsj,'16:40','16: ...

  5. MVC dirname(——FILE——)

    1.MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织 ...

  6. 删除多余的provisioning profile

    当你的工程中有个人证书和企业证书时,你xCode打包的时候可能会发现一个问题:当你的Code Signing设置iOS Developer和Automatic,并且你的Bundle ID和Team选择 ...

  7. 监听EditText变化---TextWatcher 类用法详解

    http://www.cnblogs.com/yjing0508/p/5316985.html TextWatcher textWatcher = new TextWatcher() { @Overr ...

  8. Servlet 利用Cookie实现一周内不重复登录

    import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import ...

  9. Extjs学习笔记--Ext.tree.Panel

    Ext.create('Ext.tree.Panel', { title: 'Simple Tree', width: 200, height: 150, store: store, rootVisi ...

  10. Linux 批量替换文件名

    find -name "*parsed" |awk  '{print $1}' |xargs -i{}  mv {} {}.44