带有圆角的Android ImageView(再次)

时间:2014-01-13 22:11:14

标签: android bitmap imageview rounded-corners

我在这里和其他互联网上仔细搜索过,但是没有为我找到解决方案。 我有固定大小的ImageView。我需要显示一些在运行时加载的位图。它们都有不同的尺寸和纵横比。例如:虽然ImageView是480x270px,但位图可能是160x90,1600x500,50x100等等。我希望它们居中并适合ImageView。圆角。

两种最常用的方法是(1)处理位图和(2)修改imageView子类中的绘制阶段。

Romain Guy扩展了Drawable并在Canvas中使用了drawRoundRect方法。不幸的是,他的解决方案没有应用FIT_CENTER,尽管圆线非常清晰。

还有一种变体可以处理位图,将其渲染到另一个位图并进行舍入。将其设置为源 - 获得居中并安装ImageView。但在这种情况下,圆角矩形仅存在于位图的像素网格中。如果位图很小,可能会非常模糊。

最后一个解决方案,最适合我,但也需要升级。我们可以调整画布以包含沿着它的边框的clipPath。但是具有16/5宽高比的居中位图不会被舍入 - 它将被绘制在cliPath之外。

1 个答案:

答案 0 :(得分:3)

所以,我完成了here的答案,因此它可以解决我的问题。

XML:

    <RoundedThumb
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

JAVA:

public class RoundedThumb extends ImageView {

private final float radius = getContext().getResources().getDimension(R.dimen.corner_radius);
private RectF mSrcRect = new RectF();
private RectF mDstRect = new RectF();
private Path mClipPath = new Path();

public RoundedThumb(Context context) {
    super(context);
}

public RoundedThumb(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public RoundedThumb(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

protected void onDraw(Canvas canvas) {
    if (getDrawable() != null && getImageMatrix() != null) {
        mSrcRect.set(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight());
        getImageMatrix().mapRect(mDstRect, mSrcRect);
        mClipPath.reset();
        mClipPath.addRoundRect(mDstRect, radius, radius, Path.Direction.CW);
        canvas.clipPath(mClipPath);
    }
    super.onDraw(canvas);
}
}

用法:

thumb.setScaleType(ImageView.ScaleType.FIT_CENTER);
Bitmap thumbnail = BitmapFactory.decodeFile(path);
thumb.setImageBitmap(thumbnail);

因此,现在,对于Path而言,rect的转换就像ImageView中的BitmapDrawable一样,并且总是在ImageView中的任何位图周围进行限定。对我来说重要的是什么 - ImageView仍然有aspectRatio 16/9并且在资源中定义了它的位置。但是位图有圆角边框,但没有修改。

UPD1:我有点困惑:遗憾的是在某些设备上,clipPath方法没有效果(SII)甚至崩溃(旧的asus变换器)。可以通过将hardwareAccelerated设置为false来完全修复。但是,该死的,那不好= /