自定义View概念:Android中,组件必须是View的直接子类或间接的子类,其中View有一个ViewGroup的子类,用于定义容器(FrameLayout,LinearLayout都是ViewGroup的子类).如果组件中还有子组件,就一定是从ViewGroup类继承,否则从View类继承,
View类就相当于控件的上帝一样,只要你自定义控件,要么是View的直接子类,要么是View的间接子类.
View类定义组件相关的通用功能,只要是自定义控件就一定会和View产生联系,所以View是我们开发者必须要详细理解的类
自定义View的三种形式:
1.扩展式自定义View继承自Android原生特定的View:如TextView,ImageView等等,我们通过重写OnDraw等回调方法进行扩展,使其实现我们想要的功能或者形式.
注意:该方法实现的自定义View控件不需要自己支持wrap_content和padding.(因为继承的View已经实现了)
2.组合式自定义View继承自ViewGroup的子View(LinearLayout,RelativeLayout,FrameLayout等5个),当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法.
注意:该方法实现自定义View,不需要自己处理ViewGroup的测量和布局这两个过程.(因为已经估值好了)
3.完全自定义View继承自View(Android中所有控件的基类),通常实现一些不方便布局的组合方式来达到的,需要静态或动态的娴熟一些不规则的控件或图形
注意:该方法实现的自定义View需要自己支持wrap_content和Padding(完全从无到有,系统是无法确定,必须自己操作)
自定义一个View有五个步骤:
1.类要继承View控件的基类
2.重写构造方法
3.重写OnMeasure方法
4.重写OnDraw方法
5.使用自定义控件
public class MyView extends View{ //在代码中添加我们自定义的View时,所调用的构造方法 public MyView(Context context) { super(context); } //在XML文件中添加我们自定义的控件时,所调用的方法,多了一个参数 public MyView(Context context, AttributeSet attrs) { super(context, attrs); } //这个构造方法一般我们用不到,不是系统调用,需要我们现实调用并给defStyleAttr传值,多了一个参数 //引用Style资源属性参数时,也就是我们可以在Style中自定义View定义一个默认的属性样式,然后添加进来 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //测量View控件,决定控件在手机所占位置的大小 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } //绘制了控件,决定了控件呈现的样式,参数就是一个画布,可以直接使用 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);}
}