androidcanvas绘图详解.docx
《androidcanvas绘图详解.docx》由会员分享,可在线阅读,更多相关《androidcanvas绘图详解.docx(20页珍藏版)》请在冰豆网上搜索。
androidcanvas绘图详解
AndroidCanvas绘图详解(图文)
摘要Android中使用图形处理引擎,2D部分是androidSDK内部自己提供,3D部分是用OpenGLES。
今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在和包中。
他们提供了图
Android中使用图形处理引擎,2D部分是androidSDK内部自己提供,3D部分是用OpenGLES。
今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在和包中。
他们提供了图形处理相关的:
Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:
AnimationDrawable、BitmapDrawable和TransitionDrawable等。
以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。
你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View.invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。
下面我们就主要来了解下Canvas的使用方法。
Canvas对象的获取方式有两种:
一种我们通过重写方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。
另一种就是当你想创建一个Canvas对象时使用的方法:
1
2
Bitmapb=(100,100,
Canvasc=newCanvas(b);
上面代码创建了一个尺寸是100*100的Bitmap,使用它作为Canvas操作的对象,这时候的Canvas就是使用创建的方式。
当你使用创建的Canvas在bitmap上执行绘制方法后,你还可以将绘制的结果提交给另外一个Canvas,这样就可以达到两个Canvas协作完成的效果,简化逻辑。
但是androidSDK建议使用参数里提供的Canvas就好,没必要自己创建一个新的Canvas对象。
接下来我们看看Canvas提供我们哪些绘制图形的方法。
我们创建一个自定义View对象,使用onDraw方法提供的Canvas进行绘制图形。
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package
import
import
import
import
import
import
import
publicclassCanvasDemoActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
(savedInstanceState);
setContentView(newCustomView1(this));
}
/**
*使用内部类自定义一个简单的View
*@authorAdministrator
*
*/
classCustomView1extendsView{
Paintpaint;
publicCustomView1(Contextcontext){
super(context);
paint=newPaint();
..
40,40,
50,50,
60,60,
70,70,
80,80,
90,90,
100,100
},paint);
}
:
1
2
3
4
5
6
7
8
9
10
@Override
protectedvoidonDraw(Canvascanvas){
RectFrect=newRectF(50,50,200,200);
(rect,paint);
}
}
:
1
2
3
4
5
6
7
8
9
10
11
@Override
protectedvoidonDraw(Canvascanvas){
RectFrect=newRectF(50,50,200,200);
(rect,
30,//x轴的半径
30,//y轴的半径
paint);
}
:
1
2
3
4
5
6
7
8
9
10
11
12
@Override
protectedvoidonDraw(Canvascanvas){
Pathpath=newPath();//定义一条路径
(10,10);//移动到坐标10,10
(50,60);
(200,80);
(10,10);
(path,paint);
}
:
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protectedvoidonDraw(Canvascanvas){
Pathpath=newPath();//定义一条路径
(10,10);//移动到坐标10,10
(50,60);
(200,80);
(10,10);
//(path,paint);
("Android777开发者博客",path,10,10,paint);
}
位置转换方法,和:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@Override
protectedvoidonDraw(Canvascanvas){
(true);
;
()/2,200);//将位置移动画纸的坐标点:
150,150
(0,0,100,paint);//画圆圈
//使用path绘制路径文字
();
(-75,-75);
Pathpath=newPath();
(newRectF(0,0,150,150),-180,180);
PaintcitePaint=newPaint(paint);
(14);
(1);
("",path,28,0,citePaint);
();
PainttmpPaint=newPaint(paint);//小刻度画笔对象
(1);
floaty=100;
intcount=60;//总刻度数
for(inti=0;iif(i%5==0){
(0f,y,0,y+12f,paint);
(i/5+1),-4f,y+25f,tmpPaint);
}else{
(0f,y,0f,y+5f,tmpPaint);
}
(360/count,0f,0f);//旋转画纸
}
//绘制指针
;
(4);
(0,0,7,tmpPaint);
;
;
(0,0,5,tmpPaint);
(0,10,0,-65,paint);
}
上面几个例子基本已经将常用的*方法测试过了,我们结合一些事件,做一些有用户交互的应用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package
import
import
import
import
import
import
import
import
import
import
publicclassCanvasDemoActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
(savedInstanceState);
setContentView(newCustomView1(this));
}
/**
*使用内部类自定义一个简单的View
*@authorAdministrator
*
*/
classCustomView1extendsView{
Paintpaint;
privateArrayListgraphics=newArrayList();
PointFpoint;
publicCustomView1(Contextcontext){
super(context);
paint=newPaint();//设置一个笔刷大小是3的黄色的画笔
;
(3);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
(newPointF(),()));
invalidate();//重新绘制区域
returntrue;
}
//在这里我们将测试canvas提供的绘制图形方法
@Override
protectedvoidonDraw(Canvascanvas){
for(PointFpoint:
graphics){
,paint);
}
//(canvas);
}
}
}
当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线: