如何在 Android 中创建圆形 ImageView? [复制]
Posted
技术标签:
【中文标题】如何在 Android 中创建圆形 ImageView? [复制]【英文标题】:How to create a circular ImageView in Android? [duplicate] 【发布时间】:2013-04-18 23:17:49 【问题描述】:如何在 android 中创建一个圆形的ImageView
?
我已经尝试了以下代码,但它不能正常工作。
代码:
Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
BitmapShader shader = new BitmapShader (bitmap, TileMode.CLAMP, TileMode.CLAMP);
Paint paint = new Paint();
paint.setShader(shader);
Canvas c = new Canvas(circleBitmap);
c.drawCircle(bitmap.getWidth()/2, bitmap.getHeight()/2, bitmap.getWidth()/2, paint);
imageView.setImageBitmap(circleBitmap);
圆圈内的图片:
我该怎么做?
【问题讨论】:
此代码可能对您有所帮助。根据您的需要进行编辑。 ***.com/a/3292810/2021499 @IceMAN 我不想做圆角我需要在圆圈内设置图像 您的帖子标题为 rounded!! 只需使用 CircularImageView 库“github.com/lopspower/CircularImageView”,它在我的情况下就像一个魅力 现在首选的解决方案应该是 RoundedBitmapDrawable;它既好又简单,是官方支持库的一部分(自 v4 支持库修订版 21 起)。 【参考方案1】:我也需要一个圆角的ImageView,我用了下面的代码,你可以做相应的修改:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class RoundedImageView extends ImageView
public RoundedImageView(Context context)
super(context);
public RoundedImageView(Context context, AttributeSet attrs)
super(context, attrs);
public RoundedImageView(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
@Override
protected void onDraw(Canvas canvas)
Drawable drawable = getDrawable();
if (drawable == null)
return;
if (getWidth() == 0 || getHeight() == 0)
return;
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
int w = getWidth();
@SuppressWarnings("unused")
int h = getHeight();
Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
canvas.drawBitmap(roundBitmap, 0, 0, null);
public static Bitmap getCroppedBitmap(Bitmap bmp, int radius)
Bitmap sbmp;
if (bmp.getWidth() != radius || bmp.getHeight() != radius)
float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
float factor = smallest / radius;
sbmp = Bitmap.createScaledBitmap(bmp,
(int) (bmp.getWidth() / factor),
(int) (bmp.getHeight() / factor), false);
else
sbmp = bmp;
Bitmap output = Bitmap.createBitmap(radius, radius, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final String color = "#BAB399";
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, radius, radius);
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor(color));
canvas.drawCircle(radius / 2 + 0.7f, radius / 2 + 0.7f,
radius / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
【讨论】:
这个视图很棒,但它会扭曲非方形图像,我在这里解决了这个问题:gist.github.com/melanke/7158342 这可能会因为 onDraw() 执行多次而导致 OOM。当在选项卡中创建一个大的圆形图像时说 200*200(dip)。所以使用图像加载器库来加载一个圆形的图像。请看***.com/questions/2459916/… 我注意到谷歌有 "RoundedBitmapDrawableFactory" 。我认为它可能很有用。 只是我还是代码混合了半径和直径?所以,有些地方需要半径(drawCircle),但是在设置位图尺寸时,应该使用直径,而不是半径。 我可以建议:位图 roundBitmap = getCroppedBitmap(bitmap, w以上是关于如何在 Android 中创建圆形 ImageView? [复制]的主要内容,如果未能解决你的问题,请参考以下文章