Pixiview/Gallery.Android/Renderers/CircleImageRenderer.cs
2021-08-04 10:27:41 +08:00

67 lines
2.0 KiB
C#

using System;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Gallery.Droid.Renderers;
using Gallery.UI;
using Xamarin.Forms;
[assembly: ExportRenderer(typeof(CircleImage), typeof(CircleImageRenderer))]
namespace Gallery.Droid.Renderers
{
public class CircleImageRenderer : Xamarin.Forms.Platform.Android.FastRenderers.ImageRenderer
{
private Paint paint;
private int radius;
private float scale;
public CircleImageRenderer(Context context) : base(context)
{
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
int size = Math.Min(MeasuredWidth, MeasuredHeight);
radius = size / 2;
SetMeasuredDimension(size, size);
}
protected override void OnDraw(Canvas canvas)
{
paint = new Paint();
var bitmap = DrawableToBitmap(Drawable);
if (bitmap == null)
{
base.OnDraw(canvas);
return;
}
var bitmapShader = new BitmapShader(bitmap, Shader.TileMode.Clamp, Shader.TileMode.Clamp);
scale = radius * 2.0f / Math.Min(bitmap.Width, bitmap.Height);
var matrix = new Matrix();
matrix.SetScale(scale, scale);
bitmapShader.SetLocalMatrix(matrix);
paint.SetShader(bitmapShader);
canvas.DrawCircle(radius, radius, radius, paint);
}
private Bitmap DrawableToBitmap(Drawable drawable)
{
if (drawable is BitmapDrawable bd)
{
return bd.Bitmap;
}
int w = drawable.IntrinsicWidth;
int h = drawable.IntrinsicHeight;
var bitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
var canvas = new Canvas(bitmap);
drawable.SetBounds(0, 0, w, h);
drawable.Draw(canvas);
return bitmap;
}
}
}