글라이드 라이브러리로 이미지를 반올림하는 방법은 무엇입니까?


198

그렇다면 글라이드로 모서리가 둥근 이미지를 표시하는 방법을 아는 사람이 있습니까? 글라이드로 이미지를로드하고 있지만 둥근 매개 변수를이 라이브러리에 전달하는 방법을 모르겠습니다.

다음 예제와 같이 이미지를 표시해야합니다.

여기에 이미지 설명을 입력하십시오


2
내가 사용이 github.com/hdodenhof/CircleImageView을 ronded 이미지보기를
MilapTank

1
CircleImageView와 함께 Glide lib를 사용하는 방법을 알고 있지만 Glide lib로만 가능한 방법을 검색합니다. 이 작업을 수행하기 위해 Glide lib에 어떤 방법이 있습니까?
mr.boyfox

답변:


491

글라이드 V4 :

    Glide.with(context)
        .load(url)
        .circleCrop()
        .into(imageView);

글라이드 V3 :

RoundedBitmapDrawable글라이드로 원형 이미지에 사용할 수 있습니다 . 사용자 정의 ImageView가 필요하지 않습니다.

 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);
        }
    });

6
그러나 이것은 테두리를 만들지 않습니다.
ZakTaccardi

1
아니오, 당신은 할 수 없습니다. 글라이드 드로어 블은 BitmapDrawables가 아닙니다. 그것들은 자리 표시 자에서 실제 이미지로 교차하는 전환 인출 및 활공 인출입니다. RoundedBitmapDrawable이이를 처리 할 수 ​​없습니다.
Greg Ennis

7
drawable shape 타원형으로 배경을 설정하십시오. 테두리를 만들기 위해 imageview에 패딩을 제공하십시오.
Lalit Jadav

2
문제가 있다면 Roman Samoylenko의 다음 솔루션을 확인하십시오.
Pabel

1
대신 .centerCrop()당신은 아마 의미.circleCrop()
Thanasis Kapelonis

66

글을 확인하십시오 . glide vs picasso ...
편집 : 연결된 게시물이 라이브러리의 중요한 차이점을 불러 일으키지 않습니다. 글라이드는 재활용을 자동으로 수행합니다. 자세한 내용은 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();
    }
} 

흥미로운 것 같습니다. API 21의 개요와 잘 작동합니까?
Teovald

흠, 나는 이것을 사용할 수 있습니다. 그래도 단순히 사용자 정의보기를 사용하려고합니다. 두 번째 비트 맵을 만들 필요는 없습니다 :). 또한 비트 맵을 얻으려면 항상 비트 맵 풀을 사용해야합니다. :)
Teovald

public String getId()코드에 표시된 방식 을 사용 하면 모든 이미지에 대해 동일한 ID를 반환하므로 글라이드가 변환하지 않고 오래된 둥근 이미지를 설정하고 올바른 이미지를 설정하게 될 수 있습니다! 글라이드가 어떻게 작동하는지 모르지만 이미지 변환을 캐시하는 것처럼 보입니다 (내가 생각하는 단단한 계산을 피하기 위해). 그리고 id는 변환 된 이미지의 id로 사용됩니다. 이미지에 URL을 생성자에 추가하고 다음과 같은 결과 ID를 반환하는 메소드를 언급했습니다.this.id = String.format("%s:%s",this.getClass().getSimpleName(),id);
Stan

2
변환 ID에 대한 Stan의 유일한 요구 사항은 모든 변환 중에서 고유하므로 여기에서 사용법이 올바른 것입니다. 캐시 키에는 소스 ID와 변환 ID가 모두 포함되므로 변환 ID는 대체가 아니라 믹스 인입니다. github.com/bumptech/glide/wiki/…를
Sam Judd

4
자리 표시 자에 변환을 적용하는 방법이 있습니까?
Sinigami

46

가장 쉬운 방법 (Glide 4.xx 필요)

Glide.with(context).load(uri).apply(RequestOptions().circleCrop()).into(imageView)

이것은 컴파일조차하지 않습니다 ... RequestOptions ()?
Rafael Lima

3
@RafaelLima Kotlin으로 작성되었습니다.
Roman Samoilenko

1
.apply()다음에옵니다 .load().
Johnny Five

RequestOptions ()가 아닌 RequestOptions.circleCropTransform ()입니다.
Smiles

적용 함수를 보면 Glide.with (context) .load (uri) .apply (circleCrop ()). into (imageView)를 작성해야합니다.
Jaspal

25

이 방법으로 시도

암호

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_circle_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>

9

매우 간단합니다. Glide 라이브러리는 발리 Google 라이브러리의 훌륭한 라이브러리 및 에세이 기반입니다.

둥근 이미지보기에이 라이브러리 사용

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" />

2
이전 답변 의견에서 언급 했듯이이 방법은 잘 작동하지 않습니다. 적어도 'de.hdodenhof : circleimageview : 1.2.2'+ 'com.github.bumptech.glide : glide : 3.5.2'의 경우 확인하고 두 번 확인했습니다. 또한 글라이드 3.4. + 및 circleimageview 1.2.1과 동일한 문제
Stan

.centerCrop ()의 경우 +1 DiamondImageView plus .asBitmap ()으로 나를 위해 일했습니다 .
felippe

1
허용되지 않는 글라이드에서 .dontAnimate ()를 호출해야합니다.
Greg Ennis 1


9

다른 솔루션은 저에게 효과적이지 않았습니다. 나는 그들 모두 중요한 결점을 발견했다.

  • 글라이드 변환을 사용하는 솔루션은 자리 표시 자와 함께 작동하지 않습니다
  • 둥근 이미지 뷰를 사용하는 솔루션은 애니메이션에서 작동하지 않습니다 (예 : 크로스 페이드).
  • 자식을 클립하는 부모의 일반적인 방법을 사용하는 솔루션 (예 : 여기 에서 허용되는 답변 )은 글라이드에서 잘 작동하지 않습니다.

이것으로 혼란스럽게 한 후 둥근 모서리와 원대한 Fresco 라이브러리 페이지를 발견했으며 기본적으로 동일한 제한 사항을 나열하고 진술로 결론을 내린다 는 것이 정말 흥미 롭습니다 .

안드로이드의 모서리를 둥글게하는 좋은 해결책은 없으며 위에서 언급 한 트레이드 오프 중에서 선택해야합니다.

현재로서는 아직 실제 솔루션이 없습니다. 위의 링크를 기반으로 한 대체 솔루션이 있습니다. 이 방법의 단점은 배경이 단색이라고 가정한다는 것입니다 (모서리는 실제로 투명하지 않습니다). 다음과 같이 사용하십시오.

<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;
    }
}

6

이제 글라이드 V4에서는 CircleCrop ()을 직접 사용할 수 있습니다

Glide.with(fragment)
  .load(url)
  .circleCrop()
  .into(imageView);

내장 타입

  • CenterCrop
  • FitCenter
  • 자르기

5

이 변환을 사용하면 제대로 작동합니다.

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();
}} 

5

대한 글라이드 4.XX

사용하다

Glide
  .with(context)
  .load(uri)
  .apply(
      RequestOptions()
        .circleCrop())
  .into(imageView)

에서 의사 가 있음을 밝혔다

라운드 사진 : CircleImageView / CircularImageView / RoundedImageView는 것으로 알려져있다 문제를 용도, (.thumbnail와 .crossFade () () 또는 .placeholder ()) TransitionDrawable 및 애니메이션 GIF로 BitmapTransformation을 (V4에서 사용할 수 .circleCrop을 ()) 또는 문제를 해결하기 위해 .dontAnimate ()


4

답변 에 따르면 두 언어 모두에서 가장 쉬운 방법은 다음과 같습니다.

코 틀린 :

Glide.with(context).load(uri).apply(RequestOptions().circleCrop()).into(imageView)

자바:

Glide.with(context).load(uri).apply(new RequestOptions().circleCrop()).into(imageView)

이것은 글라이드 4.XX에서 작동합니다


4

Roman Samoylenko의 답변은 기능이 변경된 것을 제외하고는 정확했습니다. 정답은

Glide.with(context)
                .load(yourImage)
                .apply(RequestOptions.circleCropTransform())
                .into(imageView);

3

색상이 이미지 위에 설정되거나 그라디언트를 추가하려는 imageview 위에 테두리를 추가하는 쉽고 간단한 솔루션을 찾았습니다.

단계 :

  1. 하나의 프레임 레이아웃을 만들고 두 개의 이미지를 추가하십시오. 요구 사항에 따라 크기를 설정할 수 있습니다. 의 경우 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>
  1. 이 코드를 xml file에 배치 한 후 아래 줄을 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);
        }
    });

이렇게하면 추가 패딩과 여백없이 간단하게 이미지 뷰의 경계가 만들어집니다.

노트 : 흰색 이미지는 테두리에 강제적이며 그렇지 않으면 작동하지 않습니다.

해피 코딩 :)


3

글라이드 라이브러리를 사용하면 다음 코드를 사용할 수 있습니다.

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);
        }
    });

글라이드 라이브러리를 통해 둥근 이미지를 만들 수도 있습니다.
priti

2

나는 그것을 더 일찍 찾고 있었고 가장 쉬운 방법으로 만들었습니다.

 //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.
    } 

CircleTransform.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를위한 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);

2

cornerType 열거 형 입력이있는 RoundedCornersTransformation 생성자를 호출하면됩니다. 이처럼 :

Glide.with(context)
            .load(bizList.get(position).getCover())
            .bitmapTransform(new RoundedCornersTransformation(context,20,0, RoundedCornersTransformation.CornerType.TOP))
            .into(holder.bizCellCoverImg);

먼저 글라이드 변환 을 프로젝트 에 추가 해야합니다.


2

글라이드에서 비트 맵을 원형으로 자르는보다 모듈적이고 깔끔한 방법은 다음과 같습니다.

  1. 확장 BitmapTransformation하고 재정 의하여 사용자 지정 변환 만들기transform 과 같이 메소드 .

글라이드 4.xx

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.xx

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";
    }

}
  1. 그런 다음 필요한 곳에서 글라이드 빌더로 설정하십시오.
Glide.with(yourActivity)
   .load(yourUrl)
   .asBitmap()
   .transform(new CircularTransformation())
   .into(yourView);

도움이 되었기를 바랍니다 :)


2
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);
}

2
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);

2

서클 자르기 + 자리 표시 자 + 크로스 페이드

 Glide.with(context!!)
                    .load(randomImage)
                    .apply(RequestOptions.bitmapTransform(CircleCrop()).error(R.drawable.nyancat_animated))
                    .transition(DrawableTransitionOptions()
                            .crossFade())
                    .into(picture)

여기에 이미지 설명을 입력하십시오


1

글라이드 버전 4.6.1

Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);

1

이 경우 그림자를 추가해야하며 imageView 고도가 작동하지 않습니다

구현 "com.github.bumptech.glide : glide : 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)

0

해당 유형의 이미지를 표시 하려면 CircularImageView 를 사용해야합니다 .

이미지를로드하는 데 사용 된 글라이드 라이브러리 를 사용하고 있습니다.

프로젝트에서 하나의 ClassFile을 만들고 Imageview에로드하면 원하는 결과가 나타납니다 ...

코드를 따르십시오 ...

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" />

CircularImageView.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을 사용하여 간단히 정의 할 수도 있습니다.


3
글라이드 + CircularImageView (및 RoundedImageView)를 시도했지만 자리 표시 자 (이미지가 다운로드되는 동안) 및 모양 애니메이션을 사용하기 시작하면 제대로 작동하지 않습니다. 피카소에는이 문제가 없습니다. 당신은 더 그것에 대해 여기에 빨간색 수 있습니다 github.com/vinc3m1/RoundedImageView/issues/76
zmicer

Glide 호출에서 .asBitmap을 사용하면 정상적으로 작동합니다.
granko87

허용되지 않는 글라이드에서 .dontAnimate ()를 호출해야합니다.
Greg Ennis 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.