android - 将 ImageView 锚定到另一个 ImageView 的角落
问题描述
如何将 ImageView 锚定到另一个 ImageView 的右下角,如上图所示(1-man 和 2-pencil)
我正在使用改造将我的源作为椭圆形加载到 ImageViews
我这样做:
Glide.with(context)
.asBitmap()
.load(model)
.fitCenter()
.apply(RequestOptions.circleCropTransform())
.into(object : BitmapImageViewTarget(this) {
override fun setResource(resource: Bitmap?) {
setImageDrawable(
resource?.run {
RoundedBitmapDrawableFactory.create(
resources,
if (borderSize > 0) {
createBitmapWithBorder(borderSize, borderColor)
} else {
this
}
).apply {
isCircular = true
}
}
)
}
})
解决方案
基本概念
要构建这样的布局,您可以使用例如ConstraintLayout
或RelativeLayout
.
使用RelativeLayout
您可以构建这样的结构:
<RelativeLayout
android:layout_width="200dp"
android:layout_height="200dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginEnd="20dp"
android:layout_marginBottom="20dp"
android:background="#00f" />
<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:background="#f0f" />
</RelativeLayout>
小圆圈
对于较小的圆圈(灰色一个),您只能使用一个 ImageView
。只需设置浅色背景 - asbackground
和笔图标 - as src
。
1)因为ImageView
background
你必须用两个shape
s创建新的drawable 。第一个 ont 是周围的白色边框,第二个它只是浅灰色背景。
您可以设置填充第二个形状(这里,例如,有5dp
)
<?xml version="1.0" encoding="utf-8"?><?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#FFFFFF" />
</shape>
</item>
<item
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp">
<shape android:shape="oval">
<solid android:color="#CACACA" />
</shape>
</item>
</layer-list>
2)作为图标,您可以使用可绘制(例如矢量)或仅图像并将其设置为src
在此之后,它应该看起来像那里:
3)设置正确缩放(笔)图标padding
:ImageView
<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:background="@drawable/small_circle_background"
android:padding="16dp"
android:src="@drawable/small_circle_icon" />
大圆圈
最好的方法是使用像 Picasso 或 Glide 这样的库。
对于 Glide,您可以使用CircleTransform()
将接收到的图像裁剪为圆形。加载图像时,您可以使用transform()
方法:
Glide.with(this)
.load(URL)
.transform(new CircleTransform(context))
.into(imageView);
什么时候CircleTransform
:
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import androidx.annotation.NonNull;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import org.jetbrains.annotations.NotNull;
import java.security.MessageDigest;
public class CircleTransform extends BitmapTransformation {
@Override protected Bitmap transform(@NotNull BitmapPool pool, @NotNull Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
}
}
最后结果
推荐阅读
- jmeter - CSS/JQuery 提取器在负载测试的情况下为随机线程提取默认值
- python - 连续到分类二维数组
- arrays - 如何在 Pyomo 的集合数组中声明由子集索引的参数/变量?
- excel - 如何使用两个不同选项卡之间的日期正确索引匹配
- c# - 如何使用不断变化的模式处理 XML 反序列化
- corda - 在公证人签名后,发起者无法将状态提交到 vault_linear_states
- python - Spyder 无法在 Ubuntu 上的 Anaconda 中启动
- dotnetnuke - DNN 主题。如何从设置中填充 DropDownList 值?
- c++ - c ++套接字多个请求
- swift - 当 AVCaptureConnection videoOrientation 设置为纵向时,MLKit 人脸跟踪无法在视频流中找到人脸