在 android 上使用 canvas 描边圆图像视图
Stroke circle imageview using canvas on android
我正在尝试在我的圆形图像周围使用笔划,但笔划不适合圆圈,看起来圆圈周围有一个正方形并且笔划超过了该限制,请参见下图。
public static Bitmap getCircleBitmap(Bitmap bitmap) {
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
Bitmap output = Bitmap.createBitmap(size,
size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
BitmapShader shader;
shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);
Paint paint = new Paint();
Paint paintB = new Paint();
paintB.setShader(shader);
paintB.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.YELLOW);
paint.setStrokeWidth(15);
paint.setStyle(Paint.Style.STROKE);
RectF rect = new RectF(0, 0 ,size,size);
int radius = size/2;
canvas.drawRoundRect(rect, radius, radius, paint);
canvas.drawRoundRect(rect, radius, radius, paintB);
return output;
}
xml:
<com.click.CircledNetworkImageView
android:id="@+id/profilePic"
android:layout_width="@dimen/feed_item_profile_pic"
android:layout_height="@dimen/feed_item_profile_pic"
android:scaleType="centerCrop"
android:layout_alignParentTop="false"
android:layout_alignParentLeft="false"
android:layout_alignParentBottom="false"
android:layout_alignParentRight="false"
android:layout_alignWithParentIfMissing="false"
android:layout_alignParentEnd="false"
android:layout_alignParentStart="false"
android:layout_centerInParent="true">
</com.click.CircledNetworkImageView>
我把 BitmapShader
看作是一种神奇的画笔,我画的所有东西都会刮掉 canvas 以显示下面的位图。当我设想我用 BitmapShader
.
犯的错误更少时
因此,通过查看您的代码,我猜您希望图像位于圆角矩形内,并在外部带有白色描边。
由于您将绘画风格设置为 STROKE,画笔正在对形状进行描边,因此它在描边的位置留下显示的位图。
您需要调用 canvas.drawRoundRect()
两次,使用相同的 rect/radius 值,但使用两种不同的涂料。第一次绘制将设置位图着色器和 FILL 样式。第二次绘制的颜色 = 白色,笔触宽度 = 15,样式为 STROKE。
我正在尝试在我的圆形图像周围使用笔划,但笔划不适合圆圈,看起来圆圈周围有一个正方形并且笔划超过了该限制,请参见下图。
public static Bitmap getCircleBitmap(Bitmap bitmap) {
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
Bitmap output = Bitmap.createBitmap(size,
size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
BitmapShader shader;
shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);
Paint paint = new Paint();
Paint paintB = new Paint();
paintB.setShader(shader);
paintB.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.YELLOW);
paint.setStrokeWidth(15);
paint.setStyle(Paint.Style.STROKE);
RectF rect = new RectF(0, 0 ,size,size);
int radius = size/2;
canvas.drawRoundRect(rect, radius, radius, paint);
canvas.drawRoundRect(rect, radius, radius, paintB);
return output;
}
xml:
<com.click.CircledNetworkImageView
android:id="@+id/profilePic"
android:layout_width="@dimen/feed_item_profile_pic"
android:layout_height="@dimen/feed_item_profile_pic"
android:scaleType="centerCrop"
android:layout_alignParentTop="false"
android:layout_alignParentLeft="false"
android:layout_alignParentBottom="false"
android:layout_alignParentRight="false"
android:layout_alignWithParentIfMissing="false"
android:layout_alignParentEnd="false"
android:layout_alignParentStart="false"
android:layout_centerInParent="true">
</com.click.CircledNetworkImageView>
我把 BitmapShader
看作是一种神奇的画笔,我画的所有东西都会刮掉 canvas 以显示下面的位图。当我设想我用 BitmapShader
.
因此,通过查看您的代码,我猜您希望图像位于圆角矩形内,并在外部带有白色描边。
由于您将绘画风格设置为 STROKE,画笔正在对形状进行描边,因此它在描边的位置留下显示的位图。
您需要调用 canvas.drawRoundRect()
两次,使用相同的 rect/radius 值,但使用两种不同的涂料。第一次绘制将设置位图着色器和 FILL 样式。第二次绘制的颜色 = 白色,笔触宽度 = 15,样式为 STROKE。