/** * 作者: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. 1036 Boys vs Girls (25分)(水)

    1036 Boys vs Girls (25分)   This time you are asked to tell the difference between the lowest grade o ...

  2. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  3. 关于wget下载jdk问题解决

    问题: 直接从jdk官网下载会出现: 正在解析主机 login.oracle.com (login.oracle.com)... 156.151.58.18正在连接 login.oracle.com ...

  4. 关于TD信息树自己的体验和建议

    自己选择的是17级学长13组的TD消息树,通过对这个软件的使用,感觉整体上还是很好的,他的主要功能就相当于把微信的朋友圈还有qq的好友动态等功能集合到了一起.这个软件整体就相当于一个空间,可以加好友互 ...

  5. MySQL数据库三

    MySQL数据库三 多表查询: 有条件的内连接 将两张表根据相同的id连接起来 select * from info join details on info.id = details.id sele ...

  6. Java第二十二天,异常

    异常 程序在执行过程中,出现的非正常的情况,最终会导致JVM非正常停止. 注意: 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象.Java对异常采取中断处理方式 ...

  7. 汇编刷题 已知整数变量A和B,试编写完成下列操作的程序

    1.若两个数中有一个是奇数,一个是偶数,则将它们互换储存地址 2.若两个数都是奇数,则分别加一 3.若两个数都是偶数,则不变 DATA SEGMENT A DB 12H B DB 25H DATA E ...

  8. Array(数组)对象-->unshift() 方法

    1.定义和用法 unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度. 语法: array.unshift(item1,item2, ..., itemX) 参数:item1,it ...

  9. tf.get_variable

    使用tf.get_variable()时,如果检测到命名冲突,系统不会处理冲突,而会报错. 如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的. tf.get_vari ...

  10. 跳转语句break与continue的使用环境

    break:改变程序控制流 常用于do-while.while.for .switch循环中,终止某个循环,程序跳转到循环块外的下一条语句 continue:跳出本次循环,进入下一次循环