add Android version

This commit is contained in:
2020-05-11 23:18:38 +08:00
parent 9f5685a2f8
commit 4561bc2674
53 changed files with 14716 additions and 63 deletions

View 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);
}
}
}
}

View 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;
}
}
}