View的子类

        VIew是一切界面类的基类,是SurfaceView,GLSurfaceView的基类。掌握View子类的创建,极为重要,因为这决定着对于android界面创建的掌握程度。

        View的创建可以只重载onDraw()方法。但是一个完整的View的子类至少需要重载onDraw(),onMeasure(),onLayout()三个方法,再加上其他的一些极为有用的View的方法(可以看View的源码掌握View的加载,以及常用的方法)。这里需要注意onDraw(),onMeasure(),onLayout()是View的生命周期方法。(这里需要注意,onLayout是创建ViewGroup的子类对象时才需要重载。而layout()方法则是无论View还是ViewGroup都会调用的。layout()方法会调用setFrame()方法设置mLeft,mRight,mTop,mBottom等参数,也就是说,setFrame()可以加载View的子类在父类View/ViewGroup中的位置。总的来说就是,layout()方法调用setFrame(),setFrame()会设置自身在父类的位置。)

        但是View子类的创建最关键的是掌握View子类的加载过程。

        系统在执行一个Activity的代码时,会先创建对象,然后在加载界面。也就是说,View的子类对象会先被创建,然后再被加载到屏幕上。所以,View子类对象的方法调用中才会出现onLayout(),onMeasure()被调用两次的情况。这里使用getWidth(),getHeight()方法被调用的情况就可以看出View的子类对象的加载过程,首先,在Activity中调用getWidth(),getHeight()返回的都是0,然后onMeasure方法会被调用,但是getWidth(),getHeight()放回的都是0,onLayout方法被调用时才返回正确的值(尺寸信息是onLayout()被调用之后才加载的),到这里,就创建了View的子类对象。然后在加载界面时,onMeasure(),onLayout()会在被加载一次,这次返回的都是正确值,因为这次是将对象加载到屏幕上了。(getTop(),getBottom(),getLeft(),getRight()在activity也是得不到正确答案的,只有在View子类对象里面才行,因为他们都是在layout()之后内部变量才能得到赋值的。)

        同时注意,在Activity.onStart()中加载View.getWidth(),View.getHeight()会使程序出错(未完成)


        View.setFrame()没在outline窗口中显示,而且虽然这是一个protected的方法,但是却不能继承,最关键的是他是layout()必须调用的方法,layout()必须使用setFrame()对View自身位置进行设置。(未完成)



        View类几乎集成了所有的视图类的功能。在View类中可以使用旋转,间隔等很多功能,所以当我们需要为自定义的View添加功能时,可以多考虑View自带的方法,View自带的方法基本满足我们的一般设计需求了。





(未完成)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值