Android OvalShape和ShapeDrawable
之前说过一篇自定义Drawable画出来的圆形图片的效果,后来发现还有更方便强大的方法,原来官方早就已经给我们提供好了。只需要做一点简单的修改即可,直接看代码,还是自定义Drawable
public class OvalImageDrawable extends Drawable{
private Bitmap bitmap;
private Matrix matrix;
private BitmapShader shader;
private Paint mPaint;
private ShapeDrawable shapeDrawable;
public OvalImageDrawable(Bitmap bitmap) {
this.bitmap=bitmap;
shader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
matrix=new Matrix();
shapeDrawable=new ShapeDrawable(new OvalShape());
mPaint=shapeDrawable.getPaint();
shapeDrawable.getPaint().setShader(shader);
}
@Override
public void draw(Canvas canvas) {
//获取imageView的矩形边框
Rect rect=getBounds();
//缩放比,使用imageView的宽和原图的宽得到一个宽的比例,在同理获取高的比例,取最大值
/**
* 取最大值的原因是因为:
* view的宽高为100*200;图片的宽高为50*300;
* 宽的比例是:2:1,高的比例是2:3
* 最终我们应该按照宽的比例放大,而不是按照高的比例缩小;
* 如果高的比例大于我们宽的比例那么就是取高的比例了
* 因为我们需要让缩放后的图片,大于我们的view宽高,并保证原图比例。
*/
float scale = Math.max(rect.width() * 1.0f / bitmap.getWidth(), rect.height()
* 1.0f / bitmap.getHeight());
matrix.setScale(scale,scale);
shader.setLocalMatrix(matrix);
shapeDrawable.setBounds(rect);
shapeDrawable.draw(canvas);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
//下面两个方法主要用于在view使用wrapContent的时候使用的
@Override
public int getIntrinsicHeight() {
return bitmap.getHeight();
}
@Override
public int getIntrinsicWidth() {
return bitmap.getWidth();
}
}
使用方式还是一样
image.setBackground(new OvalImageDrawable(BitmapFactory.decodeResource(getResources(),R.drawable.aa)));
<ImageView
android:id="@+id/image"
android:layout_width="200dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:scaleType="centerCrop" />
控件还是ImageView,表现出来是椭圆还是圆形取决你的ImageView的控件的宽和高,如果宽高相同那么出来的就是圆形,如果不同则是椭圆。
效果如下:
ShapeDrawable
这个类相当于形状绘制工具,绘制出来什么形状取决于你传递给他什么形状。官方的原文解释如下:
A Drawable object that draws primitive shapes. A ShapeDrawable takes a* {@link android.graphics.drawable.shapes.Shape} object and manages its* presence on the screen. If no Shape is given, then the ShapeDrawable will* default to a {@link android.graphics.drawable.shapes.RectShape}.
如果不给他形状那么默认画出来是矩形。
创建方式如下:
ShapeDrawable shapeDrawable=new ShapeDrawable(new OvalShape());
OvalShape
这个很简单,见名知意就是一个椭圆形。不此类继承自Shape,需要设置任何只需要传递给ShapeDrawable就行了。如果想要实现圆角矩形的形状官方也提供给我们RoundRectShape用法一样。当然我们可以也定义自己的Shap,这放在下一篇讲解。
这里我们一直是通过代码的方式创建一个圆形或者椭圆的Drawable对象,并在运行过程中设置给ImageView对象,更多的时候我们喜欢直接写一个View让他直接显示就是圆形或者椭圆,通过上面介绍的东西我们其实很容易就可以实现这个东西了。我们自定义的ImageView只需要继承自ImageView然后重写它的onDraw方法即可。