Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AotAssemblies>false</AotAssemblies>
<EnableLLVM>false</EnableLLVM>
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
<BundleAssemblies>false</BundleAssemblies>
<EmbedAssembliesIntoApk>false</EmbedAssembliesIntoApk>
<AndroidSupportedAbis />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
Expand Down
3 changes: 1 addition & 2 deletions samples/XCT.Sample/Pages/Views/DrawingViewPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:Xamarin.CommunityToolkit.UI.Views;assembly=Xamarin.CommunityToolkit"
x:Class="Xamarin.CommunityToolkit.Sample.Pages.Views.DrawingViewPage"
xmlns:pages="clr-namespace:Xamarin.CommunityToolkit.Sample.Pages"
xmlns:viewsVodel="clr-namespace:Xamarin.CommunityToolkit.Sample.ViewModels.Views;assembly=Xamarin.CommunityToolkit.Sample">
xmlns:pages="clr-namespace:Xamarin.CommunityToolkit.Sample.Pages">

<ScrollView>
<StackLayout>
Expand Down
25 changes: 13 additions & 12 deletions samples/XCT.Sample/Pages/Views/DrawingViewPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,11 @@ namespace Xamarin.CommunityToolkit.Sample.Pages.Views
{
public partial class DrawingViewPage : BasePage
{
static Random random = new Random();
static readonly Random random = new();

public DrawingViewPage()
{
InitializeComponent();
DrawingViewControl.Lines = GenerateLines(5);
DrawingViewControl.DrawingLineCompletedCommand = new Command<Line>(line =>
{
Logs.Text += "GestureCompletedCommand executed" + Environment.NewLine;
Expand All @@ -25,7 +24,14 @@ public DrawingViewPage()
BindingContext = this;
}

void LoadPointsButtonClicked(object sender, EventArgs e) => DrawingViewControl.Lines = GenerateLines(50);
void LoadPointsButtonClicked(object sender, EventArgs e)
{
DrawingViewControl.Lines.Clear();
foreach (var line in GenerateLines(2))
{
DrawingViewControl.Lines.Add(line);
}
}

void DisplayHiddenLabelButtonClicked(object sender, EventArgs e) =>
HiddenPanel.IsVisible = !HiddenPanel.IsVisible;
Expand All @@ -38,7 +44,7 @@ void GetCurrentDrawingViewImageClicked(object sender, EventArgs e)

void GetImageClicked(object sender, EventArgs e)
{
var lines = GenerateLines(10);
var lines = GenerateLines(2);
DrawImage(lines.ToList());
}

Expand All @@ -65,7 +71,7 @@ ObservableCollection<Point> GeneratePoints(int count)
var points = new ObservableCollection<Point>();
for (var i = 0; i < count; i++)
{
points.Add(new Point(random.Next(1, 100), random.Next(1, 100)));
points.Add(new Point(random.Next(1, (int)DrawingViewControl.Width), random.Next(1, (int)DrawingViewControl.Height)));
}

return points;
Expand All @@ -77,8 +83,7 @@ void DrawImage(List<Line> lines)
GestureImage.Source = ImageSource.FromStream(() => stream);
}

private void AddNewLine(object sender, EventArgs e)
{
void AddNewLine(object sender, EventArgs e) =>
DrawingViewControl.Lines.Add(new Line()
{
Points = GeneratePoints(10),
Expand All @@ -87,11 +92,7 @@ private void AddNewLine(object sender, EventArgs e)
EnableSmoothedPath = true,
Granularity = 5
});
}

void ClearLines_Clicked(System.Object sender, System.EventArgs e)
{
DrawingViewControl.Lines.Clear();
}
void ClearLines_Clicked(object sender, EventArgs e) => DrawingViewControl.Lines.Clear();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.ComponentModel;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using Android.Content;
using Android.Graphics;
using Android.Views;
Expand Down Expand Up @@ -49,13 +49,15 @@ public DrawingViewRenderer(Context context)
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);

if (e.PropertyName == DrawingView.LinesProperty.PropertyName)
LoadLines();
LoadLines();
}

protected override void OnElementChanged(ElementChangedEventArgs<DrawingView> e)
{
base.OnElementChanged(e);

if (e.NewElement != null)
{
SetBackgroundColor(Element.BackgroundColor.ToAndroid());
Expand All @@ -73,6 +75,7 @@ protected override void OnSizeChanged(int w, int h, int oldw, int oldh)
const int minH = 1;
w = w < minW ? minW : w;
h = h < minH ? minH : h;

base.OnSizeChanged(w, h, oldw, oldh);

canvasBitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888!)!;
Expand All @@ -84,18 +87,13 @@ protected override void OnDraw(Canvas? canvas)
{
base.OnDraw(canvas);

foreach (var line in Element.Lines)
if (canvas is not null)
{
var path = new Path();
path.MoveTo((float)line.Points[0].X, (float)line.Points[0].Y);
foreach (var (x, y) in line.Points)
path.LineTo((float)x, (float)y);
Draw(Element.Lines, canvas);

canvas?.DrawPath(path, drawPaint);
canvas.DrawBitmap(canvasBitmap!, 0, 0, canvasPaint);
canvas.DrawPath(drawPath, drawPaint);
}

canvas?.DrawBitmap(canvasBitmap!, 0, 0, canvasPaint);
canvas?.DrawPath(drawPath, drawPaint);
}

public override bool OnTouchEvent(MotionEvent e)
Expand All @@ -116,22 +114,22 @@ public override bool OnTouchEvent(MotionEvent e)
{
Points = new System.Collections.ObjectModel.ObservableCollection<Point>()
{
new Point(touchX, touchY)
new (touchX, touchY)
}
};

drawCanvas!.DrawColor(Element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Clear!);
drawCanvas?.DrawColor(Element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Clear!);
drawPath.MoveTo(touchX, touchY);
break;
case MotionEventActions.Move:
if (touchX > 0 && touchY > 0)
if (touchX > 0 && touchY > 0 && touchX < drawCanvas?.Width && touchY < drawCanvas?.Height)
drawPath.LineTo(touchX, touchY);

currentLine!.Points.Add(new Point(touchX, touchY));
currentLine?.Points.Add(new Point(touchX, touchY));
break;
case MotionEventActions.Up:
Parent?.RequestDisallowInterceptTouchEvent(false);
drawCanvas!.DrawPath(drawPath, drawPaint);
drawCanvas?.DrawPath(drawPath, drawPaint);
drawPath.Reset();
if (currentLine != null)
{
Expand Down Expand Up @@ -160,25 +158,73 @@ public override bool OnInterceptTouchEvent(MotionEvent ev)
return base.OnInterceptTouchEvent(ev);
}

IList<Point> NormalizePoints(IEnumerable<Point> points)
{
var newPoints = new List<Point>();
foreach (var point in points)
{
var pointX = point.X;
var pointY = point.Y;
if (pointX < 0)
{
pointX = 0;
}

if (pointX > drawCanvas?.Width)
{
pointX = drawCanvas?.Width ?? 0;
}

if (point.Y < 0)
{
pointY = 0;
}

if (pointY > drawCanvas?.Height)
{
pointY = drawCanvas?.Height ?? 0;
}

newPoints.Add(new Point(pointX, pointY));
}

return newPoints;
}

void LoadLines()
{
drawCanvas!.DrawColor(Element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Clear!);
if (drawCanvas is null)
return;

drawCanvas.DrawColor(Element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Clear!);
drawPath.Reset();
var lines = Element.Lines;
if (lines.Count > 0)
{
foreach (var line in lines)
Draw(lines, drawCanvas, drawPath);
}

Invalidate();
}

void Draw(IEnumerable<Line> lines, in Canvas canvas, Path? path = null)
{
foreach (var line in lines)
{
path ??= new Path();
var points = NormalizePoints(line.Points);
path.MoveTo((float)points[0].X, (float)points[0].Y);
foreach (var (x, y) in points)
{
drawPath.MoveTo((float)line.Points[0].X, (float)line.Points[0].Y);
foreach (var (x, y) in line.Points)
drawPath.LineTo((float)x, (float)y);
var pointX = (float)x;
var pointY = (float)y;

drawCanvas.DrawPath(drawPath, drawPaint);
drawPath.Reset();
path.LineTo(pointX, pointY);
}
}

Invalidate();
canvas.DrawPath(path, drawPaint);
path.Reset();
}
}

protected override void Dispose(bool disposing)
Expand All @@ -188,10 +234,10 @@ protected override void Dispose(bool disposing)

if (disposing)
{
drawCanvas!.Dispose();
drawCanvas?.Dispose();
drawPaint.Dispose();
drawPath.Dispose();
canvasBitmap!.Dispose();
canvasBitmap?.Dispose();
canvasPaint.Dispose();
if (Element != null)
Element.Lines.CollectionChanged -= OnLinesCollectionChanged;
Expand Down