自定义View

来源:互联网 发布:程序员的逻辑题 编辑:程序博客网 时间:2024/06/03 11:12

自定义View

新建一个类继承自View类,在这个类中有四个构造器,我们必须重写第二个。代码如下:

 public MyTwoView(Context context) {        super(context);    }  public MyTwoView(Context context, AttributeSet attrs) {        super(context, attrs);        }

一般画笔的初始化等造作都在第二个构造器中。
除了构造器要重写外我们还必须重写两个方法:

onMeasure()
onDraw()
onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。
onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。
代码如下:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        with=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);//获得宽度        height=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);//获得高度        setMeasuredDimension(with,height);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //画圆        canvas.drawRect(with/2-100,height/2-200,with/2+100,height/2+200, recPaint);        canvas.drawRect(with/2-100,height/2+200-count,with/2+100,height/2+200, RecProgressPain);//        canvas.drawCircle(with/2,height/2,300,recPaint);//        if(count==400){//            canvas.drawText(100+"%",with/2,height/2,textpain);//        }        canvas.drawText(100f*count/400+"%",with/2,height/2,textpain);    }

具体的绘制图形

画笔

绘制任何图形都必须有画笔,画笔也是一个对象需要new,一般在第二个构造器中new:

 mpaintLine=new Paint();   //为画笔的颜色   mpaintLine.setColor(Color.RED);   //画笔的宽度    mpaintLine.setStrokeWidth(10);   //抗锯齿   mpaintCricle.setAntiAlias(true);  //填充与否STROKE为不填充,FILL为填充  mpaintCricle.setStyle(Paint.Style.STROKE);

如果是写文字还会有mpainText.setTextSize(30);//这里设置的是文字的大小。 mpainText.setTextAlign(Paint.Align.CENTER);//为文字的居中。

旋转

注意旋转的是画布,也可以说是坐标,

画布的旋转是默认是围绕坐标原点来旋转的,这里容易产生错觉,看起来觉得是图片旋转了,其实我们旋转的是画布,以后在此画布上画的东西显示出来的时候全部看起来都是旋转的。其实Roate函数有两个构造函数:

void rotate(float degrees)
void rotate (float degrees, float px, float py)

第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)
第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)
下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;

    protected void onDraw(Canvas canvas) {          // TODO Auto-generated method stub          super.onDraw(canvas);          Paint paint_green = generatePaint(Color.GREEN, Style.FILL, 5);          Paint paint_red   = generatePaint(Color.RED, Style.STROKE, 5);          Rect rect1 = new Rect(300,10,500,100);          canvas.drawRect(rect1, paint_red); //画出原轮廓          canvas.rotate(30);//顺时针旋转画布          canvas.drawRect(rect1, paint_green);//画出旋转后的矩形      }   

效果图是这样的:

这里写图片描述

这个最终屏幕显示的构造过程是这样的:

下图显示的是第一次画图合成过程,此时仅仅调用canvas.drawRect(rect1, paint_red); 画出原轮廓

这里写图片描述

然后是先将Canvas正方向依原点旋转30度,然后再与上面的屏幕合成,最后显示出我们的复合效果。

这里写图片描述

0 0
原创粉丝点击