android 中的 canvas , paint

本文详细介绍了Android中Canvas和Paint的使用方法,包括如何设置画笔颜色、样式、透明度等,并通过具体示例展示了如何绘制文本、图像、线条、圆形、矩形等多种元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android中 有时候经常也会需要我们使用到 canvas 和 paint,(跟这经常结合起来 息息相关的就是 androd中的渲染器啦,这个前面稍微总结过了,这些东西虽然简单。但是真心感觉好实用),

上效果图,代码



注释也都很详细了呢。各种组合,可以达到很好的效果,例子后面举出吧。 

private class MyTestView extends View{

		public MyTestView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
		}
		
		
		@Override
		protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
			// TODO Auto-generated method stub
			int height = View.MeasureSpec.getSize(heightMeasureSpec); 
			int width = View.MeasureSpec.getSize(widthMeasureSpec); 
			setMeasuredDimension(width,height); 
		
			super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		}
		
		@Override
		protected void onDraw(Canvas canvas) {
			// TODO Auto-generated method stub
			super.onDraw(canvas);
			
			
			// 创建画笔  
	        Paint p = new Paint();  
	        // 设置红色  
	        p.setColor(Color.BLUE);
	        //text的显示位置
	        p.setTextAlign(Paint.Align.LEFT); 
	        //设置字体样式  
	        p.setTypeface(Typeface.SANS_SERIF);
	        //相当于setcolor 和 setAlpha
	        //p.setARGB(0.5f, r, g, b);
	        //X轴的比例因子   大于1时横向拉伸,小于1时横向收缩
	        p.setTextScaleX(2f);
	        //设置下划线
	        p.setUnderlineText(true);
            //设置字体画笔 宽度
	        p.setStrokeWidth(20f);
	        //设置字体大小
	        p.setTextSize(50);
	        //设置倾斜因子
	        p.setTextSkewX(2);
	        //画字
	        canvas.drawText("circle", 111, 111, p); // 画文本  
	        //设置驱除画笔的锯齿效果
	        p.setAntiAlias(true);               

	        
	        
	        //画图
	        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	        canvas.drawBitmap(bitmap,100,200,p);
	        
	        //画线
	        p.setColor(Color.GRAY);
	        canvas.drawLine(150, 180, 230, 300, p);
//	        canvas.drawLines(pts, paint);
	        
	        //  圆心 (x y)             半径 
	        canvas.drawCircle(200, 200, 20, p);    
	        
	        //画弧线
	        p.setStyle(Style.STROKE);
	        p.setColor(Color.GREEN);
	        RectF oval = new RectF(300,300,400,500);  //区域。。
	        canvas.drawArc(oval, 180, 180, false, p);
	     
	        //画矩形
	        p.setStyle(Style.FILL_AND_STROKE);
	        p.setColor(Color.CYAN);
	        RectF oval1 = new RectF(300,300,400,500);
	        canvas.drawRect(oval1,p);   
	        
	        //画扇形                        
	        p.setColor(Color.YELLOW);
	        //设置笔
	        p.setStyle(Style.STROKE);
	        RectF oval2 = new RectF(100,400,400,550);
	        //true画扇形
	        //(框)
	        canvas.drawArc(oval2, 180, 180, true, p);
	        //(实心)
	        p.setStyle(Style.FILL);
	        RectF oval3 = new RectF(100,480,370,620);
	        canvas.drawArc(oval3, 180, 180, true, p);
	        
	       
	        //多边形     实心就填充了
	        p.setStyle(Style.FILL);
	        p.setColor(Color.BLACK);
	        Path path = new Path();       //路径。。
	        path.moveTo(450,500);
	        path.lineTo(510, 510);
	        path.lineTo(550, 400);
	        //使上面的点形成封闭图形
	        path.close();  
	        canvas.drawPath(path, p);
	        
			
	        //画点  
	        p.setColor(Color.LTGRAY);
	        p.setStyle(Paint.Style.FILL); 
	        //画一个点  
	        canvas.drawPoint(80, 570 , p);
	        //画多个点
	        canvas.drawPoints(new float[]{110,570,140,570,170,570}, p);  
	          
		}
		
	 }


以下是后面又追加的更全一些  http://blog.youkuaiyun.com/u013279840/article/details/52913969


关闭硬件加速。关闭的方法有两种:


(1) 在application配置文件中关闭硬件加速:
 <application  android:allowBackup="true"  android:hardwareAccelerated="false"    >……


(2) 在自定义view中调用方法来关闭:
 setLayerType(LAYER_TYPE_SOFTWARE, null);

(3) set(Paint src)
 把另一个画笔的属性设置Copy给我们的画笔,不累赘了

(4) setAlpha(int a);
设置绘制图形的透明度,设置范围是[0..255]

(5)setAntiAlias(boolean aa) 抗锯齿

(6)setARGB(int a, int r, int g, int b)
 
设置绘制的颜色,a代表透明度,r,g,b代表颜色值。


(7)setColor(int color)

(8)setFakeBoldText (boolean fakeBoldText)设置文本仿粗体。注意设置在小字体上效果会非常差。

(9)setDither(boolean dither)

(10)setFilterBitmap(boolean filter)
如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。


(11)setFlags (int flags)

  setFlags (int flags)

设置标志,还是对paint进行样式的设置。比如:


// 实例化画笔并打开抗锯齿mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);


(12)setFontFeatureSettings(String settings)

设置字体的样式,这个样式和CSS样式很类似。样式可以为null,可以参考:http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings

(13)setHinting(int mode)

设置画笔的隐藏模式。可以是 HINTING_OFF or HINTING_ON之一

(14)setLetterSpacing(float letterSpacing)
设置行间距,默认是0.


(15)setLinearText (boolean linearText)
设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。
想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,
既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。

(16) setMaskFilter(MaskFilter maskfilter)
setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处理。 如需详细了解,请参考:

http://www.cnblogs.com/tianzhijiexian/p/4297734.html



(17)setPathEffect(PathEffect effect)
设置绘制路径的效果,如点画线等 。 如需详细了解,请参考:
http://www.cnblogs.com/tianzhijiexian/p/4297783.html



(18)setShadowLayer(float radius, float dx, float dy, int shadowColor)

radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。

注意: 这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。

该方法为我们绘制的图形添加一个阴影层效果:


  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    // 关闭单个view的硬件加速    setLayerType(LAYER_TYPE_SOFTWARE, null); 
    // 先绘制位图      mPaint.setColor(Color.RED);    // 设置阴影效果    mPaint.setShadowLayer(10, 3, 3, Color.DKGRAY);  
    // 画一个矩形      canvas.drawRect(200, 200, 600, 600, mPaint);  
  }


BlurMaskFilter可以模拟类似效果,跟BlurMaskFilter比起来setShadowLayer()方法是不是更简捷呢?但是BlurMaskFilter能做的setShadowLayer却不一定能做到哦!




(19)setStrokeCap(Paint.Cap cap)
该方法用来设置我们画笔的 笔触风格 ,比如:ROUND,表示是圆角的笔触。那么什么叫笔触呢,其实很简单,就像我们现实世界中的笔,如果你用圆珠笔在纸上戳一点,那么这个点一定是个圆,即便很小,它代表了笔的笔触形状,如果我们把一支铅笔笔尖削成方形的,那么画出来的线条会是一条弯曲的“矩形”,这就是笔触的意思。除了ROUND,Paint.Cap还提供了另外两种类型:SQUARE和BUTT


setStrokeJoin(Paint.Join join)

这个方法用于设置接合处的形态,就像你用代码画了一条线,但是这条线其实是由无数条小线拼接成的,拼接处的形状就由该方法指定。可选参数是:BEVEL,MITER,ROUND。

mPaint.setStrokeJoin(Paint.Join.ROUND);


(20)setStyle(Style style)

 置画笔样式,如果不设置,默认是全部填充(FILL)。可选项为:FILL,FILL_OR_STROKE,或STROKE 

 画笔样式分三种:

 1.Paint.Style.STROKE:描边

 2.Paint.Style.FILL_AND_STROKE:描边并填充

 3.Paint.Style.FILL:填充


(21)setStrokeWidth(float width);
当画笔样式(style)为STROKE或FILL_OR_STROKE时(空心样式时),设置笔刷的粗细度。


(22)setStrokeMiter(float miter )
设置笔画的倾斜度,取值:>=0。如:小时候用的铅笔,削的时候斜与垂直削出来的笔尖效果是不一样的。主要是用来设置笔触的连接处的样式。可以和setStrokeJoin()来比较比较。


(23)setSubpixelText (boolean  subpixelText )

设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。

(24)setXfermode(Xfermode xfermode)设置图像的混合模式,详细使用方式请参考:
http://www.cnblogs.com/tianzhijiexian/p/4297172.html


用TextPaint来绘制文字,TextPaint是paint的子类,用它可以很方便的进行文字的绘制,一般情况下遇到绘制文字的需求时,我们一般用TextPaint所提供的方法

TextPaint绘制文字  http://blog.youkuaiyun.com/cxc19890214/article/details/51581400

(1)setStrikeThruText (boolean strikeThruText)   设置文本删除线。

(2)setTextAlign (Paint.Align align) 设置文本的对齐方式,可供选的方式有三种:CENTER,LEFT和RIGHT。

(3)setTextScaleX (float scaleX) 将文本沿X轴水平缩放,默认值为1,当值大于1会沿X轴水平放大文本,当值小于1会沿X轴水平缩放文本

(4)setTextSize (float textSize)
设置文字的大小,但是要注意该值必需大于零。


(5)setTextSkewX(float skewX)
设置文本在水平方向上的倾斜。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。

(6)setTypeface (Typeface typeface) 设置文本字体样式。
(7)setUnderlineText(boolean underlineText) 设置文字的下划线。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李磊LL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值