protected void OnDrawSample(SKCanvas canvas, int width, int height) { var length = Math.Min(width / 6, height / 6); var rect = new SKRect(-length, -length, length, length); var side = rotationMatrix.MapPoint(new SKPoint(1, 0)).X > 0; canvas.Clear(SampleMedia.Colors.XamarinLightBlue); // first do 2D translation to the center of the screen canvas.Translate(width / 2, height / 2); // then apply the 3D rotation var matrix = rotationMatrix.Matrix; canvas.Concat(ref matrix); var paint = new SKPaint { Color = side ? SampleMedia.Colors.XamarinPurple : SampleMedia.Colors.XamarinGreen, Style = SKPaintStyle.Fill, IsAntialias = true }; canvas.DrawRoundRect(rect, 30, 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); paint = new SKPaint { Shader = shadow, Style = SKPaintStyle.Fill, IsAntialias = true }; rect.Offset(0, length * 2 + 5); canvas.DrawRoundRect(rect, 30, 30, paint); Log.Debug("Demo", "Enter"); if (cnt == 0) { Log.Debug("Demo", "Enter"); InitEvent(); } }