Android自定义控件初步之基本知识

来源:互联网 发布:淘宝助手 mac 编辑:程序博客网 时间:2024/06/10 01:37
   由于项目的需要,最近开始学习一下自定义控件。说到这个,大家肯定吐槽:本来自定义控件是必须要会的。好吧!不能是由于项目的需要,作为安卓开发者,肯定要会自定义控件和屏幕适配。
  (1)自定义控件主要包括三类:
    1)继承已经有的控件来实现自定义控件。例如与某个控件的功能类似,属性都差不多,那就继承它吧。
    2)组合控件。所谓组合控件就是将系统原生控件组合起来,加上动画效果,形成一个特殊的UI效果。
    3)纯粹自定义控件。所谓纯粹自定义控件就是继承系统View,自己去实现View效果。
  (2)自定义控件的步骤:
    1)测量:onMeasure。设置自己显示在屏幕上的宽高。子类可以覆写onMeasure()方法实现自己的计算视图          大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。
    2)布局:onLayout。设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到)。在View中这个函     数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的。
    3)绘制:onDraw。控制显示在屏幕上的样子(自定义ViewGroup时不需要这个)。子类也不应该修改该方法     ,因为其内部定义了绘图的基本操作:
(1)绘制背景;
 (2)如果要视图显示渐变框,这里会做一些准备工作;
 (3)绘制视图本身,即调用onDraw()函数。在View中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容”的,其包含了多个子View,而子View已经实现了自己的绘制方法,因此只需要告诉子View绘制自己就可以了,也就是下面的dispatchDraw()方法;
(4)绘制子视图,即dispatchDraw()函数。在View中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;
 (5)如果需要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),开始绘制渐变框;
 (6)绘制滚动条;
  从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。
   View和ViewGroup的相同点:都需要测量(onMeasure)这一步。
   不同点:View没有子View,所以不需要onLayout方法,但是必须实现onDraw。
  (3)举例。下面是侧滑功能对应的代码。
      onMeasure:
       <pre name="code" class="java"><pre name="code" class="java">      protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) {            super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //测量所有子View的宽高    //通过getLayoutParams方法可以获取到布局文件中指定宽高    menuView.measure( menuWidth, heightMeasureSpec );    //直接使用SlideMenu的测量参数,因为它的宽高都是充满父窗体    mainView.measure( widthMeasureSpec, heightMeasureSpec );}
      onLayout:
      protected void onLayout( boolean changed, int l, int t, int r, int b ) {menuView.layout( -menuWidth, 0, 0, menuView.getMeasuredHeight() );    mainView.layout( 0, 0, r, b );    }
      由于是用ViewGroup,所以不用onDraw。
      下面是XML文件:
    <com.example.androidslidingmenu.view.SlideMenu        android:id="@+id/slideMenu"         android:layout_width="match_parent"        android:layout_height="match_parent">        <!-- 菜单界面的布局 -->        <include layout="@layout/layout_menu"/>        <!-- 主界面的布局 -->        <include layout="@layout/layout_main"/>    </com.example.androidslidingmenu.view.SlideMunu>
                                             
0 0
原创粉丝点击