您的位置:首页 > 其它

自定义View

2015-09-17 09:56 337 查看
自定义View

画笔的设置

旋转

画圆弧和扇形的方法

能用Canvas绘制出的各种图形

自定义View

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

[code]public MyView(Context context) {
        super(context);
    }
  public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        }


一般画笔的初始化等造作都在第二个构造器中。

除了构造器要重写外我们还必须重写两个方法:



onMeasure()

onDraw()

onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。

onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。



代码如下:

[code] @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);//设置宽
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);//设置高
        setMeasuredDimension(width, height);
    }

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //是由UI主线程自动调用,只需要在此绘制即可
          canvas.drawLine(0,0,300,300,mPaintLine);//绘制的是线
         canvas.drawCircle(300,300,100,mPaintCircle);//绘制的是圆
        canvas.drawCircle(width / 2, height / 2, 200, mPaintCircle);
        canvas.drawCircle(width / 2, height / 2, 10, mPaintCircle);
        }


画笔的设置

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

[code]public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCalendar=Calendar.getInstance();
        mPaintLine = new Paint();
        mPaintLine.setColor(Color.RED);//设置线的颜色
        mPaintLine.setStrokeWidth(5);//设置线的宽度
        mPaintLine.setAntiAlias(true);//设置抗锯齿

        mPaintCircle = new Paint();
        mPaintCircle.setColor(Color.BLUE);
        mPaintCircle.setStrokeWidth(5);//设置线的宽度
        mPaintCircle.setStyle(Paint.Style.STROKE);//绘制出空心圆
        mPaintCircle.setAntiAlias(true);//设置抗锯齿

        mPaintText = new Paint();
        mPaintText.setColor(Color.BLACK);
        mPaintText.setTextSize(25);//设置字体大小
        mPaintText.setTextAlign(Paint.Align.CENTER);//文字居中


旋转

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

void rotate(float degrees)

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

第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)

第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)

下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;

下面是一个画表盘的代码:在代码中既要画出圆,还要画出小线条和对应的时钟数

[code]for (int i=1;i<=12;i++){
   canvas.save();//保存画布当时状态
   canvas.rotate(360 / 12 * i, width / 2, height / 2);//第一个参数是旋转的度数,第二、三个参数是围绕这个点旋转的坐标值
   canvas.drawLine(width / 2, height / 2 - 200, width / 2, height / 2 - 180, mPaintLine);//画出小线条
   canvas.drawText("" + i, width / 2, height / 2 - 150, mPaintText);//写上对应的时钟数字
  canvas.restore();
  }


画圆弧和扇形的方法

[code]          public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)


oval :指定圆弧的外轮廓矩形区域。

startAngle: 圆弧起始角度,单位为度。

sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度,从右中间开始为零度。

useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。关键是这个变量,下面将会详细介绍。

paint: 绘制圆弧的画板属性,如颜色,是否填充等。

Paint paint = new Paint();

paint.setStrokeWidth(20);

paint.setStyle(Paint.Style.STROKE);

paint.setColor(Color.BLUE);

float startAngle01 = 3;

float sweepAngle01 = 86;

RectF rect = new RectF(center - radius, center - radius, center

+ radius, center + radius);

canvas.drawArc(rect, startAngle01, sweepAngle01, true, paint);

当第4个参数为true时,绘制出的是扇形

这个参数为false时,绘制出的是弧形

能用Canvas绘制出的各种图形

drawRect(float left, float top, float right, float bottom, Paint paint)

//绘制矩形(左上右下的坐标,我们可以理解为左上的坐标为我们确定了矩形的左上角点,右下坐标为我们确定了右下角的点,这样一个矩形区域就确定出来了,paint为画笔)

drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)

//绘制圆角矩形(左上右下的坐标)

drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

//绘制弧(参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,

参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,实际绘制的是扇形,如果它是假这将是一个弧线,参数五是Paint对象)

drawOval(float left, float top, float right, float bottom, Paint paint)

//绘制椭圆

drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

//绘制直线(XY起止坐标)

drawCircle(float cx, float cy, float radius, Paint paint)

//绘制圆形

drawText(String text, float x, float y, Paint paint)

//绘制文本

其他的不再进行列举,有需要可以查看API文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: