自定义view

四个步骤
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);
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值