Android OvalShape和ShapeDrawable

2016-09-07  本文已影响392人  Ggx的代码之旅

之前说过一篇自定义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的控件的宽和高,如果宽高相同那么出来的就是圆形,如果不同则是椭圆。
效果如下:

oval.png circle.png

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方法即可。

上一篇下一篇

猜你喜欢

热点阅读