前言:自定义view重要的部分就是view的展示样式,为了实现view的样式可以重写onDraw()方法。

一:Override onDraw()

    1.当覆盖了onDraw()方法后,需要一个Canvas变量,就是一个画布,他能画直线等各种形状,还能画bitmap等等。

     当使用画布的时候,可以提供一个画笔:Paint。就是设置画出图形的一些特性,如颜色等。

二:创建图形对象

    1.在android.graphics中提供了两大类:

        1.Canvas:描述画什么。

        2.Paint:怎么画。

    2.比如,你想用Canvas一线,就可以定义一个Paint来设置这条线的颜色等属性,或是用Canvas画一个矩形的时候,

     Paint可以定义一个颜色来填充矩形,或是不填充。

    3.在画图形之前,可以定义多个Paint,并放在一个初始化函数中初始化:

        

    4.在画之前初始化这些画笔是很必要的,因为初始化画笔是个很费资源的过程,如果将初始化过程放在了onDraw中,

     用户界面就会显得有些呆滞,停顿的感觉。

二:处理layout事件

    1.为了能适当的展示你的控件的大小,往往或通过计算屏幕的大小,密度等属性,来设置控件最终显示的大小。切记

     千万不要自己以为控件就是那么大,要根据实际情况来设置控件的大小,还有为不同的排列方式,提供不同的布局。

    2.view中提供了很多用于测量大小的方法,他们的大多数都不能overridden,如果没有特殊的需要,设置控件的大小

     ,只需要overridden中的onSizeChanged();

    3.onSizeChanged()方法当,第一次给view赋值的时候,或是任何情况view的大小被改变的时候,都会调用此方法。

     计算位置,计算尺寸,都需要在此方法中完成。

    4.当设置view的大小的时候,layout manager会默认包含了view的padding值,所以必须控制padding的值,当给

     view设置大小的时候:

        

    5.如果你想更好的控制控件的大小,需要实现onMeasure方法,这个方法的两个参数表示父控件希望view的显示大小,

     这两个值的大小是硬性标准还是建议值。下面的实例:设置控件的大小以其足够大来容纳内容:

        

      注意:1.设置控件的大小需要考虑padding,正如上文提到过的,这是view的责任。

         2.其中的resolveSizeAndState(int,int)方法用于计算view最终显示的大小高度。

            其中的View.MeasureSpec有三个常量:

                1.UNSPECIFIED:父控件没有对子view任何限制。

                2.EXACTLY:父控件给了一个适当的大小给子view,当子view设置大小的时候,收到他的束缚。

                3.AT_MOST:尽可能的扩展到指定的大小。

         3.这个方法没有返回值,需要在最后强制性的调用setMeasureDimension(w,h)方法,否则在运行时会出现异常。

三:开始画了

    1.一旦你完成了初始化工作,定义画笔,确定view的大小,你就可以通过实现onDraw()方法来画控件了。虽然每个控件不同,

     但是有一些通用的东西:

       1.画文字:调用 drawText(),通过 setTypeface()设置字体,通过setColor()设置文字的颜色。

       2.绘制基本形状:绘制矩形:drawRect(),绘制椭圆:drawOval(),绘制弧线:drawArc()改变是否填充,是否描边等调用 setStyle()

       3.绘制更复杂的图形就需要使用Path类了,可以将多个线条和多个曲线添加到一个Path对象中,然后使用drawPath(),

        绘制path对象。通过调用setStyle()来设置填充,描边等属性。

       4.通过创建 LinearGradient来创建填充渐变对象,然后通过 setShader()将渐变对象设置到形状上。

       5.用drawBitmap();对象来绘制图片。

       

android自定义View_1——Custom Drawing的更多相关文章

  1. Android 自定义View及其在布局文件中的使用示例(二)

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3530213.html From crash_coder linguowu linguowu0622@gami ...

  2. Android自定义视图教程

    Android自定义视图教程 Android的UI元素都是基于View(屏幕中单个元素)和ViewGroup(元素的集合),Android有许多自带的组件和布局,比如Button.TextView.R ...

  3. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

  4. Android 自定义View 三板斧之二——组合现有控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 上文说过了如何继承现 ...

  5. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

  6. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

  7. Android 自定义title 之Action Bar

    Android 自定义title 之Action Bar 2014-06-29  飞鹰飞龙...  摘自 博客园  阅 10519  转 25 转藏到我的图书馆   微信分享:   Action Ba ...

  8. Android -- 自定义View小Demo,绘制四位数随机码(一)

    1,现在有这样一个需求,实现显示随机随机数可能在代码中直接很简单的就实现了,但是现在我们直接自定义View来实现这个效果,那么我们来分析一波吧,我们允许开发者自己设置这个textview的大小,颜色, ...

  9. Android自定义View

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于Android自定义View ...

随机推荐

  1. iOS:Xcode中SVN不能提交CocoaPods中的.a文件的解决方法

    不能提交.a文件, 这个与SVN的配置有关, 其实与xcode倒没有关系. 解决方法: 1. 打开终端,  在命令行中输入: vi ~/.subversion/config  来打开配置文件.2. 然 ...

  2. javascript快速入门5--数组与对象

    数组 数组,实际上就是将一大堆相似的数据有秩序的放在格子箱中,十分像药房里的那些柜子. 数据1 数据2 数据3 数据4 数据5 数据6 用代码创建数组 var arr = new Array();// ...

  3. [Python爬虫] 之十七:Selenium +phantomjs 利用 pyquery抓取梅花网数据

    一.介绍 本例子用Selenium +phantomjs爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字: ...

  4. Android手掌抑制功能的实现

    近期须要实现一个功能,在Activity中有一个手写区域,为了更好的用户体验,须要满足即使整个手掌放在屏幕上时(android平板,屏幕比較大)也仅仅响应手写区域内的操作,即在支持多点触控的情况下,仅 ...

  5. 【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具

    iTop产品针对的主要应用场景为:内部IT支持.IT外包管理.数据中心运维管理和企业IT资产管理.常青管理从绿象认证产品中选取了iTop作为主要推荐产品,本类别的绿象认证产品还包括:OTRS和RT3等 ...

  6. 【重点突破】—— 当better-scroll 遇见Vue

    前言:在学习黄轶老师的<Vue.js高仿饿了么外卖App>课程中接触到了better-scroll第三方JavaScript组件库,这是黄轶老师自己基于iscroll重写的库.这里结合黄轶 ...

  7. selinux 是什么 (Linux)

    SElinux是Linux安全加强工具.关闭用setenforce 0或者修改文件vim /etc/sysconfig/selinux 把SELINUX=enforcing 改为 SELINUX=di ...

  8. 手机号码月消费档次API

    手机号码月消费档次API,返回手机号的每月消费水平,身份证姓名不做一致性校验 文档:https://www.juhe.cn/docs/api/id/261 接口地址:http://v.juhe.cn/ ...

  9. T420s成功加装固态硬盘(SSD)

    目的 为了提升系统和经常使用工具的启动速度,ThinkPad T420s光驱位加一块固态硬盘. 操作步骤 购买:没做太多对照了解,初步计划是安装在光驱位,直接JD上买了SanDisk的128G和推荐的 ...

  10. 基于windows api实现的共享锁/独占锁

    众所周知,windows平台上实现线程同步.或者说资源的加锁与解锁的方法有内核事件.临界区.相互排斥量.信号量,甚至interlocked系列函数等多种手段. 可是在日常的编程中,我们使用这些手段对  ...