android自定义shape oval,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)));

android:id="@+id/image"

android:layout_width="200dp"

android:layout_height="100dp"

android:layout_centerInParent="true"

android:scaleType="centerCrop" />

控件还是ImageView,表现出来是椭圆还是圆形取决你的ImageView的控件的宽和高,如果宽高相同那么出来的就是圆形,如果不同则是椭圆。

效果如下:

3cfa6db7187a

oval.png

3cfa6db7187a

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值