Android自定义View基本步骤
一.自定义属性
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基本步骤相关推荐
- Android自定义ViewGroup基本步骤
1.自定义属性,获取自定义属性,可参考 Android自定义View基本步骤 2.onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽 高 3.onDra ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- Android 自定义view的知识梳理。
关于越来越多的新手找不到自定义view的学习资料或者无法学会自定义view. 本篇专门讲解一下初级进阶必经之路,自定义view.. 我们先把自定义View细分一下,分为两种 A 自定义ViewGro ...
- android 自定义 child,Android自定义View
前言 Android自定义View的详细步骤是我们每一个Android开发人员都必须掌握的技能,因为在开发中总会遇到自定义View的需求.为了提高自己的技术水平,自己就系统的去研究了一下,在这里写下一 ...
- android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性
android 自定义view属性 一个完美的自定义控件也可以添加xml来配置属性和风格.要实现这一点,可按照下列步骤来做: 1) 添加自定义属性到xml文件中 2) 在xml的中,指定属性的值 3) ...
- Android 系统(201)---Android 自定义View实战系列 :时间轴
Android 自定义View实战系列 :时间轴 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常 ...
- [原] Android 自定义View 密码框 例子
遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...
- Android自定义view之事件传递机制
Android自定义view之事件传递机制 在上一篇文章<Android自定义view之measure.layout.draw三大流程>中,我们探讨了一下view的显示过程.不太熟悉的同学 ...
- Android 自定义View
[Android 自定义View] Android 自定义View 自定义View基础 自定义TextView 继承View重写onDraw方法 View的构造方法 自定义属性 创建attrsxml文 ...
最新文章
- 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
- noj 邮票分你一半z的生日
- PHP常用的数组函数
- Xamarin支持微软HoloLens混合现实开发
- 据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题
- 【Tensorflow】小白入门实战基础篇(下)
- AC日记——小木棍【数据加强版】 洛谷 P1120
- 库克去年薪酬约6亿元,超员工1400倍,机构建议其降薪
- 微软发布 Autodesk FBX 漏洞带外安全公告,将于5月推出补丁
- python是什么 自学-你是如何自学 Python 的?
- Android BlueDroid(一):BlueDroid概述
- django管理界面使用与bootstrap模板使用
- 极客大学产品经理训练营:产品经理的项目管理 第14课总结
- Python书法碑帖分割(分别以对于汉字命名)
- Java拆分为姓和名
- 新型多功能、高性能量子点,可以用于医学成像、量子计算
- ArcGIS Pro鹰眼图快速制图
- 编写一个java后台
- 有测试无损音乐真假的软件,这几招教你辨析真假无损音乐,非常实用!
- 在linux中搭建maven私服
热门文章
- 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)
- 联合索引最左匹配原则成因
- mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
- 加速mysql导入时间_加快mysql导入导出速度
- FastAI 2019课程学习笔记 lesson 2:自行获取数据并创建分类器
- 【牛腩新闻发布系统】整合前台04
- 【VB】学生信息管理系统3——连接数据库的前提
- 基于短语的统计机器翻(PBMT) 开源工具 :Moses
- 通俗易懂的Go协程的引入及GMP模型简介
- Cache 与Memory架构及数据交互