通常情况下,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. Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  2. nginx_tomcat负载均衡环境

    Nginx+Tomcat搭建 版本 操作系统版本 Centos 6.4 Nginx版本 nginx-1.3.15.tar.gz JDK版本 jdk-7u71-linux-i586 //jdk1.7 T ...

  3. Python学习笔记(三)数据类型

    在内存中存储的数据可以有多种类型,在Python中,能够直接处理的数据类型有以下几种: 数字(Numbers) 字符串(String) 列表(List) 元组(Tuple) 字典(Dictionary ...

  4. Scala class的构造方法与继承

    有java背景的人,很清楚java是如何定义构造方法以及继承的.在scala里面,继承和java有些相似.但是构造方法的定义,就不大一样了,应该说是差别还是很大的.在java里面,定义构造方法,就是定 ...

  5. SQL Server SELECT逻辑处理顺序

    SQL Server SELECT语句,逻辑处理顺序,虽然SELECT位于语句最前面,它在逻辑处理中,基本上是最后一个被执行的部分. 下面列出查询子句在逻辑上处理顺序: 1.  FROM 2.  WH ...

  6. VC++ WINDOWS自定义消息范围

    WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF(十进制: ...

  7. Mysql错误信息汇总

    目录: 1. Every derived table must have its own alias 内容: 1. Every derived table must have its own alia ...

  8. C++中 容易忽视的const 修饰符

    C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行 ...

  9. JSP中显示用户信息

    <%@ page language= "java" contentType="text/html;charset=UTF-8" %><%@ p ...

  10. iOS设计模式-Block实现代理的逻辑

    在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...