Android自定义View是Android开发者进阶的必经之路,而对初学者来说说又是非常陌生和惧怕的,所以整理一下自己学习自定义View的一些经验。首先是步骤:

1.     自定义View的属性

2.     获取自定义View属性

3.     重写onMeasure

4.     重新onDraw

其中自定义View的属性是为了让自定义的view能够在UI编辑器中使用并预览,而第二步则是未了让自定义的属性生效,第三步的onMeasure是用来测量View的大小,其中还有onLayout方法用于确定View的位置,这两个方法可以根据需求选择性的重写,而onDraw方法则是必须重写的了,因为我们要在该方法中进行View的绘制工作。

一.  首先我们在res/value目录下新建xml文件并命名为attrs,接下来再改文件中定义自定义View的属性

<resources>

<attrname="titleText"format="string"></attr>

<attrname="titleColor"format="color"></attr>

<attrname="titleSize"format="dimension"></attr>

<declare-styleablename="CustomTextView">

<attrname="titleText"/>

<attrname="titleColor"/>

<attrname="titleSize"/>

</declare-styleable>

<resources>

这里我们定义了文字、文字颜色,文字大小三个属性,其中format的取值范围有:

reference      资源类型,通常是@开头,例如@+id/xxxx,@id/xxxxx
string           字符串类型,通常是文字信息
dimension     浮点类型,通常是尺寸度量,单位有很多px,dp,sp,dip等
color            颜色类型,通常是颜色16进制代码,支持ARGB。
boolean        布尔类型,true和false
enum           枚举类型,通常是代表这个属性提供了几种值来进行选择,并且只能选择这几种中的一个
flag             与enum基本没有区别。
integer         整数类型,通常是整数

二. 接下来我们新建类CustomTextView并继承View。并且在里面做自定义属性的获取,onMeasure的测量以及onDraw的绘制。

@SuppressLint("NewApi")

publicclass CustomTextView extends View {

/**

* 标题

*/

private Stringtitle;

/**

* 标题颜色

*/

privateint titleColor;

/**

* 标题大小

*/

privateint titleSize;

/**

* 绘制时控制文本绘制的范围

*/

RectmRect;

private Paintpaint;

public CustomTextView(Contextcontext, AttributeSet attrs, int defStyleAttr,int defStyleRes) {

super(context,attrs, defStyleAttr,defStyleRes);

init(context,attrs, defStyleAttr,defStyleRes);

}

public CustomTextView(Contextcontext, AttributeSet attrs,int defStyleAttr) {

super(context,attrs, defStyleAttr);

init(context,attrs, defStyleAttr, 0);

}

public CustomTextView(Contextcontext, AttributeSet attrs) {

super(context,attrs);

init(context,attrs, 0, 0);

}

public CustomTextView(Contextcontext) {

super(context);

init(context,null, 0, 0);

}

/**

* 初始化

*

* @param context

* @param attrs

* @param defStyleAttr

* @param defStyleRes

*/

privatevoid init(Context context, AttributeSet attrs, intdefStyleAttr,intdefStyleRes) {

/**

* 获取自定义的属性

*/

TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,

R.styleable.CustomTextView,defStyleAttr, 0);

intn = typedArray.getIndexCount();

for (inti = 0; i < n; i++) {

intattr = typedArray.getIndex(i);

switch (attr) {

//文字

case R.styleable.CustomTextView_titleText:

title =typedArray.getString(attr);

break;

//文字颜色

case R.styleable.CustomTextView_titleColor:

titleColor =typedArray.getColor(i, Color.BLACK);

break;

//文字大小

case R.styleable.CustomTextView_titleSize:

titleSize =typedArray.getDimensionPixelSize(attr,

(int) TypedValue.applyDimension(

TypedValue.COMPLEX_UNIT_SP, 15,

getResources().getDisplayMetrics()));

break;

default:

break;

}

}

typedArray.recycle();

/**

* 获取要绘制文字的宽高

*/

paint =new Paint();

paint.setTextSize(titleSize);

mRect =new Rect();

paint.getTextBounds(title, 0,title.length(), mRect);

}

/**

* 重写的绘制

*/

@Override

protectedvoid onDraw(Canvas canvas) {

paint.setColor(Color.GREEN);

canvas.drawRect(new Rect(0, 0, getMeasuredWidth(),getMeasuredHeight()),paint);

paint.setColor(titleColor);

canvas.drawText(title, getWidth() / 2 -mRect.width() / 2,

getHeight() / 2 +mRect.height() / 2, paint);

}

/**

* 重写的测量

*/

@Override

protectedvoid onMeasure(intwidthMeasureSpec, intheightMeasureSpec) {

intwidthMode = MeasureSpec.getMode(widthMeasureSpec);

intwidthValue = MeasureSpec.getSize(widthMeasureSpec);

intheightMode = MeasureSpec.getMode(heightMeasureSpec);

intheightValue = MeasureSpec.getSize(heightMeasureSpec);

intwidth, height;

if (widthMode == MeasureSpec.EXACTLY) {

width =widthValue;

} else {

paint.setTextSize(titleSize);

paint.getTextBounds(title, 0,title.length(), mRect);

floattextWidth = mRect.width();

intdesired = (int) (getPaddingLeft() +textWidth+getPaddingRight());

width =desired;

}

if (heightMode == MeasureSpec.EXACTLY) {

height =heightValue;

} else {

paint.setTextSize(titleSize);

paint.getTextBounds(title, 0,title.length(), mRect);

floattextHeight = mRect.height();

intdesired = (int) (getPaddingTop() +textHeight+getPaddingBottom());

height =desired;

}

setMeasuredDimension(width,height);

}

}

三. 到这里为止,自定义TextView的工作已经做完了,接下来就是使用了。这里需要注意的是要使用我们自定义的属性需要引入我们自定义的命名空间即

xmlns:custom="http://schemas.android.com/apk/res/com.fxx.customview"其中的命名空间的名字custom我们可以随便取,而后面的包路径是我们项目的包路径

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:custom="http://schemas.android.com/apk/res/com.fxx.customview"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.fxx.customview.MainActivity">

<com.fxx.customview.widget.CustomTextView

android:id="@+id/ctv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

custom:titleColor="#ffffff"

custom:titleSize="25sp"

custom:titleText="CustomTextView"/>

</LinearLayout>

四. 接下我们运行项目来看下效果,如图:

Android自定义View(一)相关推荐

  1. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  2. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  3. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  4. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

  5. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  6. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

  7. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

  8. Android 自定义 圆环,Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...

  9. android自定义抽奖,Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplicati ...

  10. android view 渐变动画,Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

最新文章

  1. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法
  2. oracle 错误解决
  3. morlet小波matlab代码,morlet小波matlab程序
  4. [译文]C# Heap(ing) Vs Stack(ing) in .NET: Part I
  5. 用户空间与内核空间数据交换的方式------seq_file
  6. 模仿还是致敬?华为全新环绕屏手机酷似小米MIX Alpha
  7. “小程序肯定会取代 App!” | 人物志
  8. getAttribute 与getParmeter 区别
  9. python程序编写应注意哪些问题_Python程序员鲜为人知但你应该知道的17个问题
  10. Lyapunov稳定性分析3(离散时间系统)
  11. 电机与拖动综合控制实验matlab,电机与拖动基础及MATLAB仿真
  12. latex 输入下划线_
  13. 电子类研究生的STM32小白入门 一个定时器 四个channel复用映射 实现超声波四路测距
  14. iphone无法更新app_如何在移动连接上进行iPhone Weather App更新
  15. [免费专栏] Android安全之Android Fragment注入
  16. 微服务框架搭建(网关路由)
  17. 【Joy of Cryptography 读书笔记】Chapter 2 可证明安全(Provable Security)基础
  18. 牛油果AvoDerm狗粮介绍
  19. midpoint,lobby,points of view,come into force, tearful,schedule
  20. 今天被公司约谈,说工作时长不够,要求每天至少11小时,不然就是态度不认真!...

热门文章

  1. 计算机论文原文+翻译
  2. 3.3.3 反相比例运算放大电路
  3. html5简单企业网站,HTML5企业网站极简大气模板
  4. UIPATH 收发Outlook邮件
  5. 项目系统设计与数据库设计(那周余嘉熊掌将得队)
  6. 一文看懂“知识蒸馏”技术
  7. Spring-boot 注解学习
  8. android widget零基础,Android Widget详解(一)
  9. 杨振宁李政道分手内幕
  10. 圆满收官,在这里读利尔达的2021