美文网首页
Android OvalShape和ShapeDrawable

Android OvalShape和ShapeDrawable

作者: Ggx的代码之旅 | 来源:发表于2016-09-07 18:23 被阅读392次

    之前说过一篇自定义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方法即可。

    相关文章

      网友评论

          本文标题:Android OvalShape和ShapeDrawable

          本文链接:https://www.haomeiwen.com/subject/kvnjettx.html