それで、誰かがGlideで丸みを帯びたコーナーでイメージを表示する方法を知っていますか?私はGlideで画像をロードしていますが、このライブラリに丸められたパラメータを渡す方法がわかりません。
次のような表示画像が必要です。
グライドV4:
Glide.with(context)
.load(url)
.apply(RequestOptions.circleCropTransform())
.into(imageView);
グライドV3:
Glideを使った円形の画像には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);
}
});
これ の投稿をチェックしてください。グライドvsピカソ ...
編集:リンクされた投稿は、ライブラリに大きな違いを示すことはありません。グライドは自動的にリサイクルを行います。詳しくは 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();
}
}
最も簡単な方法(Glide 4.x.xが必要)
Glide.with(context).load(uri).apply(RequestOptions().circleCrop()).into(imageView)
この方法を試してください
Glide.with(this)
.load(R.drawable.thumbnail)
.bitmapTransform(new CropCircleTransformation(this))
.into(mProfile);
<ImageView
Android:id="@+id/img_profile"
Android:layout_width="76dp"
Android:layout_height="76dp"
Android:background="@drawable/all_circle_white_bg"
Android:padding="1dp"/>
<?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/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" />
他の解決策は私にはうまくいきませんでした。私はそれらすべてが重大な欠点を持っていることがわかりました:
これに遭遇した後、私は 丸みを帯びた角と円 についてのFrescoライブラリのページを見つけたことが本当に興味深いです。ステートメント
android上で角を丸めるための本当に良い解決策はありません、そして1つは前述のトレードオフの中から選択しなければなりません
現時点で私達がまだ本当の解決策を持っていないことは信じられないことです。私は上記のリンクに基づいて別の解決策があります。このアプローチの欠点は、背景が単色であると想定されることです(角は本当に透明ではありません)。あなたはこのようにそれを使うでしょう:
<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;
}
}
この変換を使用してください、それはうまくいきます。
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();
}}
私は色がimageの上にグラデーションを設定するか、追加したいimageviewの上にボーダーを加えるための1つの簡単で単純な解決策を見つけました。
手順:
imgPlaceHolder
には、設定したい白い画像または色が1つ必要です。 <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);
}
});
これにより、余計な余白や余白がなくなり、imageviewの境界が簡単になります。
NOTE:白のイメージはボーダーのために強制的ですそれ以外の場合は動作しません。
ハッピーコディング:)
私は以前にそれを探していました、そして私はそれを非常に簡単な方法でそれを作った、私はあなたがこれを望むことを望みます。
//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_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);
これは、Glideでビットマップを丸く切り取るための、よりモジュール化された、よりクリーンな方法です。
BitmapTransformation
を拡張してカスタム変換を作成し、次のようにtransform
メソッドをオーバーライドします。Glide 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) {}
}
Glide 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.with(yourActivity)
.load(yourUrl)
.asBitmap()
.transform(new CircularTransformation())
.into(yourView);
お役に立てれば :)
グライドライブラリを使用すると、このコードを使用することができます。
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 4.x.xの場合
つかいます
Glide
.with(context)
.load(uri)
.apply(
RequestOptions()
.circleCrop())
.into(imageView)
docより
丸型画像:CircleImageView/CircularImageView/RoundedImageViewには、TransitionDrawable(.crossFade()または.thumbnail()または.placeholder())と 問題 があることがわかっています。アニメーションGIFの場合は、 BitmapTransformation (.circleCrop()がv4で使用可能になります)または.dontAnimate()を使用して問題を解決します。
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);
}
単純にRoundedCornersTransformationコンストラクタを呼び出すことができます。このコンストラクタはcornerType列挙型入力を持ちます。このような:
Glide.with(context)
.load(bizList.get(position).getCover())
.bitmapTransform(new RoundedCornersTransformation(context,20,0, RoundedCornersTransformation.CornerType.TOP))
.into(holder.bizCellCoverImg);
しかし、最初に グライドトランスフォーメーション をプロジェクトに追加する必要があります。
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);
Glide V4ではCircleCrop()を直接使うことができます
Glide.with(fragment)
.load(url)
.CircleCrop()
.into(imageView);
作り付けのタイプ
そのタイプの画像を表示するには、 CircularImageView を使用する必要があります。
画像を読み込むために使用していた Glideライブラリ を使用しています。
プロジェクトに1つの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を使っても定義できます..