add Android version
This commit is contained in:
65
Pixiview.Android/Renderers/CardViewRenderer.cs
Normal file
65
Pixiview.Android/Renderers/CardViewRenderer.cs
Normal file
@ -0,0 +1,65 @@
|
||||
using Android.Content;
|
||||
using Android.Graphics;
|
||||
using Android.Views;
|
||||
using Pixiview.Droid.Renderers;
|
||||
using Pixiview.UI;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Platform.Android;
|
||||
|
||||
[assembly: ExportRenderer(typeof(CardView), typeof(CardViewRenderer))]
|
||||
namespace Pixiview.Droid.Renderers
|
||||
{
|
||||
public class CardViewRenderer : VisualElementRenderer<CardView>
|
||||
{
|
||||
ViewOutlineProvider original;
|
||||
|
||||
public CardViewRenderer(Context context) : base(context)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnElementChanged(ElementChangedEventArgs<CardView> e)
|
||||
{
|
||||
base.OnElementChanged(e);
|
||||
|
||||
var element = e.NewElement;
|
||||
if (element != null)
|
||||
{
|
||||
var radius = element.CornerRadius;
|
||||
if (radius > 0)
|
||||
{
|
||||
original = OutlineProvider;
|
||||
OutlineProvider = new CornerRadiusOutlineProvider(element, radius);
|
||||
ClipToOutline = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDetachedFromWindow()
|
||||
{
|
||||
OutlineProvider = original;
|
||||
base.OnDetachedFromWindow();
|
||||
}
|
||||
|
||||
private class CornerRadiusOutlineProvider : ViewOutlineProvider
|
||||
{
|
||||
private readonly Element element;
|
||||
private readonly float radius;
|
||||
|
||||
public CornerRadiusOutlineProvider(Element from, float r)
|
||||
{
|
||||
element = from;
|
||||
radius = r;
|
||||
}
|
||||
|
||||
public override void GetOutline(Android.Views.View view, Outline outline)
|
||||
{
|
||||
var scale = view.Resources.DisplayMetrics.Density;
|
||||
var width = (double)element.GetValue(VisualElement.WidthProperty) * scale;
|
||||
var height = (double)element.GetValue(VisualElement.HeightProperty) * scale;
|
||||
|
||||
var rect = new Rect(0, 0, (int)width, (int)height);
|
||||
outline.SetRoundRect(rect, radius * scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
66
Pixiview.Android/Renderers/CircleImageRenderer.cs
Normal file
66
Pixiview.Android/Renderers/CircleImageRenderer.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using Android.Content;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using Pixiview.Droid.Renderers;
|
||||
using Pixiview.UI;
|
||||
using Xamarin.Forms;
|
||||
|
||||
[assembly: ExportRenderer(typeof(CircleImage), typeof(CircleImageRenderer))]
|
||||
namespace Pixiview.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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user