一、自定义view需要继承View类

既然是自定义view所以为了方便需要继承View类,或者其他View类例如TextView等类

二、必须写入构造方法否则无法使用findViewbyId()方法找到控件

之定义View必须写入构造函数而且需要函数重载,并且加入super(contex)等样式如下

我第一次做自定义view时就忘了使用super(context,attrs)这个方法,结果findviewbyid()找不到xml里面的控件

    public MyView(Context context) {super(context);//这个必须有否则findviewbyid找不到}public MyView(Context context, AttributeSet attrs) {super(context,attrs);//这个必须有否则findviewbyid找不到init(context,attrs);}

二、必须重写 onDraw(Canvas canvas)方法

onDraw方法如下,使用postInvalidate()重新调用(onDraw)
@Override
protected void onDraw(Canvas canvas) {
}
我理解onDraw的解释:就是在这里画的意思。“在这里画”是一个简单的阐述:那么“这里”指的是哪里呢?用什么来画?怎么画才能不超过边框限制?我能不能自己制定画布尺寸?知道怎么画了一幅到底画到屏幕哪里了呢?下面一个一个的解释一下

1.“在这里画”的“这里”指的是:X轴:从0到getMeasuredWidth()(获取窗口宽度)结束。Y轴:从0到getMeasuredHeight()(获取窗口的高度)结束

3、用什么来画:用画笔画到画布上,其中画笔是:Paint 类。画布:Canvas类。画布可以无限大,但是view是有限的。

2、怎么画才能显示到边框内:上面介绍了窗口和画布的关系 ,其中窗口的尺寸是(上面已经介绍了):getMeasuredWidth()(获取窗口宽度)和getMeasuredHeight()(获取窗口的高度),所以是一个有限的大小(普通屏幕分辨率1920*1080)。而画布的大小我们可以随意设置,类型还是folat,设置几个亿也不会报错。所以如果一个画布尺寸和一个view尺寸如果设置的不对则不能正确显示。打个比喻,view就相当于望远镜,Canvas就相当于景色,景色很大但是望远镜只能看到其中一点

3、我们能不能自己定制画布尺寸:可以自定义画布的尺寸,使用setMeasuredDimension(宽,高)这个方法来设定画布的尺,单纯使用这个方法则不受父窗
控制,如果想让自定义view达到理想的尺寸进行绘制则需要重写onMeasure方法(下面介绍)

4、知道怎么画了一幅到底画到屏幕哪里了:可以通过下面四个方法获取

         getLeft();//窗口左边到屏幕左边的距离getRight();//窗口右边到屏幕左边的距离getBottom();//窗口底边到顶的距离getTop();//窗口定编到屏幕顶的距离

三、重写onMeasure来确定view的尺寸

onMeasure方法的作用:打个比方客户需要种香蕉(xml设置) ,然后让管家(父窗口)分给你(自定义view)一块地去种香蕉,管家会先顾全大局分配了一块地给你(这个就是onMeasure方法),如果你看了一下这块地不够你种,你不用商量可以直接给管家闹翻,设置你需要的地方来种香蕉.
综合上述:
1、xml设置的 android:layout_width="##dp" 和android:layout_height="##dp"会使用 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)这个方法进行传递,其中widthMeasureSpec和heightMeasureSpec就是窗口的宽度和高度,但是,这个数值不能直接使用因为为了节省空间android把模式也压缩到了这个整数里面了,所以我们需要使用 int size=MeasureSpec.getSize(measureSpec))这个方法提取尺寸和int mode=MeasureSpec.getMode(measureSpec)这个方法提取父窗口给定的模式

2、这时候我们知道了模式和窗口的尺寸 只需要判断这个尺寸够不够,如果够我们用就是用父窗口传来的尺寸进行设置 否则无视父窗口给的尺寸直接设定自己想要的尺寸。设置尺寸使用setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),MeasureSpec.getSize(heightMeasureSpec));//设置父窗口给的尺寸
这段代码描述了onMeasure(),设置完窗口尺寸了就可以在onDraw

    private int getMySize(int defaultSize,int measureSpec){int mySize=defaultSize;int mode=MeasureSpec.getMode(measureSpec);//取测量模式int size=MeasureSpec.getSize(measureSpec);//取测量长度switch (mode){case MeasureSpec.UNSPECIFIED://如果没有指定大小,就设置为默认大小mySize=defaultSize;break;//如果测量模式是最大取值size//我们将大小取最大值,你也可以取其他值case MeasureSpec.AT_MOST:mySize=size;break;//如果是固定的大小,那就不要去改变它case MeasureSpec.EXACTLY:mySize=size;break;}return mySize;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width=getMySize(100,widthMeasureSpec);int heigth=getMySize(100,heightMeasureSpec);if (width<heigth){heigth=width;}else{width=heigth;}setMeasuredDimension(width,heigth);}

四、一些绘制方法

    canvas.drawPoint(200, 200, paint);//画一个点canvas.drawLine(200, 300, 600, 300, paint);//画一条线canvas.drawLines(new float[]{200, 550, 350, 850, 200, 550, 600, 850},paint);//画多条线//画矩形//paint.setStyle(Paint.Style.FILL);这里设置的填充,如果想画空心的设置style为STROKEcanvas.drawRect(100, 200, 300, 400, paint); //矩形第一种Rect rect = new Rect(100, 200, 300, 400);    //矩形第二种    canvas.drawRect(rect,paint);//画圆角矩形canvas.drawRoundRect(100, 200, 800, 600, 80, 80, paint);//第一种RectF rectF = new RectF(100, 200, 800, 600); //第二种canvas.drawRoundRect(rectF, 80, 80, paint); //第二种//画椭圆canvas.drawOval(100, 200, 900, 600, paint);//第一种RectF rectF = new RectF(100, 200, 900, 600);//第二种canvas.drawOval(rectF,paint);//画圆canvas.drawCircle(500, 500, 250, paint);//  前两个参数是圆心坐标,第三个参数是半径

自定义View注意事项相关推荐

  1. Android自定义View注意事项

    Android自定义View系列 Android自定义View之Paint绘制文字和线 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义V ...

  2. Android自定义View之Paint绘制文字和线

    Android自定义View系列 Android自定义View注意事项 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义View之轻松实现 ...

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

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

  4. Android中的自定义View(一)

    文章收藏的好句子:成功从来不是一蹴而就,而是日积月累的努力叠加的结果. ps:本文是基于 Android API 31 来分析的,文章写的 demo 是用 AndroidStudio 工具来开发的. ...

  5. 超全的Android面经_安卓面经(20/30)之自定义View全解析

    系列专栏: 安卓高频面经解析大全专栏链接:150道安卓高频面试题全解析 安卓高频面经解析大全目录详情 : 安卓面经_anroid面经_150道安卓常见基础面试题全解析 安卓系统Framework面经专 ...

  6. HenCoder Android 开发进阶:自定义 View 1-5 绘制顺序

    这期是 HenCoder 自定义绘制的第 1-5 期:绘制顺序 之前的内容在这里:  HenCoder Android 开发进阶 自定义 View 1-1 绘制基础  HenCoder Android ...

  7. Android 换肤(全局换肤,部分换肤,字体替换,导航栏替换,自定义view换肤,夜间/日间模式)

    采集 大致流程 监听所有activity的生命周期回调 //SkinActivityLifecycle application.registerActivityLifecycleCallbacks(n ...

  8. 自定义View 1-2 Paint.md

    #自定义View 1-2 Paint ###Paint 大致可以分为 4类 颜色 效果 drawText() 初始化 1 颜色 1.1简单使用 paint.setColor(Color.parseCo ...

  9. android 自定义view仿支付宝写五褔及播放

    本文记录一下实现仿支付宝写五褔及回放的过程. 先看效果如下,没有找到相关的背景图,只能以田字格当作背景. 整个过程分为两部分,一部分是写字,一部份是回放. 该过程主要使用了path和pathmeasu ...

最新文章

  1. oppor17android版本,OPPOR17ColorOS系统怎么样
  2. 如何制定一份永远完不成的年度计划?
  3. ElasticSearch 组合过滤器
  4. Scrapy shell调试网页的信息
  5. 分享一次 Java 内存泄漏的排查
  6. 技术沙龙直播 | 数据库技术探索及行业应用
  7. MySQL学习笔记:SQL基本语法
  8. 小米改鸿蒙系统,小米、OV傻眼 魅族要用鸿蒙系统!
  9. LeetCode 437. 路径总和 III
  10. Android IPC机制(4)-Binder连接池
  11. 动态通讯录(动态内存开辟)(C语言)
  12. python自学---最全网址
  13. 蓝桥杯真题:乘积尾零
  14. Android免费获取短信验证码
  15. 下载软件时的X86和X64的区别
  16. 支付宝AR红包关闭,看昔日“网红”如何过气
  17. 基于Nginx实现访问控制,连接限制离
  18. java 修改图片名_Java修改文件夹下图片的名称
  19. 分分钟玩转multiprocessing多进程编程?
  20. 众多世界500强企业集聚第二届数博会,数字产业大幕即将开启!

热门文章

  1. 华为无线网络的配置——AP上的业务数据采用直接转发模式
  2. 成品app直播源码中Android酷炫礼物动画实现方案(上篇)
  3. 基于Uniapp+SpringBoot实现微信小程序授权登录
  4. Linux系统安装迷你世界,迷你世界下载安装_迷你世界下载最新版_迷你世界官方版下载-太平洋下载中心...
  5. 用什么软件测试ipad性能,数码专栏 篇一:关于2018款ipad办公性能测试,真得适合吗?...
  6. 自建or用SaaS|ToB企业如何玩转官网数字化改造
  7. 计算机主机和键盘是串行通信,计算机基础 - 理论必考知识点汇编(2010年12月修订版)-...
  8. 关于 virtio 的重要知识点总结
  9. [模板总结] - 快速选择 (霍尔Quick Selection)
  10. 初学物联网:智能手表制作方案