1、2D图形应用的场景
- 当现有View已经不能满足我们的需求时,我们需要绘制自己的View。
- 不同形状、不同风格的View
- 游戏界面
- 地图界面
2、Graphics 概述
- 要绘制2D图形需要android.graphics中的类来实现
- graphics包括:Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等。
- Graphics具有绘制点、线、颜色、图像处理、2D几何图形等功能。
- 以下分别介绍Graphics类的使用。
2.1、Paint类
- Android中的画笔就Paint 类,主要方法有:
- setAntiAlias:设置画笔的锯齿效果。
- setColor:设置画笔的颜色。
- setARGB:设置画笔的a,r, g,b值
- setAlpha:设置Alpha值。
- setStyle:设置画笔的风格,空心或实心
- setStrokeWidth:设置 边框宽度
2.2、Color类
颜色常量 | 含义 | 颜色常量 | 含义 |
---|
BLACK | 黑色 | GREEN | 绿色 |
BLUE | 蓝色 | LTGRAY | 浅灰色 |
CYAN | 青绿色 | MAGENTA | 红紫色 |
DKGRAY | 灰黑色 | RED | 红色 |
YELLOW | 黄色 | TRANSPARENT | 透明 |
GRAY | 灰色 | WHITE | 白色 |
2.3、Canvas(画布)
- Canvas是graphics中最主要的类,除了可以在画布上绘制外,还可以设置画布的各种属性,主要方法如下:
- Canvas():创建一个空画布
- Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上
- drawColor:设置背景色
- clipRect:设置显示区域
- rotate:旋转画布
- skew:设置偏移量
2.4、Canvas绘制几何图形
方法 | 说明 |
---|
drawRect | 绘制矩形 |
drawCircle | 绘制圆形 |
drawOval | 绘制椭圆 |
drawPath | 绘制任意多边形 |
drawLine | 绘制直线 |
drawPoint | 绘制点 |
2.5、Canvas绘制字符串
- 可以调用
Canvas
的drawText (String text, float x, float y, Paint paint) 方法绘制文字,x,y是文字在canvas
上的位置坐标,可以调用setTextSize
, setTextWidths
,setARGB
等方法控制paint
。
2.6、绘制图像
- Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(资源索引)).getBitmap();
- Canvas.drawBitmap(bitmap, x, y, null);
2.7、图像缩放旋转处理
Matrix
类包含一个3*3的矩阵,可以用来表示旋转、缩放、倾斜、平移等坐标变换。
Matrix matrix = new Matrix();
matrix.setRotate(25.0f);
matrix.postScale(1.0f, 1.5f);
canvas.drawBitmap(bitmap, matrix, paint);
2.8、图像像素操作实现特效
- 通过操作像素,我们可以对图片进行等效处理。
- 通过
Bitmap
的getPixels
方法获得图像的像素并放到一个数组中。 - 处理像素数组:每一个像素由一个4字节整数以ARGB的方式表示,所以按照一定的规律改变各点的值就能实现特效。
- 通过
setPixels
设置像素数组到Bitmap
中
2.9、获得屏幕分辨率
- 通过
getMetrics
方法得到屏幕的DisplayMetrics
属性
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
3、Animation概述
- Android平台的动画分为两类:
- 一类是Tween动画,也叫viewAnimation,通过对场景里的对象进行变换(平移、缩放、旋转)产生动画效果。
- 另一类是Frame动画,也叫DrawableAnimation,按顺序播放实现准备好的素材来实现
3.1、Tween动画
- Tween包括以下四种动画效果:
- 对应类如下:
- AlphaAnimation(float fromAlpha,float toAlpha)
- ScaleAnimation(float fromX,float toX,float fromY, float toY,int pivotXType,float pivotXValue, int pivotYType,float pivotYvalue)
- TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
- RotateAnimation(float fromDegrees, float toDegress, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
- 设置显示时间
- setDuration(long durationMillis)
- 开始播放动画
- startAnimation(Animation animation)
3.2、在xml中实现Tween
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400"
android:fillBefore="false" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400" />
</set>
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage );
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
3.3、Frame动画
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust );
rocketAnimation = (AnimationDrawable)
rocketImage.getBackground();
rocketAnimation.start();
3.4、播放GIF
- Android不能直接播放GIF,但我们可以把GIF解析成多个图片,只要按顺序逐个显示这些图片就达到了播放的效果。