Glide 라이브러리를 사용하여 이미지를 반올림하는 방법은 무엇입니까?
글라이드로 모서리가 둥근 이미지를 표시하는 방법을 아는 사람?Glide로 이미지를 로드하는 중인데 이 라이브러리에 둥근 매개 변수를 전달하는 방법을 모르겠습니다.
다음 예시와 같은 디스플레이 이미지가 필요합니다.
글라이드 V4:
Glide.with(context)
.load(url)
.circleCrop()
.into(imageView);
글라이드 V3:
사용할 수 있습니다.RoundedBitmapDrawable
Glide를 사용한 원형 영상의 경우.사용자 지정 이미지 보기가 필요하지 않습니다.
Glide.with(context).load(url).asBitmap().centerCrop().into(new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCircular(true);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
이 게시물을 확인해 보세요, 글라이드 대 피카소...
편집: 링크된 게시물은 라이브러리에서 중요한 차이를 불러오지 않습니다.글라이드는 자동으로 재활용을 합니다.자세한 내용은 TWiSterRob의 의견을 참조하십시오.
Glide.with(this).load(URL).transform(new CircleTransform(context)).into(imageView);
public static class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override protected Bitmap transform(BitmapPool pool, 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;
// TODO this could be acquired from the pool too
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(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 String getId() {
return getClass().getName();
}
}
가장 쉬운 방법(글라이드 4.x.x 필요)
Glide.with(context).load(uri).apply(RequestOptions.circleCropTransform()).into(imageView)
이쪽으로 오세요
코드
Glide.with(this)
.load(R.drawable.thumbnail)
.bitmapTransform(new CropCircleTransformation(this))
.into(mProfile);
XML
<ImageView
android:id="@+id/img_profile"
android:layout_width="76dp"
android:layout_height="76dp"
android:background="@drawable/all_circle_white_bg"
android:padding="1dp"/>
all_message_white_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@android:color/white"/>
</shape>
</item>
</selector>
- 저는 이 변환 라이브러리를 사용합니다. -> https://github.com/wasabeef/glide-transformations
- 원 스트로크 너비는 ImageView의 패딩입니다.
매우 단순합니다. 저는 글라이드 도서관을 보았습니다. 발리 구글 도서관에 기반을 둔 매우 좋은 도서관과 에세이를 기반으로 합니다.
둥근 이미지 보기에 이 라이브러리 사용
https://github.com/hdodenhof/CircleImageView
지금이다
//단순 보기의 경우:
@Override
public void onCreate(Bundle savedInstanceState) {
...
CircleImageView civProfilePic = (CircleImageView)findViewById(R.id.ivProfile);
Glide.load("http://goo.gl/h8qOq7").into(civProfilePic);
}
//목록의 경우:
@Override
public View getView(int position, View recycled, ViewGroup container) {
final ImageView myImageView;
if (recycled == null) {
myImageView = (CircleImageView) inflater.inflate(R.layout.my_image_view,
container, false);
} else {
myImageView = (CircleImageView) recycled;
}
String url = myUrls.get(position);
Glide.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.animate(R.anim.fade_in)
.into(myImageView);
return myImageView;
}
및 XML로 표시
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/ivProfile
android:layout_width="160dp"
android:layout_height="160dp"
android:layout_centerInParent="true"
android:src="@drawable/hugh"
app:border_width="2dp"
app:border_color="@color/dark" />
다른 해결책들은 저에게 효과가 없었습니다.저는 그들 모두가 중요한 단점을 가지고 있다는 것을 발견했습니다.
- 글라이드 변환을 사용하는 솔루션이 자리 표시자와 함께 작동하지 않음
- 둥근 이미지 보기를 사용하는 솔루션은 애니메이션(즉, 크로스페이드)에서 작동하지 않습니다.
- 자녀를 클립하는 부모의 일반적인 방법을 사용하는 솔루션(예: 여기서 승인된 답변)은 글라이드에서 잘 작동하지 않습니다.
이것을 더듬어 본 후에 저는 둥근 모서리와 원에 대한 프레스코 라이브러리 페이지를 발견했는데, 여기에는 기본적으로 동일한 제한 사항이 나열되어 있고 다음과 같은 문구로 마무리됩니다.
Android에서 모서리를 반올림하기 위한 정말 좋은 솔루션은 없으며 앞에서 언급한 절충안 중 하나를 선택해야 합니다.
이 시기에 우리가 여전히 진정한 해결책을 가지고 있지 않다는 것이 믿기지 않습니다.제가 위에 올린 링크를 바탕으로 다른 해결책이 있습니다.이 방법의 단점은 배경이 단색이라고 가정한다는 것입니다(모서리가 정말 투명하지 않습니다).다음과 같이 사용할 수 있습니다.
<RoundedCornerLayout ...>
<ImageView ...>
</RoundedCornerLayout>
요점은 여기에 있고 전체 코드는 여기에 있습니다.
public class RoundedCornerLayout extends RelativeLayout {
private Bitmap maskBitmap;
private Paint paint;
private float cornerRadius;
public RoundedCornerLayout(Context context) {
super(context);
init(context, null, 0);
}
public RoundedCornerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
setWillNotDraw(false);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
if (maskBitmap == null) {
// This corner radius assumes the image width == height and you want it to be circular
// Otherwise, customize the radius as needed
cornerRadius = canvas.getWidth() / 2;
maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
}
canvas.drawBitmap(maskBitmap, 0f, 0f, paint);
}
private Bitmap createMask(int width, int height) {
Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(mask);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE); // TODO set your background color as needed
canvas.drawRect(0, 0, width, height, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);
return mask;
}
}
이제 Glide V4에서는 CircleCrop()을 직접 사용할 수 있습니다.
Glide.with(fragment)
.load(url)
.circleCrop()
.into(imageView);
내장형
- 중앙 작물
- 중심 맞춤
- 서클 크롭
이 답변에 따르면 두 언어 모두에서 가장 쉬운 방법은 다음과 같습니다.
코틀린:
Glide.with(context).load(uri).apply(RequestOptions().circleCrop()).into(imageView)
Java:
Glide.with(context).load(uri).apply(new RequestOptions().circleCrop()).into(imageView)
이 기능은 Glide 4.X.X에서 작동합니다.
이 변환을 사용하면 잘 작동합니다.
public class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int borderColor = ColorUtils.setAlphaComponent(Color.WHITE, 0xFF);
int borderRadius = 3;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
// TODO this could be acquired from the pool too
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
if (squared != source) {
source.recycle();
}
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(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);
// Prepare the background
Paint paintBg = new Paint();
paintBg.setColor(borderColor);
paintBg.setAntiAlias(true);
// Draw the background circle
canvas.drawCircle(r, r, r, paintBg);
// Draw the image smaller than the background so a little border will be seen
canvas.drawCircle(r, r, r - borderRadius, paint);
squared.recycle();
return result;
}
@Override
public String getId() {
return getClass().getName();
}}
글라이드 4.x.x의 경우
사용하다
Glide
.with(context)
.load(uri)
.apply(
RequestOptions()
.circleCrop())
.into(imageView)
원형 사진:CircleImageView/CircularImageView/RoundedImageView는 TransitionDrawable(.crossFade() with .thumbnail() 또는 .placeholder() 및 애니메이션 GIF에 문제가 있는 것으로 알려져 있습니다. 비트맵 변환(.circleCrop()은 v4) 또는 .donatate()를 사용하여 문제를 해결합니다.
Roman Samoylenko의 대답은 기능이 변경된 것을 제외하고는 정확했습니다.정답은.
Glide.with(context)
.load(yourImage)
.apply(RequestOptions.circleCropTransform())
.into(imageView);
저는 색상이 이미지 위에 그라데이션을 설정하거나 추가하려는 이미지 위에 테두리를 추가할 수 있는 쉽고 간단한 솔루션을 찾았습니다.
단계:
- 하나의 프레임 레이아웃을 만들고 두 개의 이미지를 추가합니다.필요에 따라 크기를 설정할 수 있습니다.
imgPlaceHolder
설정할 흰색 이미지 또는 색상이 하나 필요합니다.
<ImageView
android:id="@+id/imgPlaceHolder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:src="@drawable/white_bg"/>
<ImageView
android:id="@+id/imgPic"
android:layout_width="190dp"
android:layout_height="190dp"
android:layout_gravity="center"
android:src="@drawable/image01"/>
</FrameLayout>
이 코드를 xml 파일에 배치한 후 아래 줄을 java 파일에 넣습니다.
Glide.with(this).load(R.drawable.image01).asBitmap().centerCrop().into(new BitmapImageViewTarget(imgPic) { @Override protected void setResource(Bitmap resource) { RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), resource); circularBitmapDrawable.setCircular(true); imageView.setImageDrawable(circularBitmapDrawable); } }); Glide.with(this).load(R.drawable.white_bg).asBitmap().centerCrop().into(new BitmapImageViewTarget(imgPlaceHolder) { @Override protected void setResource(Bitmap resource) { RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), resource); circularBitmapDrawable.setCircular(true); imgTemp2.setImageDrawable(circularBitmapDrawable); } });
이렇게 하면 추가 패딩과 여백 없이 이미지 보기의 테두리가 만들어집니다.
참고: 흰색 이미지는 테두리에 필수입니다. 그렇지 않으면 작동하지 않습니다.
해피 코딩 :)
글라이드 라이브러리를 사용하면 다음 코드를 사용할 수 있습니다.
Glide.with(context)
.load(imageUrl)
.asBitmap()
.placeholder(R.drawable.user_pic)
.centerCrop()
.into(new BitmapImageViewTarget(img_profPic) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCircular(true);
img_profPic.setImageDrawable(circularBitmapDrawable);
}
});
원 크롭 + 자리 표시자 + 크로스페이드
Glide.with(context!!)
.load(randomImage)
.apply(RequestOptions.bitmapTransform(CircleCrop()).error(R.drawable.nyancat_animated))
.transition(DrawableTransitionOptions()
.crossFade())
.into(picture)
이 구현이 단검 힐트를 기반으로 한다는 점이 주목할 만하지만, 이 구현을 사용할 수도 있습니다.
공급자 구현
@Module
@Named("circleCrop")
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
@Provides
fun provideGlideInstance(
@ApplicationContext context: Context
) = Glide.with(context).setDefaultRequestOptions(
RequestOptions()
.placeholder(R.drawable.logo)
.error(R.drawable.logo)
.apply(RequestOptions().circleCropTransform())
.diskCacheStrategy(DiskCacheStrategy.DATA)
)
}
종속성 주입
@Inject
@Named("circleCrop")
lateinit var glide: RequestManager
이미지 로드
glide.load(hotel.image).into(imgItemSearch)
아까 찾다가 아주 쉬운 방법으로 만들었는데 마음에 드셨으면 좋겠습니다.
//crete this method into your Utils class and call this method wherever you want to use.
//you can set these placeHolder() and error() image static as well. I made it as comment inside this method, then no need to use [placeHolderUrl and errorImageUrl] parameters. remove it from this method.
public static void loadImage(final Activity context, ImageView imageView, String url, int placeHolderUrl, int errorImageUrl) {
if (context == null || context.isDestroyed()) return;
//placeHolderUrl=R.drawable.ic_user;
//errorImageUrl=R.drawable.ic_error;
Glide.with(context) //passing context
.load(getFullUrl(url)) //passing your url to load image.
.placeholder(placeHolderUrl) //this would be your default image (like default profile or logo etc). it would be loaded at initial time and it will replace with your loaded image once glide successfully load image using url.
.error(errorImageUrl)//in case of any glide exception or not able to download then this image will be appear . if you won't mention this error() then nothing to worry placeHolder image would be remain as it is.
.diskCacheStrategy(DiskCacheStrategy.ALL) //using to load into cache then second time it will load fast.
.transform(new CircleTransform(context))//this CircleTransform class help to crop an image as circle.
.animate(R.anim.fade_in) // when image (url) will be loaded by glide then this face in animation help to replace url image in the place of placeHolder (default) image.
.fitCenter()//this method help to fit image into center of your ImageView
.into(imageView); //pass imageView reference to appear the image.
}
원 변환.java
public class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
if(context==null)
return;
}
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);
if (result == null) {
result = Bitmap.createBitmap(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
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
@Override
public String getId() {
return getClass().getName();
}
}
애니메이션의 페이드에 대한 fade_in.xml.
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--THIS ANIMATION IS USING FOR FADE IN -->
<alpha
android:duration="800"
android:fromAlpha="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1.0" />
마지막으로 이 방법을 부릅니다.
Utils.loadImage(YourClassName.this,mImageView,url,R.drawable.ic_user,R.drawable.ic_error);
cornerType 열거형 입력이 있는 RoundCornersTransformation 생성자를 호출하기만 하면 됩니다.다음과 같이:
Glide.with(context)
.load(bizList.get(position).getCover())
.bitmapTransform(new RoundedCornersTransformation(context,20,0, RoundedCornersTransformation.CornerType.TOP))
.into(holder.bizCellCoverImg);
그러나 먼저 프로젝트에 글라이드 변환을 추가해야 합니다.
다음은 글라이드에서 비트맵을 원으로 자를 수 있는 더 모듈화되고 깨끗한 방법입니다.
- 확장하여 사용자 지정 변환 생성
BitmapTransformation
그런 다음 오버라이드transform
다음과 같은 방법:
글라이드 4.x.x의 경우
public class CircularTransformation extends BitmapTransformation {
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(null, toTransform);
circularBitmapDrawable.setCircular(true);
Bitmap bitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
circularBitmapDrawable.setBounds(0, 0, outWidth, outHeight);
circularBitmapDrawable.draw(canvas);
return bitmap;
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {}
}
글라이드 3.x.x의 경우
public class CircularTransformation extends BitmapTransformation {
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(null, toTransform);
circularBitmapDrawable.setCircular(true);
Bitmap bitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
circularBitmapDrawable.setBounds(0, 0, outWidth, outHeight);
circularBitmapDrawable.draw(canvas);
return bitmap;
}
@Override
public String getId() {
// Return some id that uniquely identifies your transformation.
return "CircularTransformation";
}
}
- 그런 다음 필요한 곳에 Glide Builder로 설정합니다.
Glide.with(yourActivity)
.load(yourUrl)
.asBitmap()
.transform(new CircularTransformation())
.into(yourView);
이것이 도움이 되길 바랍니다 :)
private void setContactImage(@NonNull ViewHolder holder, ClsContactDetails clsContactDetails) {
Glide.with(context).load(clsContactDetails.getPic())
.apply(new RequestOptions().centerCrop().circleCrop().placeholder(R.mipmap.ic_launcher)).into(holder.ivPersonImage);
}
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
RequestOptions options=new RequestOptions();
options.centerCrop().placeholder(getResources().getDrawable(R.drawable.user_placeholder));
Glide.with(this)
.load(preferenceSingleTon.getImage())
.apply(options)
.into(ProfileImage);
글라이드 버전 4.6.1
Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);
이 경우 그림자를 추가해야 하며 imageView 표고가 작동하지 않습니다.
구현 "com.github".범프텍.글라이드:글라이드:4.10.0"
XML
<FrameLayout
android:id="@+id/fl_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="10dp"
android:background="@drawable/card_circle_background"
android:elevation="8dp">
<ImageView
android:id="@+id/iv_item_employee"
android:layout_width="60dp"
android:layout_height="60dp"
tools:background="@color/colorPrimary" />
</FrameLayout>
도형 그리기 가능
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/white"/>
</shape>
글라이드 구성
Glide.with(this)
.asBitmap()
.load(item.image)
.apply(RequestOptions.circleCropTransform())
.into(iv_item_employee)
내경는에;.apply(RequestOptions.circleCropTransform())
(4.11)이 작동하지 않습니다.왜냐하면 저는 이미지 버튼으로 시도하고 있었기 때문입니다.(클릭 가능한) ImageView로 변경하면 작동하고 원하는 대로 표시됩니다.
해당 유형의 이미지를 표시하려면 Circular Image View(원형 이미지 보기)를 사용해야 합니다.
이미지를 로드하는 데 사용되는 Glide 라이브러리를 사용하고 있습니다.
프로젝트에서 하나의 클래스 파일을 만들고 이미지 보기에 로드...원하는 결과를 얻을 수 있습니다...
코드를 따라 시도...
XML
<com.yourpackage.CircularImageView
android:id="@+id/imageview"
android:layout_width="96dp"
android:layout_height="96dp"
app:border="true"
app:border_width="3dp"
app:border_color="@color/white"
android:src="@drawable/image" />
Circular ImageView.java
public class CircularImageView extends ImageView {
private int borderWidth;
private int canvasSize;
private Bitmap image;
private Paint paint;
private Paint paintBorder;
public CircularImageView(final Context context) {
this(context, null);
}
public CircularImageView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.circularImageViewStyle);
}
public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// init paint
paint = new Paint();
paint.setAntiAlias(true);
paintBorder = new Paint();
paintBorder.setAntiAlias(true);
// load the styled attributes and set their properties
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0);
if(attributes.getBoolean(R.styleable.CircularImageView_border, true)) {
int defaultBorderSize = (int) (4 * getContext().getResources().getDisplayMetrics().density + 0.5f);
setBorderWidth(attributes.getDimensionPixelOffset(R.styleable.CircularImageView_border_width, defaultBorderSize));
setBorderColor(attributes.getColor(R.styleable.CircularImageView_border_color, Color.WHITE));
}
if(attributes.getBoolean(R.styleable.CircularImageView_shadow, false))
addShadow();
}
public void setBorderWidth(int borderWidth) {
this.borderWidth = borderWidth;
this.requestLayout();
this.invalidate();
}
public void setBorderColor(int borderColor) {
if (paintBorder != null)
paintBorder.setColor(borderColor);
this.invalidate();
}
public void addShadow() {
setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);
}
@Override
public void onDraw(Canvas canvas) {
// load the bitmap
image = drawableToBitmap(getDrawable());
// init shader
if (image != null) {
canvasSize = canvas.getWidth();
if(canvas.getHeight()<canvasSize)
canvasSize = canvas.getHeight();
BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvasSize, canvasSize, false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
// circleCenter is the x or y of the view's center
// radius is the radius in pixels of the cirle to be drawn
// paint contains the shader that will texture the shape
int circleCenter = (canvasSize - (borderWidth * 2)) / 2;
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder);
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = measureWidth(widthMeasureSpec);
int height = measureHeight(heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
// The parent has determined an exact size for the child.
result = specSize;
} else if (specMode == MeasureSpec.AT_MOST) {
// The child can be as large as it wants up to the specified size.
result = specSize;
} else {
// The parent has not imposed any constraint on the child.
result = canvasSize;
}
return result;
}
private int measureHeight(int measureSpecHeight) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpecHeight);
int specSize = MeasureSpec.getSize(measureSpecHeight);
if (specMode == MeasureSpec.EXACTLY) {
// We were told how big to be
result = specSize;
} else if (specMode == MeasureSpec.AT_MOST) {
// The child can be as large as it wants up to the specified size.
result = specSize;
} else {
// Measure the text (beware: ascent is a negative number)
result = canvasSize;
}
return (result + 2);
}
public Bitmap drawableToBitmap(Drawable drawable) {
if (drawable == null) {
return null;
} else if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
참고:
사용할 수 있습니다.
CircularImageView imgIcon = (CircularImageView)findViewById(R.id.imageview);
또는
ImageView imgIcon = (ImageView)findViewById(R.id.imageview);
당신의 다른 도서관에는 영향을 미치지 않을 것입니다.이미지나 다른 것을 다운로드하기 위해 코드를 변경할 필요가 없습니다.XML을 사용하여 간단히 정의할 수도 있습니다.
Glide.with(MainActivity.this)
.load(personPhoto)
.transition(withCrossFade(500))
.apply(RequestOptions.circleCropTransform())
.thumbnail(0.5f)
.into(imageView);
자리 표시자(), 전환() 등과 같은 기능을 너무 많이 붙이지 말고 이 코드처럼 간단하게 만들면 됩니다.
Glide.with(mContext)
.load(datas.getUser_img())
.centerCrop()
.into(ivAvator);
이 라이브러리 구현체 'de.hdodenhof:circle image view:3.1.0'을 사용하여 쉽게 해결할 수 있습니다.
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/profile_image"
android:layout_width="96dp"
android:layout_height="96dp"
android:src="@drawable/profile"
app:civ_border_width="2dp"
app:civ_border_color="#FF000000"/>
Glide.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.animate(R.anim.fade_in)
.into(YourImageView);
언급URL : https://stackoverflow.com/questions/25278821/how-to-round-an-image-with-glide-library
'source' 카테고리의 다른 글
sqlAlchemy에서 인터페이스 테이블을 생성하는 방법(다대다 관계) (0) | 2023.08.10 |
---|---|
데이터베이스에 json 개체를 추가하는 중 (0) | 2023.08.10 |
텍스트 편집에 대한 입력 유형을 프로그래밍 방식으로 설정하시겠습니까? (0) | 2023.08.10 |
앱 아이콘 강조 표시를 비활성화하는 방법은 무엇입니까? (0) | 2023.08.10 |
장고 쉘에서 모듈을 다시 로드하는 방법은 무엇입니까? (0) | 2023.08.10 |