コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
using Android.Graphics;
[assembly: ExportRenderer(typeof(Xamarin.Forms.Image), typeof(CustomImageCircleRenderer))]
public class CustomImageCircleRenderer : ImageRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
//baseを呼ぶとOutOfMemmoryが発生しますのでコメントアウト
//base.OnElementPropertyChanged(sender, e);
ImageSource source = Element.Source;
if ((Element.Width <= 0 ||
Element.Height <= 0 ||
_isDecoded) &&
(e.PropertyName != "Source" || source == null))
{
return;
}
try
{
var width = (int)Element.Width;
var height = (int)Element.Height;
//非同期だとListViewに間違った画像が表示される。
Bitmap bitmap = ImageService.GetShrinkedBitmap(source, width, height);
//画像を丸型に変更
Bitmap circleBitmap = CustomImageCircleRenderer.GetCircularBitmap(bitmap);
//オリジナルのイメージコントロールに修正した画像ファイルをセットします。
Control.SetImageBitmap(circleBitmap));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
}
}
//画像を丸型に編集する
private static Bitmap GetCircularBitmap(Bitmap bitmap)
{
if (bitmap == null)
{
return null;
}
float radius = bitmap.Width > bitmap.Height ?
((float)bitmap.Height) / 2f :
((float)bitmap.Width) / 2f;
if (radius <= 0)
{
radius = 0;
}
else
{
radius -= 2;
}
//ベースとなる画像の丸型設定
Bitmap canvasBitmap = Bitmap.CreateBitmap(bitmap.Width,
bitmap.Height,
Bitmap.Config.Argb8888);
BitmapShader shader = new BitmapShader(bitmap,
Shader.TileMode.Clamp,
Shader.TileMode.Clamp);
Paint basePaint = new Paint();
basePaint.AntiAlias = true;
basePaint.SetShader(shader);
//白い枠の設定
var path = new Android.Graphics.Path();
path.AddCircle(bitmap.Width / 2, bitmap.Height / 2, radius, Android.Graphics.Path.Direction.Ccw);
var whitePaint = new Paint();
whitePaint.AntiAlias = true;
whitePaint.StrokeWidth = 2;
whitePaint.SetStyle(Paint.Style.Stroke);
whitePaint.Color = global::Android.Graphics.Color.White;
//画像を加工する
Canvas canvas = new Canvas(canvasBitmap);
canvas.DrawPath(path, whitePaint); //白枠表示する
canvas.DrawCircle(bitmap.Width / 2, bitmap.Height / 2,
radius - 1, basePaint); //丸型の画像に加工する
return canvasBitmap;
}
}
[assembly: ExportRenderer(typeof(Xamarin.Forms.Image), typeof(CustomImageCircleRenderer))]
public class CustomImageCircleRenderer : ImageRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
try
{
if (e.OldElement != null || Element == null)
return;
CreateCircle();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
try
{
if (e.PropertyName == VisualElement.HeightProperty.PropertyName ||
e.PropertyName == VisualElement.WidthProperty.PropertyName)
{
CreateCircle();
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
}
}
private void CreateCircle()
{
try
{
double min = Math.Min(Element.Width, Element.Height);
Control.Layer.CornerRadius = (float)(min / 2.0);
Control.Layer.MasksToBounds = false;
Control.Layer.BorderColor = Color.White.ToCGColor();
Control.Layer.BorderWidth = 2;
Control.ClipsToBounds = true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
}
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。