自定义视图的用法

Android自带的视图常常不能满足实际开发的需求,这种情况下我们就得自定义视图(View)。
首先在res\values目录下找到attrs.xml(如没有则创建之),在该属性定义文件的resources根节点下增加类似下面的定义:

    <declare-styleable name="SignatureView"><attr name="paint_color" format="color" /></declare-styleable>

其次在代码中创建类似SignatureView的自定义视图类,编写代码并编译通过。
然后在使用自定义视图的布局文件的根节点下增加类似下面的命名空间定义,这里的路径应与AndroidManifest.xml的package属性值保持一致。

    xmlns:app="http://schemas.android.com/apk/res/com.practice.activity"

最后在使用视图的xml布局中加上类似下面这样的xml描述:

    <com.practice.widget.SignatureViewandroid:id="@+id/view_signature"android:layout_width="match_parent"android:layout_height="match_parent"app:paint_color="@color/blue" />

自定义视图的编码步骤

自定义视图的编码主要由四部分组成:
一、重写构造函数,并初始化个性化参数;
二、重写测量函数onMesure,计算该视图的宽与高(除了复杂视图,实际开发中一般不进行重写);
三、重写绘图函数onDraw、onLayout、dispatchDraw,视情况重写三个其中的一个或多个;
四、重写触摸事件函数dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,一般情况不做重写,当然存在手势滑动冲突时,就必须重写;
以上四点,本章只记录前面三点,第四点事件函数这部分内容较复杂,留待后面的章节介绍。

三种构造函数的区别

自定义视图存在三个构造函数,分别是

     //只有一个参数,用于在代码中构造对象public SignatureView(Context context) {super(context);}//有两个参数,用于在XML布局中构造对象public SignatureView(Context context, AttributeSet attrs) {super(context, attrs);if (attrs != null) {TypedArray attrArray=getContext().obtainStyledAttributes( attrs, R.styleable.SignatureView);mPaintColor = attrArray.getColor(R.styleable.SignatureView_paint_color, 0);attrArray.recycle();}}//有三个参数,用于在XML布局中构造对象public SignatureView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}

其中,在代码中构造对象时采用第一种构造函数,在XML布局中构造对象时采用第二种构造函数。第三个函数也是在XML布局中构造对象时使用,它与第二种的区别在于:
1、defStyleAttr是一种特殊的属性,其类型既非整型也非字符串,而是参照类型(reference,需要在style.xml中另外定义),举例如下:

    <declare-styleable name="SignatureView"><attr name="paint_color" format="color" /></declare-styleable><attr name="CustomizeStyle" format="reference" />

2、XML布局直接调用的都是第二种构造,第三种构造都是通过第二种构造来调用,举例如下:

    public SignatureView(Context context, AttributeSet attrs) {this(context, attrs, R.attr.CustomizeStyle);}public SignatureView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);if (attrs != null) {TypedArray attrArray=getContext().obtainStyledAttributes( attrs, R.styleable.SignatureView, defStyleAttr, R.style.DefaultCustomizeStyle);mPaintColor = attrArray.getColor(R.styleable.SignatureView_paint_color, 0);attrArray.recycle();}}

这样Android在寻找该自定义视图的属性时,就会依次先找XML布局文件,再找attrs.xml文件中R.attr.CustomizeStyle的定义,最后找style文件中R.style.DefaultCustomizeStyle的定义。

个人感觉第三种构造函数在实际开发中用的不多,不需要过多的深入研究,了解了解就好了。

点此查看Android开发笔记的完整目录

Android开发笔记(十一)自定义视图的构造方法相关推荐

  1. android开发笔记之自定义开关按钮

    今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析. 首先: 这是由两张图片构成: ①一张为有开和关的背景图片 ② ...

  2. Android开发笔记(一百七十二)第二代翻页视图ViewPager2

    正如RecyclerView横空出世取代ListView和GridView那样,Android也推出了二代翻页视图ViewPager2,打算替换原来的翻页视图ViewPager.与ViewPager相 ...

  3. Android开发笔记(一百二十四)自定义相册

    画廊Gallery Gallery是一个早期的画廊控件,左右滑动手势可展示内嵌的图片列表,类似于一个平面的万花筒.虽然Android现在将Gallery标记为Deprecation(表示已废弃),建议 ...

  4. Android开发笔记(六十一)文件下载管理DownloadManager

    下载管理DownloadManager 文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些.因为下载功能比较常用,而且业务功能相对统一,所以从Androi ...

  5. Android开发笔记(一百三十七)自定义行为Behavior

    协调布局CoordinatorLayout能够让内部的子控件互相配合着移动,这跟以往孤立的控件运动截然不同,协调运动的结果,意味着App画面更加流畅.自然,也更符合日常生活中的动作场景.如果你对Coo ...

  6. Android开发笔记(一百三十三)导航视图NavigationView

    导航视图NavigationView 很多App都有个人中心的侧滑菜单,通常在页面左侧边缘右拉时,即可弹出个人中心的菜单页面.对于Android来说,侧滑功能用到了抽屉布局DrawerLayout,我 ...

  7. Android开发笔记(一百三十一)水波图形与水波动画

    水波图形RippleDrawable RippleDrawable是Android在5.0之后新增的图形类,它的作用是在点击时展示水波动画,从而提示用户在这里按压了屏幕.这个提示效果类似于状态图形St ...

  8. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  9. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

最新文章

  1. wpf采用Xps实现文档显示、套打功能
  2. C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用
  3. php——验证身份证是否合法的函数
  4. Restlet入门示例
  5. 北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A
  6. ajax参数是json数据类型,如何保护$ .ajax数据类型:json Post参数
  7. 加载jsp页面报#{} is not allowed in template text
  8. python3怎么安装mysql_Python3下mysqlclient的安装和使用
  9. winxp系统的驱动可用于win2k吗?_收藏!工业机器人伺服系统常见问题汇总
  10. php mysql 获取排名,Mysql排序获取排名的实例代码
  11. 为何需要实施数据治理
  12. 电脑ping_电脑网络故障检测与维护—常用DOS命令
  13. Atitit.分布式远程调用  rpc  rmi  CORBA的关系
  14. ubuntu phpmyadmin 404 not found
  15. 刘寅立matlab数值计算案例分析 pdf,《MATLAB数值计算案例分析》源代码
  16. 小码哥教育笔记之VueDay01课程回顾
  17. 2022春软件工程课后作业(3.16)
  18. 一元多项式加减乘实现c/c++
  19. IT资质认证证书如何查询?这篇文章教你查询方式
  20. 【CSS 形状 (Shapes)】

热门文章

  1. Leetcode每日一题:7.整数反转
  2. Stanford CS230深度学习(七)RNN和LSTM
  3. 利用 Webpack 实现小程序多项目管理
  4. 计算机游戏手机攻略,云顶之弈无敌攻略,竟然是用手机玩出来的
  5. android ffmpeg编译动态库,最简单的android studio调用ffmpeg动态库
  6. xbox360无线手柄接收器驱动_创新设计的多模手柄,北通宙斯T6精英机械游戏手柄体验点评...
  7. c 语言转换成java语言,求助大神!!!JAVA转换成C语言
  8. IntObjectHashMap和HashMap的区别?
  9. Windows10安装Jmeter(图文教程)
  10. requests请求报字符编码异常信息