看了无数资料,总结一下自定义View
先明白一个自定义View的三大流程

  • onMeasure()
    测量,决定View的大小

  • onLayout()
    布局,决定View在ViewGroup中的位置

  • onDraw()
    绘制,画出这个View的内容

这三个方法都存在于View类中,我们自定义View需要针对这三个方法做出修改来达到我们需要的目标或功能
先来一个最基本的例子,我们单纯的画一个圆,我们只需修改onDraw()方法即可
MyCustomVew.java

  1. public class MyCustomView extends View { 


  2. public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) { 

  3. super(context, attrs, defStyleAttr); 

  4. // TODO Auto-generated constructor stub 




  5. public MyCustomView(Context context, AttributeSet attrs) { 

  6. super(context, attrs); 

  7. // TODO Auto-generated constructor stub 




  8. public MyCustomView(Context context) { 

  9. super(context); 

  10. // TODO Auto-generated constructor stub 




  11. @Override 

  12. protected void onDraw(Canvas canvas) { 

  13. // TODO Auto-generated method stub 

  14. super.onDraw(canvas); 

  15. // 实例化画笔并打开抗锯齿 

  16. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

  17. // 设置画笔颜色 

  18. paint.setColor(Color.RED); 

  19. /** 

  20. * 画笔样式分三种:  

  21. * 1.Paint.Style.STROKE:描边  

  22. * 2.Paint.Style.FILL_AND_STROKE:描边并填充 

  23. * 3.Paint.Style.FILL:填充 既然是画圆,那么就选择样式为描边 

  24. */ 

  25. paint.setStyle(Paint.Style.STROKE); 

  26. /* 

  27. * 设置描边的粗细,单位:像素px 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 

  28. */ 

  29. paint.setStrokeWidth(10); 

  30. // 参数含义依次为:圆心X坐标、圆心Y坐标、圆半径、画笔 

  31. canvas.drawCircle(500, 500, 200, paint); 





在Activity的布局文件中引入这个自定义View

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

  2. xmlns:app="http://schemas.android.com/apk/res-auto" 

  3. android:id="@+id/main_root_ll" 

  4. android:layout_width="match_parent" 

  5. android:layout_height="match_parent" 

  6. android:orientation="vertical" > 


  7. <com.example.testcustomview.MyCustomView 

  8. android:id="@+id/main_cv" 

  9. android:layout_width="match_parent" 

  10. android:layout_height="match_parent" /> 


  11. </LinearLayout> 

运行结果如下

如果我们想要让这个圆动起来呢?我们只要不断的去修改onDraw()不断的绘制就可以了
譬如我们想要画一个由小到大的实心圆,我们需要做的就是不断的改变的半径
MyCustomView

  1. public class MyCustomView extends View implements Runnable { 


  2. private int radiu;// 圆的半径 

  3. private Paint paint; 


  4. public MyCustomView(Context context, AttributeSet attrs) { 

  5. super(context, attrs); 

  6. initPaint(); 




  7. public MyCustomView(Context context) { 

  8. this(context, null); 




  9. public void initPaint() { 

  10. paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

  11. // 设置画笔颜色 

  12. paint.setColor(Color.RED); 

  13. /** 

  14. * 画笔样式分三种: 1.Paint.Style.STROKE:描边 2.Paint.Style.FILL_AND_STROKE:描边并填充 

  15. * 3.Paint.Style.FILL:填充 既然是画圆,那么就选择样式为描边 

  16. */ 

  17. paint.setStyle(Paint.Style.FILL_AND_STROKE); 

  18. /* 

  19. * 设置描边的粗细,单位:像素px 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 

  20. */ 

  21. paint.setStrokeWidth(10); 




  22. @Override 

  23. protected void onDraw(Canvas canvas) { 

  24. // TODO Auto-generated method stub 

  25. super.onDraw(canvas); 

  26. canvas.drawCircle(500, 500, radiu, paint); 




  27. @Override 

  28. public void run() { 

  29. while (radiu <= 200) { 

  30. try { 

  31. radiu += 10; 

  32. Thread.sleep(300); 

  33. //刷新View 

  34. postInvalidate(); 

  35. } catch (InterruptedException e) { 

  36. // TODO Auto-generated catch block 

  37. e.printStackTrace(); 









可以看到我们在run方法中调用了一个postInvalidate(),这个方法还有一个对应的方法Invalidate(),这两个方法的区别在于

  • postInvalidate()
    前者是在非UI线程中使,用来刷新界面

  • Invalidate()
    在UI线程自身中使用,用来刷新界面

刚才的例子是画了一个圆,canvas还提供了其他一系列方法来供我们调用,用来画各种各样的图形
下篇文章来介绍

自定义View(一),初识自定义View的更多相关文章

  1. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

  2. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  3. Android 自定义View修炼-自定义可动画展开收缩View的实现

    有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现. 本例中,采用继承FrameLayout来实现自定义的ExpandView.下面将详细介绍各 ...

  4. 自定义View 一 (继承VIew重写onDraw方法)

    项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int ...

  5. Android查缺补漏(View篇)--自定义 View 的基本流程

    View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...

  6. Android view相关与自定义View

    一.关于view的机制的问答 1.gesturedetector和ontouchevent的区别 gesturedetector指的是手势检测器,根据动态手势的运动特性,提出了速率边沿检测算法来分割手 ...

  7. 【Android - 自定义View】之自定义九宫格手势解锁控件

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 LockView ,继承自View类: (2)这个自定义View实现了应用中常见的九宫格手势解锁功能,可以用于保证应用安全: ( ...

  8. 【Android - 自定义View】之自定义View实现“刮刮卡”效果

    首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的“刮刮卡”的效果,即用户可以刮开覆盖层, ...

  9. 【Android - 自定义View】之自定义可滚动的流式布局

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 FlowLayout ,继承自ViewGroup类: (2)在这个自定义View中,用户可以放入所有继承自View类的视图,这个 ...

  10. 【Android - 自定义View】之自定义可下拉刷新或上拉加载的ListView

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 RefreshableListView ,继承自ListView类: (2)在这个自定义View中,用户可以设置是否支持下拉刷新 ...

随机推荐

  1. some try on func swap about & and *

    import "fmt" func swap(x,y *int ) { //x ,y = y,x //fault /* t := *x *x = *y *y = t */ //tr ...

  2. 树莓派小用手册(安装系统,配置图形界面,连接WiFi,调用摄像头,安装ffmpeg)

    安装树莓派系统(重装) 准备工作: 安装需要干净的TF卡(最好 8G 以上),如果是重装的话,需要先将其清理后再使用.清理步骤下面会给出,清理需要工具 DiskGenius,下载链接:http://w ...

  3. Qt编写安防视频监控系统(界面很漂亮)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  4. MongoDB开发深入之三:复制

    复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录,复制是将主节点的oplog日志同步并应用到其他从节点的过程. 首先要理解两个概念:1.复制:提供冗余和高可用性:2. ...

  5. Docker管理控制相关资源

    一台宿主机可以放多个容器,默认的情况下,Docker 没有对容器进行硬件资源的限制,当容器负载过高时会尽可能的占用宿主机资源,所以有时候我们需要对容器的资源使用设置一个上限,这里就需要管理 Docke ...

  6. javascript Round Function

    var rounded = Math.round( number * 10 ) / 10; // round to one digit var rounded = Math.round( number ...

  7. Linux 中的-rwxr-xr-x权限代表什么意思

    Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...

  8. SpringBoot中使用Thymeleaf模板

    1.引入pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  9. 材质(Material)和几何体(Geometry)

    1.    材质 一个材质结合一个几何体可以组成一个mesh对象.材质就像物体的皮肤,决定了几何体的外表.例如:皮肤定义了一个几何体看起来是否像金属.透明与否,或者显示为线框. 基本的材质如下: 1. ...

  10. day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版

    day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...