问题描述
protected override void OnDraw(SKCanvas canvas,int width,int height)
{
int i = 0;
int step = 0;
List<SKRect> rects = new List<SKRect>();
// get the 2D equivalent of the 3D matrix
var rotationMatrix = rotationView.Matrix;
// get the properties of the rectangle
var length = Math.Min(width / 6,height / 6);
canvas.Clear(EffectMedia.Colors.XamarinLightBlue);
foreach (var n in numbers)
{
var rect = new SKRect(0 + step,100 + step,100);
rects.Add(rect);
step += 120;
}
//var sideHoriz = rotationMatrix.MapPoint(new SKPoint(0,1)).Y > 0;
var sideVert = rotationMatrix.MapPoint(new SKPoint(1,0)).X > 0;
var paint = new SKPaint
{
Color = sideVert ? EffectMedia.Colors.XamarinPurple : EffectMedia.Colors.XamarinGreen,Style = SKPaintStyle.Fill,IsAntialias = true
};
// first do 2D translation to the center of the screen
canvas.Translate((width - (120 * numbers.Count)) / 2,height / 2);
// The following line is disabled because it makes the whole canvas rotate!
// canvas.Concat(ref rotationMatrix);
foreach (var n in numbers)
{
canvas.Rotatedegrees((float)-3);
canvas.DrawRoundRect(rects[i],30,paint);
var shadow = SKShader.CreateLinearGradient(
new SKPoint(0,0),new SKPoint(0,length * 2),new[] { paint.Color.WithAlpha(127),paint.Color.WithAlpha(0) },null,SKShaderTileMode.Clamp);
var paintShadow = new SKPaint
{
Shader = shadow,IsAntialias = true,BlendMode = SKBlendMode.softLight
};
foreach (var r in rects)
{
r.Offset(0,105);
canvas.DrawRoundRect(r,paintShadow);
}
i++;
}
}
这个想法是让所有这些圆角框围绕它们自己的轴(垂直)旋转。
我尝试使用 SKPath + Transform,保存和恢复 rotationMatrix 和/或画布,但我找不到有 6 个旋转框的方法( canvas.Concat(ref rotationMatrix); 使整个画布旋转 [*])。
您对如何实现这一目标有任何提示吗?
注意 [*]:每 X 毫秒调用一次 rotationView.RotateYdegrees(5) 以更新 OnDraw 使用的 rotationMatrix。