我有一个ImageView,我希望使用rounded corners
。
我用这个:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@null"/>
<stroke android:width="1dp"
android:color="#ff000000"/>
<corners android:radius="62px"/>
</shape>
并将此代码设置为我的imageview的背景。
它可以工作,但是我放在ImageView
上的src图像离开了边框,并没有适应新的形状。
我该如何解决这个问题?
答案 0 :(得分:82)
试试这个:
public class CustomImageView extends ImageView {
public static float radius = 18.0f;
public CustomImageView(Context context) {
super(context);
}
public CustomImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
//float radius = 36.0f;
Path clipPath = new Path();
RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
}
}
和
<your.pack.name.CustomImageView
android:id="@+id/selectIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="centerCrop" />
CustomImageView iconImage = (CustomImageView )findViewById(R.id.selectIcon);
iconImage.setImageBitmap(bitmap);
,或者
ImageView iv= new CustomImageView(this);
iv.setImageResource(R.drawable.pic);
答案 1 :(得分:25)
奇怪的是,此处没有人提到Android支持库v4中的RoundedBitmapDrawable。对我来说,这是获得无边框圆角的最简单方法。以下是使用示例:
RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
final float roundPx = (float) bitmap.getWidth() * 0.06f;
roundedBitmapDrawable.setCornerRadius(roundPx);
答案 2 :(得分:18)
使用画布创建一个使您的位图四舍五入的函数。
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
了解更多信息:&gt; here
答案 3 :(得分:9)
接受的答案使用路径剪辑,但它不支持抗锯齿。请参阅Romain Guy对其帖子的评论。 &#34;路径裁剪不支持抗锯齿,你会得到锯齿状的边缘。&#34;
http://www.curious-creature.com/2012/12/11/android-recipe-1-image-with-rounded-corners/
有一个很好的库(vinc3m1的RoundedImageView)在ImageView上支持圆角,但它只支持每个角上相同的半径。所以我做了一个你可以在每个角落设置不同的半径。
它不依赖于路径裁剪,也不依赖于重绘。它只使用canvas.drawPath()
方法绘制一次。所以我终于得到了我想要的结果。
答案 4 :(得分:5)
如果你还需要边框,那么: 1.您可以使用带有透明体的圆形盒子图像和外部的白色图像。例如:
并将其与目标图像一起使用,如下所示:
<FrameLayout
android:layout_width="100px"
android:layout_height="100px" >
<ImageView
android:id="@+id/targetImage"
android:layout_width="100px"
android:layout_height="100px"
android:src="@drawable/app_icon"
android:layout_gravity="center" />
<ImageView
android:id="@+id/boxImage"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/box" />
ImageView
的父布局也是一个很好的解决方案。答案 5 :(得分:4)
如果你需要制作具有不同角半径的位图,我建议遵循以下代码:
private static Bitmap createRoundedRectBitmap(@NonNull Bitmap bitmap,
float topLeftCorner, float topRightCorner,
float bottomRightCorner, float bottomLeftCorner) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = Color.WHITE;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
Path path = new Path();
float[] radii = new float[]{
topLeftCorner, bottomLeftCorner,
topRightCorner, topRightCorner,
bottomRightCorner, bottomRightCorner,
bottomLeftCorner, bottomLeftCorner
};
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
path.addRoundRect(rectF, radii, Path.Direction.CW);
canvas.drawPath(path, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
答案 6 :(得分:2)
对我来说,下面的方法可以实现神奇。 :)
此方法接受位图对象并使用圆角将其返回。 <form>
<div class="form-group">
<div *ngFor="let f of fields" style="text-align:center;">
<label [for]="f.id">{{f.label}}</label>
<input class="form-control" autocomplete="off" required ngModel
[name]="f.name"
[type]="f.type"
[id]="f.name"
[placeholder]="f.placeholder"
>
</div>
</div>
<div *ngFor="let e of errors">
<div class="error">
{{e.desc}}
</div>
</div>
</form>
是您想要的圆角像素数:
<form #testForm="ngForm">
...或者您可以使用this库而不是 ImageView 而无需进一步编码。
答案 7 :(得分:0)
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) {
super.onDraw(canvas);
Bitmap rounder = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvasRound = new Canvas(rounder);
Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
xferPaint.setColor(Color.BLACK);
final int rx = this.getWidth(); //our x radius
final int ry = this.getHeight(); //our y radius
canvasRound.drawRoundRect(new RectF(0,0,rx,ry), rx, ry, xferPaint);
xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(rounder, 0, 0, xferPaint);
}
}
答案 8 :(得分:0)
可以使用背景可绘制对象来完成它,就像包括该文章在内的许多文章中的解释一样,但是它也需要设置剪切。 这里是一个完整的例子:
代码:
AppCompatImageView iconView = findViewById(R.id.thumbnail);
iconView.setClipToOutline(true);
布局:
<android.support.v7.widget.AppCompatImageView
android:id="@+id/thumbnail"
android:layout_width="80dp"
android:layout_height="80dp"
android:contentDescription="@string/thumbnail"
android:scaleType="centerInside"
android:background="@drawable/round_view" <!--here set the drawable as background -->
tools:src="@mipmap/ic_user" />
可绘制对象:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
</shape>
答案 9 :(得分:0)
/**
* Creates new circular bitmap based on original one.
* @param newCornerRadius is optional
*/
fun Bitmap.toCircular(context: Context, newCornerRadius: Float? = null): RoundedBitmapDrawable {
return RoundedBitmapDrawableFactory.create(context.resources, this).apply {
isCircular = true
newCornerRadius?.let {
cornerRadius = it
}
}
}
答案 10 :(得分:-1)
在android中为imageview制作圆角的方法不是火箭科学家!只需使用带有与背景相同颜色的必需曲线的png,并将叠加设置为FITXY。!
答案 11 :(得分:-4)
public void drawRoundImage(boolean isEditPicEnable){
if(originalImageBitmap != null){
setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue);
if (isEditPicEnable) {
setBackgroundResource(R.drawable.ic_account_user_outer_circle_white);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_white_mask);
Bitmap mask1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil_bg);
originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(), mask.getHeight(), true);
Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mCanvas.drawBitmap(originalImageBitmap, 0, 0, null);
mCanvas.drawBitmap(mask, 0, 0, paint);
mCanvas.drawBitmap(mask1, 0, 0, null);
Bitmap mask2 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil);
mCanvas.drawBitmap(mask2, 0, 0, null);
setImageBitmap(result);
setScaleType(ScaleType.FIT_XY);
} else {
Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.ic_account_white_mask);
originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(),mask.getHeight(), true);
Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(),Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mCanvas.drawBitmap(originalImageBitmap, 0, 0, null);
mCanvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
setImageBitmap(result);
setScaleType(ScaleType.FIT_XY);
}
}else{
setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue);
setImageResource(R.drawable.my_ac_default_profile_pic);
}
}