安卓面试题之---自定义View

 

##一,自定义View的分类
- 1.继承View或者ViewGroup类,重写onDraw方法,调用invalidate方法重新绘制View(譬如说计数器)

- 2.自定义组合控件,即将几种控件组合起来形成一个新的控件,这个新的组合控件就会整合了原来每一个控件的功能(譬如说新浪微博中ListView第一行上面的状态栏),(继承组合控件布局的跟布局)

- 3.自定义扩展控件,也就是继承现有的控件,在该控件的基础之上添加新的功能。(譬如继承Button,tablayout等)


##二构造方法
    1,自定义view的第一步是写构造方法,构造方法是用来初始化对象的,包括view也是对象。


    2,构造方法在这里一般要写三个甚至四个,这样写的原因:我们在不同的情况下创建View的方式不同,可能需要从xml文件中填充布局,也可能不需要,或者也需要一样style之类的,因此不同情况下,使用的构造可能存在差异。

       因此构造方法也有这么多种类。从API上描述我们一定要有第二个构造方法。(在实际开发中也可以第一个调用第二个,第二个调用第三个构造,确保使用了每一种) 
    3,

    第一个构造:是在java创建视图的时候调用,如果从xml文件中填充,则不会调用这个构造方法;
    第二个构造方法 :用于layout文件实例化,会把xml中的参数通过attrs带入;
    第三个构造方法:这个构造方法是在第二个基础上再传入style的.

 


##三,主要方法
(一)onMeasure()用于测量子控件的宽高
     1.2,MeasureSpec在很大程度上决定了一个View的尺寸规格,

     1.1,模式:exactly, at_most, unspecified
         Exactly是写出具体的dp值,
         at_most一般对应wrap_content,最大值不能超过父控件宽高
         Unspecified,一般在scrollView或者listview中,要多大就多大


     1.3,常见的三个方法
         makeMeasureSpec(int size ,int mode)
         getMode(int measureSpec)
         getSize(int measureSpec)


     1.4,makeMeasureSpec()方法的作用将size 和 mode 打包成一个32位的int值,之所以这样做就是为了减少内存的分配。返回值为打包成的int类型值measureSpec 。 
    
     1.5,getMode getSize 则是根据传入的int 类型值,解包成为 mode 和 size。

     1.6,只处理AT_MOST情况也就是wrap_content,其他情况则沿用系统的测量值即可。
    setMeasuredDimension会设置View宽高的测量值,只有setMeasuredDimension调用之后,才能使用getMeasuredWidth()和getMeasuredHeight()来获取视图测量出的宽高,以此之前调用这两个方法得到的值都会是0。
    
     如果我们不处理AT_MOST情况,那么即使设置了wrap_content,最终的效果也和match_parent一样,这是因为这种情况下,view的SpecSize就是父容器测量出来可用的大小。
 


- (二)在onLayout()用于摆放子控件在父控件中的位置,只有ViewGroup才能让子控件显示在自己的什么位置.只会触发,执行一次

    1,getWidth()方法和getMeasureWidth()的值基本相同。

    2,但getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到。

    3,另外,getMeasureWidth()方法中的值是通过setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过视图右边的坐标减去左边的坐标计算出来的。

    4,我们在ViewGroup重写onLayout的目的:
    就是设置当前View与其所有的子View,在ViewGroup(或其继承ViewGroup的Layout)父布局当中的位置。
    
    5,childView.getMeasuredWidth();//在onMeasure()方法之后取得View的实际宽、高

         childView.getMeasuredHeight();

 


(三)onDraw() 用于绘制需要的图形

- 1,主要通过canvas,paint,matrix去绘制

- 2,canvas,是一个绘制工具 ,canvas常用的方法有:
    比如drawXXX(画图,画直线等)
    matrixxxx,放大缩小,压缩
    clipxxxx裁剪</

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值