gpt4 book ai didi

带圆角的 Android ImageView(再次)

转载 作者:行者123 更新时间:2023-11-29 17:53:45 28 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

所以,我完成了来自 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);

因此,现在 Rect for Path 就像 ImageView 内部的 BitmapDrawable 一样转换,并且始终精确地围绕 ImageView 中的任何位图进行外接。对我来说重要的是 - ImageView 仍然具有 aspectRatio 16/9 并取而代之,在资源中定义。但是位图有圆角边框,而​​它没有被修改。

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

关于带圆角的 Android ImageView(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102391/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com