1.ImageView的ScaleType
ImageView是Android中的基础图片显示控件,该控件有个重要的属性ScaleType,这个属性在一定程度上可以控制图片显示的缩放。Launcher中AppWidget的preview显示是通过ImageView显示,而且每个AppWidget的preview大小可能不一样,而给定的显示区域大小是一样的,故通过ScaleType属性来控制preview的显示。Imageview的ScaleType共有8种取值:
(1) ScaleType.CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片的中间部分,若小于,则直接将图片居中显示。
(2) ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长相同,即不能留有空白,缩放后截取中间部分进行显示。
(3) ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小雨ImageView的图片不变,直接居中显示。
(4) ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。
(5) ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。
(6) ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。
(7) ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。
(8) ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放。
Launcher中ImageView的默认ScaleType值为ScaleType.MATRIX,当图片的尺寸过大时就将ScaleType的值设为ScaleType.FIT_START。
2.Matrix
线性代数中有关矩阵的乘法运算运用到Android中,来实现图像的平移,缩放,旋转等操纵,其相关类为android.graphics.Matrix。
(1)首先,举个简单的例子:设点p0(x0,y0)进行平移后,移到p(x,y),其中x方向的平移量为△x,y方向的平移量为△y,那么,点p(x,y)的坐标为:
x=x0+△x
y=y0+△y
采用矩阵表达上述关系如下:
上述也类似于图像的平移,通过上述矩阵发现,只需要改变矩阵右上角的两个元素就可以实现平移了。
代码实现为:
float a=10f;
float b=10f;
Matrix matrix=new Matrix();
matrix.setTranslate(a, b);
亦可以通过设置矩阵的值来实现平移:
float f[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
(2)举个具体的例子,来实现缩放功能:设点p0(x0,y0),放大后变为p(x,y)其中x放大a倍,y方法b倍
x=a*x0;
y=b*y0;
采用矩阵的表达上述结果为:
float a=10f;
float b=10f;
Matrix matrix=new Matrix();
matrix.setScale(a, b);
亦可以通过设置矩阵的值来实现平移:
float f[]={10.0f,0f,0.0f ,0f, 10.0f,0.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
(3)实现旋转的功能:设点为p(x0,y0)旋转θ角后的对应点为p(x,y)。通过使用向量,得到如下:
x0=r*cosα
y0=r*sinα
x=r*cos(α+θ)= x0cosθ - y0 sinθ
y=r sin(α+θ)= x0 sinθ + y0 cosθ
得到矩阵如下:
代码设置为:
float a=30.0f;
Matrix matrix=new Matrix();
matrix.setRotate(a);
其中这是按照原点旋转的。如果按照某一个点旋转如下:
matrix.setRotate(a,x,y);
在实现图像的上述功能中,Matrix与Bitmap结合使用,如下
floatf[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
Bitmap bm2=Bitmap.createBitmap(bm1,0,0,width,height,matrix,true);
3.Canvas、Bitmap、Drawable
首先,先介绍Canvas,Bitmap,Drawable:
Canvas:名为画布,可以看做是一种处理过程,使用各种方法来管理Bitmap、GL或者path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时canvas类还提供了裁剪、选取等操作。
Bitmap:称为位图,一般位图的文件格式后缀为bmp,是android系统中和的图像处理的最重要的类之一。用它可以火族图像文件的信息,进行图像的裁剪、选装错放等操作,并可以指定格式保存图像文件。
Drawable:它是一个通用的抽象类,它的目标是告诉你什么东西可以画的。基于Drawable类扩展出各种绘图类,也可以继承它来创建自己的绘图类,Launcher中FastBitmapDrawable就是这样的。介绍两种方式创建Drawable:从资源图像文件中创建,从XML文件中创建。
Canvas,Bitmap和Drawable在Launcher中结合使用,来实现图像的缩放如下:
Canvas canvas=new Canvas();
Bitmap orig=……;//目标bitmap
int w=orig,getWidth();
int h=orig.getHeight();
Bitmapb=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvas.setBitmap(b);
Rect src=new Rect(0,0,w,h);//源矩形
float scale=0.5f;
Rect dst=new Rect(0,0,(int)(w*scale),(int)(h*scale));//目标矩形
Canvas.drawBitmap(orig,src.dst,null);
显示的图像经过变换后,经过源矩形与目标矩形的设置来控制缩放。
Drawable d=……;
Canvas c=new Canvas(bitmap);
c.scale(scale,scasle);//设置缩放比例
Rect oldBounds=d.copyBounds();
d.setBounds(x.y,x+w,y+h);
d.draw(c);
d.setBounds(oldBounds);
经过Canvas设置缩放比例,来直接控制缩放。