android中-使用2D动画 — 图形处理(Canvas基础)
?Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图形处理相关的: Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、BitmapDrawable和TransitionDrawable等。以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。下面我们就主要来了解下Canvas的使用方法。
Canvas对象的获取方式有两种:一种我们通过重写View.onDraw方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。另一种就是当你想创建一个Canvas对象时使用的方法:
?
canvas.drawPosText:
?
?
?
canvas.drawRoundRect:
?
canvas.drawTextOnPath:
?
位置转换方法,canvas.rorate和canvas.translate:
?
?
上面几个例子基本已经将常用的canvas.draw*方法测试过了,我们结合一些事件,做一些有用户交互的应用:
?
?
?
??
package
com.android777.demo.uicontroller.graphics;
?
?import
java.util.ArrayList;
?
?import
android.app.Activity;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.PointF;
import
android.os.Bundle;
import
android.view.MotionEvent;
import
android.view.View;
?
?public
class
CanvasDemoActivity
extends
Activity {
?
?????
@Override
????
protected
void
onCreate(Bundle savedInstanceState) {
????????
super
.onCreate(savedInstanceState);
?
?????????
setContentView(
new
CustomView1(
this
));
?
?????
}
?
?????
/**
?????
* 使用内部类 自定义一个简单的View
?????
* @author Administrator
?????
*
?????
*/
????
class
CustomView1
extends
View{
?
?????????
Paint paint;
????????
private
ArrayList<PointF> graphics =
new
ArrayList<PointF>();
????????
PointF point;
?
?????????
public
CustomView1(Context context) {
????????????
super
(context);
????????????
paint =
new
Paint();
//设置一个笔刷大小是3的黄色的画笔
????????????
paint.setColor(Color.YELLOW);
????????????
paint.setStrokeJoin(Paint.Join.ROUND);
????????????
paint.setStrokeCap(Paint.Cap.ROUND);
????????????
paint.setStrokeWidth(
3
);
?
?????????
}
?
?????????
@Override
????????
public
boolean
onTouchEvent(MotionEvent event) {
?
?????????????
graphics.add(
new
PointF(event.getX(),event.getY()));
?
?????????????
invalidate();
//重新绘制区域
?
?????????????
return
true
;
????????
}
?
?????????
//在这里我们将测试canvas提供的绘制图形方法
????????
@Override
????????
protected
void
onDraw(Canvas canvas) {
????????????
for
(PointF point : graphics) {
????????????????
canvas.drawPoint(point.x, point.y, paint);
????????????
}
//????????? super.onDraw(canvas);
?
?????????
}
????
}
?
?}
?
当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线: