1、使用简单图片
BitmapFactory类提供了一些解码方法,来创建一个位图从各种来源。
decodeByteArray(byte[ ] data ,int offset,int length):从指定的字节数组的offset位置开始,将长度为length的直接数据解析陈Bitmap对象。
decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象。
decodeFileDescriptor(FileDescriptor fd) :从FileDescriptor指定的目录下解析 、创建Bitmap对象
decodeResource(Resource res,int id):用于指定的资源id从指定的资源中国解析、创建Bitmap对象
decodeStream(inputStream is):用于从指定的流中解析、创建Bitmap对象
Bitmap回收
Android中为Bitmap提供了两个提供了两个方法来判断他是否已回收,以及强制Bitmap回收自己。
boolean isRecycled() :返回Bitmap对象是否已被回收
void recycle() :强制回收一个Bitmap对象
图片移动缩放:
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
68
69
70
71
72
|
public class MainActivity extends Activity
{ private ImageView
iv; protected void onCreate(Bundle
savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv
= (ImageView) this .findViewById(R.id.iv); //
设置触摸监听事件 iv.setOnTouchListener( new MyOnTouchListener()); } public final class MyOnTouchListener implements OnTouchListener
{ private Matrix
mCurrentMatrix = new Matrix(); //
图片初始的matrix值 private Matrix
mMatrix = new Matrix(); //
来一个临时的matrix private PointF
startPoint = new PointF(); //
初始点 private PointF
midPointF; //
中心点的位置 private float midDistance; //
两点之间的距离 private int type
= 0 ; private final static int DRAG
= 1 ; private final static int SCALE
= 2 ; public boolean onTouch(View
v, MotionEvent event) { int action
= event.getAction() & MotionEvent.ACTION_MASK; switch (action)
{ case MotionEvent.ACTION_DOWN: //
手指按下 float x
= event.getX(); float y
= event.getY(); startPoint.set(x,
y); //
获得手指按下的初始点 mCurrentMatrix.set(iv.getImageMatrix()); //
图片没有移动的位置 type
= DRAG; break ; case MotionEvent.ACTION_POINTER_1_DOWN: //
屏幕上有一个手指,再按下一根手指 mCurrentMatrix.set(iv.getImageMatrix()); //
图片没有缩放的大小 midPointF
= getMidPointF(event); //
两个手指获得中点的坐标 midDistance
= getMidDistance(event); //
获得两个手指之间的距离 type
= SCALE; break ; case MotionEvent.ACTION_MOVE: //
屏幕上有一个手指,再按下一根手指 if (type
== DRAG) { mMatrix.set(mCurrentMatrix); float dx
= event.getX() - startPoint.x; float dy
= event.getY() - startPoint.y; mMatrix.postTranslate(dx,
dy); //
设置图片平移,平移的距离为两个手指移动的距离 } else if (type
== SCALE) { mMatrix.set(mCurrentMatrix); float distance
= getMidDistance(event); //
获得移动后两个手指之间的距离 float sx
= distance / midDistance; //
用移动后的距离除以移动前的距离,得到移动缩放的比例 mMatrix.postScale(sx,
sx, midPointF.x, midPointF.y); //
对图片进行缩放 } break ; case MotionEvent.ACTION_UP: //
手指弹起 case MotionEvent.ACTION_POINTER_1_UP: //
弹起一直手指,你一只手指弹起 type
= 0 ; break ; default : break ; } iv.setImageMatrix(mMatrix); return true ; } } //
计算两点之间的中点 private PointF
getMidPointF(MotionEvent event) { float x
= (event.getX( 1 )
+ event.getX( 0 ))
/ 2 ; float y
= (event.getY( 1 )
+ event.getY( 0 ))
/ 2 ; return new PointF(x,
y); } //
计算两点之间的距离 private float getMidDistance(MotionEvent
event) { float dx
= event.getX( 1 )
- event.getY( 0 ); float dy
= event.getY( 1 )
- event.getY( 0 ); return FloatMath.sqrt(dx
* dx + dy * dy); } } |
1
2
3
4
5
6
|
< ImageView android:id = "@+id/iv" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:scaleType = "matrix" android:src = "@drawable/schoolcalendar" /> |
二、Paint类
paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色 、透明度、和填充效果等信息,使用需要先创建该类的对象,
设置颜色 setColor(int color)
三、Canvas类
Canvas类创建一个画布
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
|
protected void onCreate(Bundle
savedInstanceState) { super .onCreate(savedInstanceState); //
自定义View setContentView( new MyView( this )); } class MyView extends View
{ Paint
mPaint; public MyView(Context
context) { super (context); //
1、设置画布 Canvas
canvas = new Canvas(); canvas.drawColor(color.white); //
2、设置画笔 mPaint
= new Paint(); //
设置画笔的颜色 mPaint.setColor(Color.BLUE); //
设置画的透明度 mPaint.setAlpha( 90 ); //
设置画笔 为空心,stroke为空心 mPaint.setStyle(Paint.Style.STROKE); } protected void onDraw(Canvas
canvas) { //
画一个空心正方形 、前两个为矩形左上角的坐标 canvas.drawRect( 10 , 80 , 70 , 140 ,
mPaint); //
画一个空心圆 canvas.drawCircle( 40 , 40 , 30 ,
mPaint); } } |
3、使用Matrix控制变换:
Matrix(矩阵、模型)是Android提供的一个矩阵工具类,它本身并不能对图像或组件进行变换,但他可对其他API集合来控制图形、组件的变换。
使用Matrix控制图像或组件变换的步骤如下:
1、获取Matrix对象,该Matrix对象既可以新创建,也可以直接获取其他对象封装的Matrix
2、调用Matrix的方法进行平移、旋转、缩放、倾斜等。
3、将程序对Matrix所做的变换应用到指定图像或组件。
Matrix提供了如下方法来控制平移、旋转和缩放:
1、Translate————平移变换
2、Scale————缩放变换
3、Rotate————旋转变换
4、Skew————错切变换
setTranslate(float dx,floatdy):控制Matrix进行平移
setSkew(float kx,float ky,float px,float py):控制Matrix以px,py为轴心进行倾斜。kx、ky为x,y方向上的倾斜距离。
setSkew(float kx,float ky):控制Matrix进行倾斜。kx、ky为x、y方向上的倾斜距离。
setRotate(float degrees,float px,float py):控制Matrix进行旋转,degrees控制旋转的角度。
setRotate(float degrees,float px,float py):设置以px、py为轴心进行旋转,degrees控制选转的角度。
set Scale(float sx,float sy):设置Matrix进行缩放,sx,sy控制x,y方向上的缩放比例。
setScale(float sx,float sy,float px,float py):设置Matrix以px、py为轴心进行缩放,sx,sy控制x,y方向上的比例。
一旦对Matrix进行了变换,接下来就可以应用该Matrix对图像进行控制了。例如Canvas就提供了了一个drawBitmap(Bitmap bitmap,Matrix matrix,Paint paint)方法,调用该方法就可以在绘制bitmap时应用Matrix上的变化。
Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。
在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。最好记住。如下图:
解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。
translateX和translateY表示x和y的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2。