自定义View(一),初识自定义View
看了无数资料,总结一下自定义View
先明白一个自定义View的三大流程
onMeasure()
测量,决定View的大小onLayout()
布局,决定View在ViewGroup中的位置onDraw()
绘制,画出这个View的内容
这三个方法都存在于View类中,我们自定义View需要针对这三个方法做出修改来达到我们需要的目标或功能
先来一个最基本的例子,我们单纯的画一个圆,我们只需修改onDraw()方法即可
MyCustomVew.java
- public class MyCustomView extends View {
- public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- // TODO Auto-generated constructor stub
- }
- public MyCustomView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
- public MyCustomView(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- // 实例化画笔并打开抗锯齿
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- // 设置画笔颜色
- paint.setColor(Color.RED);
- /**
- * 画笔样式分三种:
- * 1.Paint.Style.STROKE:描边
- * 2.Paint.Style.FILL_AND_STROKE:描边并填充
- * 3.Paint.Style.FILL:填充 既然是画圆,那么就选择样式为描边
- */
- paint.setStyle(Paint.Style.STROKE);
- /*
- * 设置描边的粗细,单位:像素px 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素
- */
- paint.setStrokeWidth(10);
- // 参数含义依次为:圆心X坐标、圆心Y坐标、圆半径、画笔
- canvas.drawCircle(500, 500, 200, paint);
- }
- }
在Activity的布局文件中引入这个自定义View
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/main_root_ll"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <com.example.testcustomview.MyCustomView
- android:id="@+id/main_cv"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </LinearLayout>
运行结果如下
如果我们想要让这个圆动起来呢?我们只要不断的去修改onDraw()不断的绘制就可以了
譬如我们想要画一个由小到大的实心圆,我们需要做的就是不断的改变的半径
MyCustomView
- public class MyCustomView extends View implements Runnable {
- private int radiu;// 圆的半径
- private Paint paint;
- public MyCustomView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initPaint();
- }
- public MyCustomView(Context context) {
- this(context, null);
- }
- public void initPaint() {
- paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- // 设置画笔颜色
- paint.setColor(Color.RED);
- /**
- * 画笔样式分三种: 1.Paint.Style.STROKE:描边 2.Paint.Style.FILL_AND_STROKE:描边并填充
- * 3.Paint.Style.FILL:填充 既然是画圆,那么就选择样式为描边
- */
- paint.setStyle(Paint.Style.FILL_AND_STROKE);
- /*
- * 设置描边的粗细,单位:像素px 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素
- */
- paint.setStrokeWidth(10);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- canvas.drawCircle(500, 500, radiu, paint);
- }
- @Override
- public void run() {
- while (radiu <= 200) {
- try {
- radiu += 10;
- Thread.sleep(300);
- //刷新View
- postInvalidate();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
可以看到我们在run方法中调用了一个postInvalidate(),这个方法还有一个对应的方法Invalidate(),这两个方法的区别在于
postInvalidate()
前者是在非UI线程中使,用来刷新界面Invalidate()
在UI线程自身中使用,用来刷新界面
刚才的例子是画了一个圆,canvas还提供了其他一系列方法来供我们调用,用来画各种各样的图形
下篇文章来介绍
自定义View(一),初识自定义View的更多相关文章
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...
- Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View
一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...
- Android 自定义View修炼-自定义可动画展开收缩View的实现
有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现. 本例中,采用继承FrameLayout来实现自定义的ExpandView.下面将详细介绍各 ...
- 自定义View 一 (继承VIew重写onDraw方法)
项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int ...
- Android查缺补漏(View篇)--自定义 View 的基本流程
View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...
- Android view相关与自定义View
一.关于view的机制的问答 1.gesturedetector和ontouchevent的区别 gesturedetector指的是手势检测器,根据动态手势的运动特性,提出了速率边沿检测算法来分割手 ...
- 【Android - 自定义View】之自定义九宫格手势解锁控件
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 LockView ,继承自View类: (2)这个自定义View实现了应用中常见的九宫格手势解锁功能,可以用于保证应用安全: ( ...
- 【Android - 自定义View】之自定义View实现“刮刮卡”效果
首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的“刮刮卡”的效果,即用户可以刮开覆盖层, ...
- 【Android - 自定义View】之自定义可滚动的流式布局
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 FlowLayout ,继承自ViewGroup类: (2)在这个自定义View中,用户可以放入所有继承自View类的视图,这个 ...
- 【Android - 自定义View】之自定义可下拉刷新或上拉加载的ListView
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 RefreshableListView ,继承自ListView类: (2)在这个自定义View中,用户可以设置是否支持下拉刷新 ...
随机推荐
- Angular4.0 探索子路由和懒加载 loadChildren
参考文章: Angular4路由快速入门 http://www.jianshu.com/p/e72c79c6968e Angular2文档学习的知识点摘要——Angular模块(NgModule)h ...
- [转]Gnome桌面的录屏插件easyscreencast
原文地址:https://www.linuxprobe.com/gnome-easyscreencast.html
- [Docker] 六步运行一个 sentry 实例
# 6步, https://hub.docker.com/_/sentry/ # 依赖Redisdocker run -d --name sentry-redis redis:3.2.12 # 依赖p ...
- golang xorm时区问题
mysql连接后面加 &loc=Local 否则执行sql的时间格式,存到数据库会按0时区 UTC存储
- 研发的困境----DEVOPS
1.研发的困境 互联网的环境 互联网这个环境比较特别,包括现在不只是互联网,就算是被互联网赋能的这些“互联网+”的企业也在改变,用户在发生变化,用户构成的群体在发生变化,群体造成场景的变化,场景营造新 ...
- Listener学习
监听器Listener用于监听web应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.常用于统计 ...
- 虚拟机CentOS克隆
1.什么是克隆 就是以某虚拟机为母版,复制出一个一模一样的虚拟机出来,包括里面的数据 2.创建克隆 正常选择通过快照创建克隆(只能是关机状态下的克隆) 1.选择关机状态下的快照,然后点击克隆 2.点击 ...
- Python之路【第二十七篇】:web服务器django
Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ...
- C/C++、Qt4实现FTP客户端(有无界面版)
操作系统:Ubuntu 12.04 LTS 开发工具:GNU4.6.3,C/C++标准库,Qt4,Qt Creator Documentation 2.4.1 码云:传送门,GitHub:传送门 相关 ...
- CLRS10.1-6练习 - 用双栈实现队列
双栈实现队列算法: 分别考虑队列两种操作入队和出队,我们假设使用栈s1 s2, s1用来模拟入队,s2用来模拟出队 入队: 入队操作直接执行s1.push即可 出队: 代码实现 package hel ...