Android 将一个ImageView锚定到另一个ImageView的角上
如何将一个ImageView锚定到另一个ImageView的右下角,如上图所示(1人2铅笔) 我正在使用改型将我的源作为椭圆加载到ImageView中 我这样做:Android 将一个ImageView锚定到另一个ImageView的角上,android,kotlin,layout,imageview,Android,Kotlin,Layout,Imageview,如何将一个ImageView锚定到另一个ImageView的右下角,如上图所示(1人2铅笔) 我正在使用改型将我的源作为椭圆加载到ImageView中 我这样做: Glide.with(context) .asBitmap() .load(model) .fitCenter() .apply(RequestOptions.circleCropTransform()) .into(object : BitmapI
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>
2)作为图标,您可以使用可绘制(例如矢量)或仅使用图像,并将其设置为src
在这一点之后,它应该如下所示:
3) 在ImageView
中设置padding
,以正确缩放(笔)图标:
<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" />
当循环变换为:
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) {
}
}
最终结果
你可以像这样实现你想要的:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/first_image"/>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/second"
android:layout_gravity="bottom|right"/>
</FrameLayout>
@Sajjad我会有两个imageView,我可以创建椭圆形imageView,但我不能创建两个类似于中的imageViewscreen@Sajjad是的,我想这样做
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) {
}
}
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/first_image"/>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/second"
android:layout_gravity="bottom|right"/>
</FrameLayout>