You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.5 KiB
142 lines
4.5 KiB
using System.Collections.Generic;
|
|
using SkiaSharp;
|
|
using TouchTracking;
|
|
|
|
namespace TheGameExtreme.view
|
|
{
|
|
public class TouchManipulationBitmap
|
|
{
|
|
public SKPoint InitialPoint { get; set; }
|
|
SKPaint textPaint;
|
|
Dictionary<long, TouchManipulationInfo> touchDictionary = new Dictionary<long, TouchManipulationInfo>();
|
|
public string Value;
|
|
|
|
public TouchManipulationBitmap(SKPaint textPaint, decimal value)
|
|
{
|
|
this.textPaint = textPaint;
|
|
Value = value.ToString();
|
|
if (value > -10 && value < 10)
|
|
{
|
|
Value = "0" + value.ToString();
|
|
}
|
|
else
|
|
{
|
|
Value = value.ToString();
|
|
}
|
|
|
|
Matrix = SKMatrix.MakeIdentity();
|
|
|
|
TouchManager = new TouchManipulationManager
|
|
{
|
|
Mode = TouchManipulationMode.PanOnly
|
|
};
|
|
}
|
|
|
|
public TouchManipulationManager TouchManager { set; get; }
|
|
|
|
public SKMatrix Matrix { set; get; }
|
|
|
|
public void Paint(SKCanvas canvas, SKColor color)
|
|
{
|
|
canvas.Save();
|
|
|
|
SKMatrix matrix = Matrix;
|
|
canvas.Concat(ref matrix);
|
|
|
|
textPaint.Color = color;
|
|
textPaint.StrokeWidth = 5;
|
|
textPaint.Style = SKPaintStyle.Stroke;
|
|
|
|
SKRect textBounds = new SKRect();
|
|
textPaint.MeasureText(Value, ref textBounds);
|
|
|
|
SKRoundRect card = new SKRoundRect(textBounds, 1f, 1f);
|
|
card.Inflate(35, 55);
|
|
|
|
|
|
canvas.DrawRoundRect(card, textPaint);
|
|
canvas.DrawText(Value, 0, 0, textPaint);
|
|
|
|
canvas.Restore();
|
|
|
|
}
|
|
|
|
public void ChangeColor(SKColor color)
|
|
{
|
|
textPaint.Color = color;
|
|
}
|
|
|
|
public bool HitTest(SKPoint location)
|
|
{
|
|
// Invert the matrix
|
|
SKMatrix inverseMatrix;
|
|
|
|
if (Matrix.TryInvert(out inverseMatrix))
|
|
{
|
|
// Transform the point using the inverted matrix
|
|
SKPoint transformedPoint = inverseMatrix.MapPoint(location);
|
|
|
|
// Check if it's in the untransformed bitmap rectangle
|
|
SKRect rect = new SKRect(-70, -110, textPaint.MeasureText(Value) + 35, textPaint.TextSize);
|
|
return rect.Contains(transformedPoint);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void ProcessTouchEvent(long id, TouchActionType type, SKPoint location)
|
|
{
|
|
switch (type)
|
|
{
|
|
case TouchActionType.Pressed:
|
|
touchDictionary.Add(id, new TouchManipulationInfo
|
|
{
|
|
PreviousPoint = location,
|
|
NewPoint = location
|
|
});
|
|
break;
|
|
|
|
case TouchActionType.Moved:
|
|
TouchManipulationInfo info = touchDictionary[id];
|
|
info.NewPoint = location;
|
|
Manipulate();
|
|
info.PreviousPoint = info.NewPoint;
|
|
break;
|
|
|
|
case TouchActionType.Released:
|
|
|
|
case TouchActionType.Cancelled:
|
|
touchDictionary.Remove(id);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Manipulate()
|
|
{
|
|
TouchManipulationInfo[] infos = new TouchManipulationInfo[touchDictionary.Count];
|
|
touchDictionary.Values.CopyTo(infos, 0);
|
|
SKMatrix touchMatrix = SKMatrix.MakeIdentity();
|
|
|
|
if (infos.Length == 1)
|
|
{
|
|
SKPoint prevPoint = infos[0].PreviousPoint;
|
|
SKPoint newPoint = infos[0].NewPoint;
|
|
SKPoint pivotPoint = Matrix.MapPoint(textPaint.MeasureText(Value) / 2, textPaint.TextSize / 2);
|
|
|
|
touchMatrix = TouchManager.OneFingerManipulate(prevPoint, newPoint, pivotPoint);
|
|
}
|
|
//else if (infos.Length >= 2)
|
|
//{
|
|
// int pivotIndex = infos[0].NewPoint == infos[0].PreviousPoint ? 0 : 1;
|
|
// SKPoint pivotPoint = infos[pivotIndex].NewPoint;
|
|
// SKPoint newPoint = infos[1 - pivotIndex].NewPoint;
|
|
// SKPoint prevPoint = infos[1 - pivotIndex].PreviousPoint;
|
|
|
|
// touchMatrix = TouchManager.TwoFingerManipulate(prevPoint, newPoint, pivotPoint);
|
|
//}
|
|
|
|
SKMatrix matrix = Matrix;
|
|
SKMatrix.PostConcat(ref matrix, touchMatrix);
|
|
Matrix = matrix;
|
|
}
|
|
}
|
|
} |