自定义View之准备

      一直以来都想研究自定义View,但是总是遇到这样那样的原因。今天理清思路,从零开始,一起学习,共同完成一个小demo。

     准备:想自己画出想要的控件,有些类必须了解----------Paint(画笔),Canvas(画布),View(视图)。

    View

  自定义View,最基本的要了解View这个类,当我们集成View,并实现自己想要功能的时候需要了解,我们经常重写哪些方法。
         

     invalidate();

调用此方法,系统会调用onDraw(Canvas canvas)方法,刷新View,但是注意这个方法必须在UI线程中调用。如果不在UI线程的话,调用postInvalidate()。

     onDraw(Canvas canvas) 

        此方法为我们提供了一个Canvas对象,我们可以在这里绘制图案等。

     onMeasure (int widthMeasureSpec, int heightMeasureSpec)

此方法,用于测量View的尺寸,一般类型为ViewGroup的时候才会用到这个。

     onLayout(boolean changed, int left, int top, int right, int bottom)

此方法在控件需要给子控件分配大小和位置时会调用,当然一般也是在类型为ViewGroup的时候会重写这个。

    Paint,Canvas

这两个放在一块是因为,二者密不可分。在onRraw方法中,提供了一个Canvas对象,一般来说Canvas中可以画点,画线,画各种图形,文字,图片。

       Paint控制了如何画,即:颜色,透明度,抗锯齿,实心还是空心等等

 Canvas控制了画什么,即:drawLine,drawArc,drawBitmap,drawText,drawRect,drawPath等等,太多,就一一不说了,每个方法都被重载了很多种,可以传入不同的参数,达到想要的效果,可以说条条大路通罗马。

         这里说几个特殊的:

        1、画多边形drawPath,别的不说啦,先上两个小图片,看看。挺好玩的,喜欢研究的可以研究研究。

代码如下:

         private void drawPath(Canvas canvas) {
		Paint p = new Paint();
		p.setAntiAlias(true);
		 p.setStyle(Style.STROKE);//空心
		//p.setStyle(Style.FILL);//实心
		p.setColor(Color.GREEN);
		Path path = new Path();
		path.moveTo(80, 340);
		path.lineTo(200, 500);
		path.lineTo(20, 400);
		path.lineTo(80, 500);
		path.lineTo(200, 500);
		path.lineTo(80, 600);
		path.close();
		canvas.drawPath(path, p);
	 }

        2、画图形,圆弧,圆,矩形等,这里以矩形为例,老规矩先上图

  

     这里的四个矩形,都是等长等高的,不难看出不同所在。风格以及实际大小。代码如下:

       /**
	 * 画矩形,实心&空心
	 * 
	 * @param canvas
	 */
	private void drawRect(Canvas canvas) {
                //Style为FILL_AND_STROKE的矩形
		Paint paint1 = new Paint();
		paint1.setAntiAlias(true);
		paint1.setColor(Color.BLUE);
		paint1.setStyle(Style.FILL_AND_STROKE);
		canvas.drawRect(20, 20, 100, 100, paint1);
                //Style为STROKE的矩形
		Paint paint2 = new Paint();
		paint2.setAntiAlias(true);
		paint2.setColor(Color.BLUE);
		paint2.setStyle(Style.STROKE);
		canvas.drawRect(120, 20, 200, 100, paint2);
                //设置了StrokeWidth,Style为STROKE矩形
		Paint paint3 = new Paint();
		paint3.setAntiAlias(true);
		paint3.setColor(Color.BLUE);
		paint3.setStyle(Style.STROKE);
		paint3.setStrokeWidth(10);
		canvas.drawRect(220, 20, 300, 100, paint3);
                //Style为FILL的矩形
		Paint paint4 = new Paint();
		paint4.setAntiAlias(true);
		paint4.setColor(Color.BLUE);
		paint4.setStyle(Style.FILL);
		canvas.drawRect(320, 20, 400, 100, paint4);

	}

3、画文字,拿一个方法吧,说说其参数,不过还是先上图


这个有点特殊,上代码前我先啰嗦两句。

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

参数:

text:需要绘制的文本

      x:文字的起始位置,但同样是一个基准位置,若是设置文字的TextAlign,则以此为基准(可看上图的3,4,5)。

 y:文字的基准线,这里强调这个基准线不是下边线,如图,写英文的时候字母都会按照基准线排列,图上很清楚了。

paint:就是画笔,这里不多说。

	/**
	 * 画文字
	 * 
	 * @param canvas
	 */
	private void drawText(Canvas canvas) {
		//绘制“Google,Android”
		Paint paint1 = new Paint();
		paint1.setAntiAlias(true);
		paint1.setColor(Color.GREEN);
		paint1.setTextSize(24);
		canvas.drawText("Google,Android", 200, 200, paint1);
		//绘制“Google,Android”,透明度设为100
		Paint paint2 = new Paint();
		paint2.setAntiAlias(true);
		paint2.setColor(Color.GREEN);
		paint2.setTextSize(24);
		//透明度有效范围 0-255
		paint2.setAlpha(100);
		canvas.drawText("Google,Android", 200, 230, paint2);
        <span style="white-space:pre">	</span>//绘制居左的“Google,Android”
		Paint paint3 = new Paint();
		paint3.setAntiAlias(true);
		paint3.setColor(Color.GREEN);
		paint3.setTextSize(24);
		paint3.setTextAlign(Align.LEFT);
		canvas.drawText("Google,Android", 200, 260, paint3);
		//绘制居中的“Google,Android”
		Paint paint4 = new Paint();
		paint4.setAntiAlias(true);
		paint4.setColor(Color.GREEN);
		paint4.setTextSize(24);
		paint4.setTextAlign(Align.CENTER);
		canvas.drawText("Google,Android", 200, 290, paint4);
		 //绘制居右的“Google,Android”
		Paint paint5 = new Paint();
		paint5.setAntiAlias(true);
		paint5.setColor(Color.GREEN);
		paint5.setTextSize(24);
		paint5.setTextAlign(Align.RIGHT);
		canvas.drawText("Google,Android", 200, 320, paint5);
	}

OK,基本的就是这样,根据这些,下一篇写一个类似于幸运转盘的效果。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值