您的位置:首页 > 其它

自定义View

2015-09-16 22:34 281 查看

自定义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度,然后再与上面的屏幕合成,最后显示出我们的复合效果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: