一、如何创建自定义的View类
①、创建一个继承android.view.View类的Java类,并且重写构造方法(至少需要重写一个构造方法)
②、根据需要重写其他方法
③、在项目的活动中,创建并实例化自定义的View类,然后将其添加到布局管理器中(添加到布局管理器的方法:布局管理器.addView())
二、View类常用的函数
①、onDraw() 当组件将要绘制它的内容时
②、onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
③、onMeasure() 检测View组件及其子组件的大小
④、onLayout() 当该组件需要分配其子组件的位置、大小时
⑤、onSizeChange() 当该组件的大小被改变时
⑥、onKeyDown 当按下某个键盘时
⑦、onKeyUp 当松开某个键盘时
⑧、onTrackballEvent 当发生轨迹球事件时
⑨、onTouchEvent 当发生触屏事件时
⑩、onWindowFocusChanged(boolean) 当该组件得到、失去焦点时
11)、onAtrrachedToWindow() 当把该组件放入到某个窗口时
12)、onDetachedFromWindow() 当把该组件从某个窗口上分离时触发的方法
13)、onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发的方法
三、将自定义的Viewl类添加到相对应的窗口
方式一:
布局管理器 变量名 = (布局管理器)findViewById(R.id.ID)
类 变量名A = new 类(this)
布局管理器.addView(变量名A)
方式二:
在xml布局中添加
四、Android自定义View的构造函数
有两种方式自定义构造函数
方式一:
每个构造函数分别调用基类的构造函数,再调用一个公共的初始化方法做额外的初始化工作
1 public class MyView extends ListView { 2 public MyView(Context context) { 3 super(context); 4 sharedConstructor(); 5 } 6 7 public MyView(Context context, AttributeSet attrs) { 8 super(context, attrs); 9 sharedConstructor(); 10 } 11 12 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 13 super(context, attrs, defStyleAttr); 14 sharedConstructor(); 15 } 16 17 private void sharedConstructor() { 18 // Do some initialize work. 19 } 20 }
方式二:
级联式调用,每一个构造函数调用比它多一个参数的构造函数,最后一个构造函数调用基类的构造函数,最后在做一些额外的初始化工作
1 public class MyView extends ListView { 2 public MyView(Context context) { 3 this(context, null); 4 } 5 6 public MyView(Context context, AttributeSet attrs) { 7 this(context, attrs, 0); 8 } 9 10 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 11 super(context, attrs, defStyleAttr); 12 13 // Other initialize work. 14 } 15 }
注:
建议采用第一种方式。因为第二种方法在某些情况下会出现问题,比如你自定义的View继承自ListView或TextView时,ListView或TextView内部的构造函数有一个默认的defStyle, 第二种方法调用时defStyle会传入0,这将覆盖基类中默认的defStyle,进而导致一系列问题。
五、Canvas 和 Paint
Canvas表示画布,Paint代表画笔
1)、Paint的属性
// 设置字体颜色 paint.setColor(Color.RED); // 防锯齿 paint.setAntiAlias(true); //设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 paint.setColorFilter(ColorFilter); //如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加 //快显示 //速度,本设置项依赖于dither和xfermode的设置 paint.setFilterBitmap(true); //当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 paint.setStrokeWidth(10f); //设置绘制路径的效果,如点画线等 paint.setPathEffect(PathEffect); //设置图像效果,使用Shader可以绘制出各种渐变效果 paint.setShader(Shader); //设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 paint.setMaskFilter(MaskFilter); //在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色 paint.setShadowLayer(float radius ,float dx,float dy,int color); //设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE paint.setStyle(Paint.Style); //当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,圆形样