一.自定义属性

1.在res下的values下面新建attrs.xml

2.在布局中使用,声明命名空间

3.在自定义View构造方法中通过TypedArray获取属性

4.必须回收 array.recycle();

二.重写onMeasure()方法

//widthMeasureSpec : 一个32位的值,会包含两个信息:
//模式:前2位;对应的值:后30位
// 获取宽高的模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
// 获取前两位
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
// 获取宽高的值
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
// 获取后面30位
int heightSize = MeasureSpec.getSize(heightMeasureSpec);

MeasureSpec.AT_MOST : 在布局中指定了wrap_content

MeasureSpec.EXACTLY : 在不居中指定了确切的值 100dp match_parent fill_parent

MeasureSpec.UNSPECIFIED : 尽可能的大,很少能用到。ListView , ScrollView 在测量子布局的时候会用UNSPECIFIED 。ScrollView + ListView 会显示不全问题

三.重写onDraw(canvas)

常用方法:

canvas.drawText();//画文本

canvas.drawArc();//画弧

canvas.drawCircle();//画圆

canvas.drawBitmap();

canvas.drawLine();canvas.drawLines();

canvas.drawPath();

canvas.drawRect();canvas.drawRoundRect();

canvas.drawOval();

canvas.drawPoint();

问题:自定义view时继承LinearLayout能不能显示效果?不能,默认的ViewGroup不会调用onDraw方法,为什么?

draw(Canvas canvas)方法中,采用模板设计:

if (!dirtyOpaque) onDraw(canvas);dispatchDraw(canvas);onDrawForeground(canvas);

dirtyOpaque是false才执行,其实就是由privateFlags -> mPrivateFlags的值决定

final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE
&& (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);

mPrivateFlags 到底是怎么赋值的?在View的构造函数中调用 computeOpaqueFlags

protected void computeOpaqueFlags() {if (mBackground != null && mBackground.getOpacity() == PixelFormat.OPAQUE) {mPrivateFlags |= PFLAG_OPAQUE_BACKGROUND;} else {mPrivateFlags &= ~PFLAG_OPAQUE_BACKGROUND;}final int flags = mViewFlags;if (((flags & SCROLLBARS_VERTICAL) == 0 && (flags & SCROLLBARS_HORIZONTAL) == 0) ||(flags & SCROLLBARS_STYLE_MASK) == SCROLLBARS_INSIDE_OVERLAY ||(flags & SCROLLBARS_STYLE_MASK) == SCROLLBARS_OUTSIDE_OVERLAY) {mPrivateFlags |= PFLAG_OPAQUE_SCROLLBARS;} else {mPrivateFlags &= ~PFLAG_OPAQUE_SCROLLBARS;}
}

在ViewGroup的initViewGroup方法中:

private void initViewGroup() {// ViewGroup doesn't draw by defaultif (!debugDraw()) {setFlags(WILL_NOT_DRAW, DRAW_MASK);}
}

这里会使mPrivateFlags重新赋值,导致dirtyOpaque为true,最终不执行onDraw方法

如何解决? 思路:改变 mPrivateFlags

1.在自定义View构造方法中调用一下方法,二选一即可

(1).setBackgroundColor(Color.TRANSPARENT);

(2).setWillNotDraw(false);

2.调用dispatchDraw()

Android自定义View基本步骤相关推荐

  1. Android自定义ViewGroup基本步骤

    1.自定义属性,获取自定义属性,可参考 ​ Android自定义View基本步骤 ​ 2.onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽 高 3.onDra ...

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

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

  3. Android 自定义view的知识梳理。

    关于越来越多的新手找不到自定义view的学习资料或者无法学会自定义view. 本篇专门讲解一下初级进阶必经之路,自定义view.. 我们先把自定义View细分一下,分为两种  A 自定义ViewGro ...

  4. android 自定义 child,Android自定义View

    前言 Android自定义View的详细步骤是我们每一个Android开发人员都必须掌握的技能,因为在开发中总会遇到自定义View的需求.为了提高自己的技术水平,自己就系统的去研究了一下,在这里写下一 ...

  5. android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性

    android 自定义view属性 一个完美的自定义控件也可以添加xml来配置属性和风格.要实现这一点,可按照下列步骤来做: 1) 添加自定义属性到xml文件中 2) 在xml的中,指定属性的值 3) ...

  6. Android 系统(201)---Android 自定义View实战系列 :时间轴

    Android 自定义View实战系列 :时间轴 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常 ...

  7. [原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  8. Android自定义view之事件传递机制

    Android自定义view之事件传递机制 在上一篇文章<Android自定义view之measure.layout.draw三大流程>中,我们探讨了一下view的显示过程.不太熟悉的同学 ...

  9. Android 自定义View

    [Android 自定义View] Android 自定义View 自定义View基础 自定义TextView 继承View重写onDraw方法 View的构造方法 自定义属性 创建attrsxml文 ...

最新文章

  1. 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
  2. noj 邮票分你一半z的生日
  3. PHP常用的数组函数
  4. Xamarin支持微软HoloLens混合现实开发
  5. 据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题
  6. 【Tensorflow】小白入门实战基础篇(下)
  7. AC日记——小木棍【数据加强版】 洛谷 P1120
  8. 库克去年薪酬约6亿元,超员工1400倍,机构建议其降薪
  9. 微软发布 Autodesk FBX 漏洞带外安全公告,将于5月推出补丁
  10. python是什么 自学-你是如何自学 Python 的?
  11. Android BlueDroid(一):BlueDroid概述
  12. django管理界面使用与bootstrap模板使用
  13. 极客大学产品经理训练营:产品经理的项目管理 第14课总结
  14. Python书法碑帖分割(分别以对于汉字命名)
  15. Java拆分为姓和名
  16. 新型多功能、高性能量子点,可以用于医学成像、量子计算
  17. ArcGIS Pro鹰眼图快速制图
  18. 编写一个java后台
  19. 有测试无损音乐真假的软件,这几招教你辨析真假无损音乐,非常实用!
  20. 在linux中搭建maven私服

热门文章

  1. 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)
  2. 联合索引最左匹配原则成因
  3. mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
  4. 加速mysql导入时间_加快mysql导入导出速度
  5. FastAI 2019课程学习笔记 lesson 2:自行获取数据并创建分类器
  6. 【牛腩新闻发布系统】整合前台04
  7. 【VB】学生信息管理系统3——连接数据库的前提
  8. 基于短语的统计机器翻(PBMT) 开源工具 :Moses
  9. 通俗易懂的Go协程的引入及GMP模型简介
  10. Cache 与Memory架构及数据交互