四个步骤
1. 创建类继承View
2. 4个构造方法+4个基本方法
3. 在onDraw进行需求绘制
4. 自定义属性: attrs文件 <attr name=" " , format=" ">
5. 在创建的类中 取值+初始化属性值
注意:
① 在布局文件(activity.xml )中 写入
xmlns:dabin="
http://schemas.android.com/apk/res-auto
"l引用命名空间
② recycle()回收
invalidate() 更新试图
③ format是值该属性的取值类型:
一共有:dimension,string,color,integer,enum,reference,float,boolean,fraction,flag;
一:自定义view画圆
1.继承view
2.重写方法
3.测量 OnMeasure()
使自定义控件能够自适应布局各种各样的需求
4.绘制 OnDraw()
利用Canvas 和 Paint来绘制
5.定位 OnLayout()
确定控件显示位置
6.OnTouch事件 确定触摸事件
二: 画布的方法与属性
canvas.drawText("This is a onDraw", 0, 30, paint); //设置字体
canvas.drawLine(0, 60, 200, 60, paint); // 直线
canvas.drawRect(0, 90, 200, 200, paint); //矩形 左 上 右 下
canvas.drawBitmap(bitmap, 50, 250, paint); //位图
canvas.drawCircle() //画图
invalidate(); //更新视图
recycle(); //回收
setAntiAlias(true) //设置为抗锯齿
setARGB() 设置颜色
context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyleAttr, 0); // 获取自定义View属性对象
画笔样式分三种:1 Paint.Style.STROKE:描边
2 Paint.Style.FILL_AND_STROKE:描边并填充
3 Paint.Style.FILL 填充
描边的粗细:setStrokeWidth(); 单位px
当setStrokeWidth(0)的时候描边宽度并不是0而是只占一个像素
三:View的生命周期
1.onFinishInflate() 当View中所有的子控件均被映射成xml后触发
2.onMeasure( int , int ) 确定所有子元素的大小
3.onLayout( boolean , int , int , int , int ) 当View分配所有的子元素的大小和位置时触发
4.onSizeChanged( int , int , int , int ) 当view的大小发生变化时触发
5.onDraw(Canvas) view渲染内容的细节
6.onKeyDown( int , KeyEvent) 有按键按下后触发
7.onKeyUp( int , KeyEvent) 有按键按下后弹起时触发
8.onTrackballEvent(MotionEvent) 轨迹球事件
9.onTouchEvent(MotionEvent) 触屏事件
10.onFocusChanged( boolean , int , Rect) 当View获取或失去焦点时触发
11.onWindowFocusChanged( boolean ) 当窗口包含的view获取或失去焦点时触发
12.onAttachedToWindow() 当view被附着到一个窗口时触发
13.onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。
14.onWindowVisibilityChanged( int ) 当窗口中包含的可见的view发生变化时触发
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint pa = new Paint(); Paint p1=new Paint(); Paint p2=new Paint(); float fw=getWidth()/2; float fh=getHeight()/2; Paint p3 = new Paint(); p3.setColor(Color.RED); RectF rectF = new RectF(getWidth()/2-100,getHeight()/2-100,getWidth()/2+100,getHeight()/2+100); canvas.drawArc(rectF,0,du,true,p3); pa.setColor(Color.BLACK); p1.setColor(Color.BLACK); p2.setColor(Color.WHITE); pa.setTextSize(20); p1.setAntiAlias(true); p2.setAntiAlias(true); canvas.drawCircle(fw,fh,80,p1); canvas.drawCircle(fw,fh,60,p2); canvas.drawText("100%",fw,fh,pa); }