/** * 作者:David Zheng on 2015/11/7 15:38 * *

网站:http://www.93sec.cc * *

微博:http://weibo.com/mcxiaobing * *

微博:http://weibo.com/93sec.cc */ 个人交流QQ986945193



前言
  • 课程介绍

    • 自定义控件在android相当重要。要求:大家熟悉自定义控件的原理,熟悉自定义控件的使用步骤。

      • 按类型划分,自定义View的实现方式可分为三种:自绘控件、组合控件、以及继承控件。
      • 如何让自定义的View在界面上显示出来? 只需要像使用普通的控件一样来使用自定义View就可以了。
    • 1,回顾系统的一些控件 ,Viewpager广告条的展示
    • 2,介绍View的绘制过程
    • 3,自定义View:开关Button
    • 4,自定义属性
    • 5,组合控件:标题栏
    • 6,继承系统控件:ListView刷新加载的原理等
  • 系统控件
    • 心中要有一个View树

一,自定义View:
  • 概念:自绘控件的意思就是,这个View上所展现的内容全部都是自己绘制出来的。
  • 自绘控件的步骤:
    • 实现构造方法
    • onMeasure(int ,int)中调用onMeasureDimention() 进行测量
    • onDraw(Canvas)方法进行绘制View
    • 实现onTouchEvent(MotionEvent ev)方法,对touch事件进行解析
  • 一些API:

    • 绘制View主要是onDraw()方法中完成。通过参数Canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。
    • Canvas绘制的常用方法:
      1. drawColor()    填充颜色
      2. drawLine()      绘制线
      3. drawLines()    绘制线条
      4. drawOval()     绘制椭圆
      5. drawPaint()    画笔绘制
      6. drawPath()     绘制路径
      7. drawPicture() 绘制图片
      8. drawPoint()    绘制点
      9. drawPoints()   绘制点
      10. drawRGB()     填充颜色
      11. drawRect()     绘制矩形
      12. drawText()     绘制文本
      13. drawTextOnPath()    在路径上绘制文本
  • 2、刷新View :(刷新view的方法这里主要有:) 
    • invalidate(int l,int t,int r,int b)

      • 刷新局部,四个参数分别为左、上、右、下
    • invalidate()                                          
      • 整个view刷新。执行invalidate类的方法将会设置view为无效,最终重新调用onDraw()方法。
      • invalidate()是用来刷新View的,必须是在UI线程中进行工作。在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。
    • invalidate(Rect dirty)

      • 刷新一个矩形区域

二,组合控件

  • 概念: 组合控件的意思就是,不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,但可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
  • 例如:标题栏就是个很常见的组合控件,很多界面的头部都会放置一个标题栏,标题栏上会有个返回按钮和标题,点击按钮后就可以返回到上一个界面。那么下面我们就来尝试去实现这样一个标题栏控件。

三,继承控件:
  • 概念: 继承控件的意思就是,我们并不需要自己重头去实现一个控件,只需要去继承一个现有的控件,然后在这个控件上增加一些新的功能,就可以形成一个自定义的控件了。这种自定义控件的特点就是不仅能够按照我们的需求加入相应的功能,还可以保留原生控件的所有功能,比如 Android PowerImageView实现,可以播放动画的强大ImageView 就是一个典型的继承控件。

  • 例如:对ListView进行扩展, 加入在ListView上滑动就可以显示出一个删除按钮,点击按钮就会删除相应数据的功能。或者刷新加载的ListView

一些重要的补充:
1,通用的布局,再抽出来一个布局,命名规则:layout开头。栗子:layout_title.xml  ;  如何引用 :  <include layout="@layout/layout_tilte" />


------------------------------------------------------华丽丽的分割线 - 咯咯咯--------------------------------------------------
功能案例


系统重要控件的展示:Viewpager
  • 步骤:

1,ViewPager的图片的展示

                2,描述的联动
                3,点的联动
                4,无限循环的实现
                5,自动播放,动画效果的实现


自定义开关按钮:
  • 步骤:

    • 1,自定义类继承自View
    • 2,重写onMeasure方法,设置View的大小
    • 3,重写onDraw方法,绘制View的内容
    • 4,重写onTouchEvent事件,对touch事件进行解析

自定义属性:
 1. 在attrs.xml文件中声明属性,

            如:<declare-styleable name="MyToggleBtn">   // 声名属性集的名称,即这些属性是属于哪个控件的。         
                        <attr name="current_state" format="boolean"/>   // 声名属性 current_state 格式为 boolean 类型         
                        <attr name="slide_button" format="reference"/>   // 声名属性 slide_button 格式为 reference 类型     
                        </declare-styleable>  所有的format类型,详见注1:

   

2,  在布局文件中使用:在使用之前必须声名命名空间,                 
        xmlns:zhaokeming="http://schemas.android.com/apk/res/com.zhaokeming.mytogglebtn" 
                说明:① xmlns 是XML name space 的缩写;    ② zhaokeming 可为任意写符       ③  http://schemas.android.com/apk/res/  此为    android固定格式;        ④com.zhaokeming.mytogglebtn  此应用的包名,如manifest配置文件中一致。    布局文件:    

<com.zhaokeming.mytogglebtn.MyToggleButton          xmlns:heima="
http://schemas.android.com/apk/res/com.zhaokeming.mytogglebtn"       
  android:layout_width="wrap_content"       
  android:layout_height="wrap_content"       
  heima:slide_button="@drawable/slide_button" />


3 ,在代码中对属性进行解析,主要代码: 
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyToggleBtn); // 由attrs 获得 TypeArray 
        可以查看,View 自己定义的属性 怎么初始化的。。。

 注1: format 常用类型:     reference 引用    color 颜色     boolean 布尔值     dimension 尺寸值    float 浮点值    integer 整型值    string 字符串     enum 枚举


组合控件-标题栏:
  • 重要的知识点:

    • 1,去掉标题: requestWindowFeature(Window.FEATURE_NO_TITLE);  必须在setContentView()方法执行前
    • 2,相同的布局,可以抽出来一个layout_xxx.xml 。  引用 <include layout="@layout/layout_xxx">
    • 3 ,定义相同控件的功能时,就可以抽出来一个 自定义组合控件
  • 步骤:
    • 1,继承一个layout_xxx.xml布局的最外面的 布局,比如 LinearLayout,RelativeLayout等等
    • 2,  // inflate:把xml布局文件,转换成 View对象 ;把xml文件转换成的View对象,然后赋值给当前的类。 ;当前的类,就相当于View对象 ;通过调用这个 View.inflate(mContext, R.layout.layout_xxx, this);
    • 3,把控件初始化,添加相应的功能

自定义ListView的刷新:
  • 步骤:

    • 1,
  • 注意事项:
    • 1,

      • addHeaderView(View v) : 在ListView的头部,添加一个View ; 这个方法必须在 setAdapter()之前调用;
      • addFooterView(v):  在ListView的底部添加view
    • 2, 
      • getHeight(): 在执行完onLayout()方法后,才会执行
      • getMeasuredHeight(); 在onMeasure()方法后,就执行;   
        • 实现步骤:
        • mViewHeader.measure(0, 0);// 通知系统,执行测量工作
        • mHeaderHeight = mViewHeader.getMeasuredHeight(); // 获得测量的高度



/** * 作者:David Zheng on 2015/11/7 15:38 * *

网站:http://www.93sec.cc * *

微博:http://weibo.com/mcxiaobing * *

微博:http://weibo.com/93sec.cc */ 个人交流QQ986945193



转载于:https://my.oschina.net/mcxiaobing/blog/600901

android开发之自定义View 详解 资料整理 小冰原创整理,原创作品。的更多相关文章

  1. Android 自定义 View 详解

    View 的绘制系列文章: Android View 绘制流程之 DecorView 与 ViewRootImpl Android View 的绘制流程之 Measure 过程详解 (一) Andro ...

  2. Android 自定义View修炼-Android开发之自定义View开发及实例详解

    在开发Android应用的过程中,难免需要自定义View,其实自定义View不难,只要了解原理,实现起来就没有那么难. 其主要原理就是继承View,重写构造方法.onDraw,(onMeasure)等 ...

  3. android 自定义view详解

    1.自定义View前首先要了解一下View的方法,虽然有些不一定要实现. 分类 方法 描述 创建 Constructors View中有两种类型的构造方法,一种是在代码中构建View,另一种是填充布局 ...

  4. Android开发进阶——自定义View的使用及其原理探索

    在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...

  5. 深入了解View实现原理以及自定义View详解

    下面几篇文章对View的原理讲的非常详细. Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了解View(二) ...

  6. Android开发——事件分发机制详解

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52566965 深入学习事件分发机制,是为了解决在Android开发中 ...

  7. Android开发 ExpandableListView 可折叠列表详解

    前言 在需要实现一个List的item需要包含列表的时候,我们就可以选择ExpandableListView. 其实这个View的原始设计还是ListView的那套.就是增加2层的ListView而已 ...

  8. Android开发:程序目录结构详解

    HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...

  9. Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...

随机推荐

  1. springboot 切面添加日志功能

    1.新建一个springboot项目 2.定义个切面类,并指定切入点,获取所需记录信息(如:访问人IP, 访问地址,访问地址名称等) 3.新建数据库 SET FOREIGN_KEY_CHECKS=0; ...

  2. Python内置函数分类汇总

    Python解释器内置了很多函数,这些内置函数使用方便,无需导入,直接调用.可以在交互模式下输入dir(__builtins__),输出的列表中包含了所有的内置函数:   1.可迭代对象.序列操作相关 ...

  3. mpvue微信小程序http请求终极解决方案-fly.js

    fly.js是什么? 一个支持所有JavaScript运行环境的基于Promise的.支持请求转发.强大的http请求库.可以让您在多个端上尽可能大限度的实现代码复用(官网解释) fly.js有什么特 ...

  4. ssl & ike/ipsec

    SSL/TLS

  5. Golang微信支付跳过X509验证

    游戏支付提交到微信的post: 微信: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4 错误信息: err:Post ...

  6. node+mysql数据库连接(入门)

    node+mysql的数据库操作: 1 //引入mysql var mysql = require('mysql'); //进行数据库连接设置 var connection = mysql.creat ...

  7. es分页条数限制

    "error": { "root_cause": [ { "type": "query_phase_execution_excep ...

  8. 14-jmeter分布式环境

    1.分布式概念: jmeter做性能时,会消耗本地机器资源 本机无法没有限制的创建运行线程(一般500线程就差不多会报错) 一般这时候会用到分布式的环境 2.环境: 前提条件:环境一致(有时候可以直接 ...

  9. 07-JDBC协议

    1.下载mysql-connector-java-8.0.17.jar,jar包放进jmeter的安装目录lib文件夹下,启动jmeter就好 2.新增线程组,然后添加配置元件:JDBC connec ...

  10. App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷

    判断安卓, ios