RoundedBitmapDrawable 사용 방법
누구든지 사용할 수 RoundedBitmapDrawable
있습니까? 내가 틀렸다면 정정하십시오.하지만 내 이해에 따르면 일반 직사각형 이미지에서 원형 이미지를 만듭니다.
지금까지 시도한 것은 이것입니다
RoundedBitmapDrawable.createRoundedBitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), iconResource))
내가 달성하려고 한 것 : 모든 이미지를 원형 이미지로 변환하고 ImageView를 사용하여 표시하십시오.
내가 말한 모든 것이 말도 안되는 경우를 대비하여. 새로운 프레임 워크로 수행하는 것이 가능합니까 (또는 더 간단합니까)? (Android L 또는 새로운 지원 라이브러리)
모서리 반경을 설정해야합니다.
Resources res = getResources();
Bitmap src = BitmapFactory.decodeResource(res, iconResource);
RoundedBitmapDrawable dr =
RoundedBitmapDrawableFactory.create(res, src);
dr.setCornerRadius(Math.max(src.getWidth(), src.getHeight()) / 2.0f);
imageView.setImageDrawable(dr);
답변이 늦어 질 수 있지만 다른 사람들에게 도움이 되길 바랍니다.
이미지의 너비와 높이가 같으면 setCircular를 true로 설정하여 다음과 같이 둥근 비트 맵을 얻을 수 있습니다.
RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(),your_bitmap);
drawable.setCircular(true);
나는 또한 효율성을 위해 둥근 이미지보기를 찾고 있습니다. 모든 타사 라이브러리를 검색했습니다. 더 많은 메모리를 소비하는 목록에서 지루한 작업 인 새 비트 맵을 만들고 있음을 발견했습니다.
참조 도서관 :
- http://ruibm.com/2009/06/16/rounded-corner-bitmaps-on-android/
- https://github.com/vinc3m1/RoundedImageView
- https://github.com/lopspower/CircularImageView
이 도서관에서 내가 사용한
Romain Guy의 원래 예제를 기반으로 둥근 모서리 (및 타원형 또는 원)를 지원하는 빠른 ImageView (및 Drawable)
- 원본 비트 맵의 복사본을 만들지 않습니다.
- 하드웨어 가속 및 앤티 앨리어싱되지 않은 clipPath를 사용하지 않습니다.
- setXfermode를 사용하여 비트 맵을 자르고 캔버스에 두 번 그립니다.
RoundedBitmapDrawables https://gist.github.com/lawloretienne/a91fb0ce40f083073d4b8939281b3ecb 를 만들기 위해 유틸리티 클래스를 만들었습니다.
원과 둥근 사각형에 적용됩니다.
public class RoundedBitmapDrawableUtility {
public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap, int cornerRadius){
return getRoundedSquareBitmapDrawable(context, originalBitmap, cornerRadius, -1, -1);
}
public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap, int cornerRadius, int borderWidth, int borderColor){
int originalBitmapWidth = originalBitmap.getWidth();
int originalBitmapHeight = originalBitmap.getHeight();
if(borderWidth != -1 && borderColor != -1){
Canvas canvas = new Canvas(originalBitmap);
canvas.drawBitmap(originalBitmap, 0, 0, null);
Paint borderPaint = new Paint();
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setStrokeWidth(borderWidth);
borderPaint.setAntiAlias(true);
borderPaint.setColor(borderColor);
int roundedRectDelta = (borderWidth/3);
RectF rectF = new RectF(0 + roundedRectDelta, 0 + roundedRectDelta, originalBitmapWidth - roundedRectDelta, originalBitmapHeight - roundedRectDelta);
canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, borderPaint);
}
RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
roundedImageBitmapDrawable.setCornerRadius(cornerRadius);
roundedImageBitmapDrawable.setAntiAlias(true);
return roundedImageBitmapDrawable;
}
public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap){
return getCircleBitmapDrawable(context, originalBitmap, -1, -1);
}
public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap, int borderWidth, int borderColor){
if(borderWidth != -1 && borderColor != -1) {
Canvas canvas = new Canvas(originalBitmap);
canvas.drawBitmap(originalBitmap, 0, 0, null);
Paint borderPaint = new Paint();
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setStrokeWidth(borderWidth);
borderPaint.setAntiAlias(true);
borderPaint.setColor(borderColor);
int circleDelta = (borderWidth / 2) - DisplayUtility.dp2px(context, 1);
int radius = (canvas.getWidth() / 2) - circleDelta;
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, radius, borderPaint);
}
RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
roundedImageBitmapDrawable.setCircular(true);
roundedImageBitmapDrawable.setAntiAlias(true);
return roundedImageBitmapDrawable;
}
}
전체 코드 :
ImageView img= (ImageView) findViewById(R.id.yourimageid);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.yourpictureresource);
RoundedBitmapDrawable rnd = (RoundedBitmapDrawable) RoundedBitmapDrawableFactory.create(getResources(), bitmap);
rnd.setCircular(true);
img.setImageDrawable(rnd);
다른 옵션을 제안하고 싶습니다.
이 방법을 사용하여 필요에 따라 확장하고이 예외를 피할 수 있습니다.
public static Bitmap scaleBitmapAndKeepRation(Bitmap TargetBmp, int reqHeightInPixels, int reqWidthInPixels) {
if (TargetBmp != null) {
if (TargetBmp.getWidth() >= TargetBmp.getHeight()) {
TargetBmp = Bitmap.createBitmap(
TargetBmp,
TargetBmp.getWidth() / 2 - TargetBmp.getHeight() / 2,
0,
TargetBmp.getHeight(),
TargetBmp.getHeight()
);
} else {
TargetBmp = Bitmap.createBitmap(
TargetBmp,
0,
TargetBmp.getHeight() / 2 - TargetBmp.getWidth() / 2,
TargetBmp.getWidth(),
TargetBmp.getWidth()
);
}
if (TargetBmp != null) {
try {
Matrix m = new Matrix();
m.setRectToRect(new RectF(0, 0, TargetBmp.getWidth(), TargetBmp.getHeight()), new RectF(0, 0, reqWidthInPixels, reqHeightInPixels), Matrix.ScaleToFit.FILL);
Bitmap scaledBitmap = Bitmap.createBitmap(TargetBmp, 0, 0, TargetBmp.getWidth(), TargetBmp.getHeight(), m, true);
return scaledBitmap;
} catch (Exception e) {
Log.e("Utils", e.toString());
return null;
}
}
return null;
} else
return null;
}
RoundedBitmapDrawable이 정사각형이 아닌 이미지에서 작동하는 현재 방식은 그다지 좋지 않습니다. 콘텐츠가 늘어납니다.
여기에 작성한대로 대안을 사용하는 것이 좋습니다 . 새 비트 맵을 만들지 않고 원형의 가운데 잘린 imageView를 갖는 방법은 무엇입니까?
참조 URL : https://stackoverflow.com/questions/24878740/how-to-use-roundedbitmapdrawable
'Programing' 카테고리의 다른 글
ASP.NET Web API ActionFilter 예제 (0) | 2021.01.05 |
---|---|
Virtual Box UUID {07c3…}이 미디어 레지스트리에 저장된 {2c1b…} 값과 일치하지 않습니다. (0) | 2021.01.05 |
장고 필터에서 AND를 어떻게 사용합니까? (0) | 2021.01.05 |
새로운 X86_64 프로세서 레지스터의 이름은 무엇입니까? (0) | 2021.01.05 |
JavaScript를 사용하여 상대 경로를 절대 경로로 변환 (0) | 2021.01.05 |