<p>Xamarin.Forms ๋“œ๋กœ์ž‰ ์‚ฌ์–‘</p>

์— ๋งŒ๋“  2018๋…„ 04์›” 13์ผ  ยท  69์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: xamarin/Xamarin.Forms

Xamarin.Forms ๋“œ๋กœ์ž‰ ์‚ฌ์–‘

ํ…Œ๋งˆ

MaterialShell์ด โ€‹โ€‹์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์œผ๋กœ ๋ณด์ด๋Š” ์…ธ์ด ํ•„์š”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋‚ด์šฉ๋„ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๊ทธ๊ฒƒ์€ ์ปค์Šคํ…€ ๋ Œ๋”๋Ÿฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌด๊ฒ๊ณ  ์‚ฌ์šฉ์ž ์ž‘์—… ๊ด€์ ์—์„œ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ทธ๋ฆฌ๊ธฐ API ์ƒ˜ํ”Œ

<Button x:Class="Local.MyButton">
  <Button.Template>
    <DrawingTemplate>
      <Drawing>
        <Grid>
          <RoundedRectangle Background="{x:Bind BackgroundColor}" />
          <Ellipse x:Name="TouchFeedback" Opacity="0" />
          <Text Content="{x:Bind Text}" />
        </Grid>
      </Drawing>
    </DrawingTemplate>
  </Button>
</Button>

์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š” ๋ณด๊ธฐ ํ…œํ”Œ๋ฆฟ์ด DrawingTemplate ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. DrawingTemplate ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์€ ํ•ญ์ƒ Drawing ์ž…๋‹ˆ๋‹ค. Drawing ๋‚ด๋ถ€์—์„œ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋“œ๋กœ์ž‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” x:named์ผ ์ˆ˜ ์žˆ๊ณ  ์ด๋ฆ„์œผ๋กœ ์กฐํšŒ๋˜๊ณ  ๋‹ค๋ฅธ View ์ฒ˜๋Ÿผ ์ฝ”๋“œ ์ˆจ๊น€์—์„œ ์กฐ์ž‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋ฆฌ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†๊ณ  ์ž‘๋™ํ•˜๋ ค๋ฉด Drawing ์•ˆ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค. Drawing ๋Š” ๋ชจ๋‘ ๊ฐ„๋‹จํ•œ ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์œผ๋กœ ์ถ•์†Œ๋˜๋ฏ€๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋ฆฐ์ด๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ์ฒด๋ฅผ ๊ทธ๋ฆด ๋•Œ ์ƒ‰์ƒ/๋ฐฐ๊ฒฝ ๋“ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ƒ ์œ ํ˜•์ด ์•„๋‹Œ ๋ธŒ๋Ÿฌ์‹œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MaterialShell์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ชจ๋“  ๊ด€๋ จ ์ปจํŠธ๋กค์€ ๊ธฐ๋ณธ Template ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์ง€์นจ์— ๋”ฐ๋ผ ํ…Œ๋งˆ๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ”Œ๋žซํผ ์ „์ฒด์—์„œ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ๋งˆ๋Š” ๋ฆฌ์†Œ์Šค ์‚ฌ์ „์—์„œ ์ „ํŒŒ๋ฅผ ์ฐจ๋‹จํ•˜์—ฌ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ชจ๋“  ๊ณ„์ธต์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DrawingTemplated ์ปจํŠธ๋กค์€ ๋•Œ๋•Œ๋กœ ๋‹ค๋ฅธ ๋ Œ๋”๋Ÿฌ๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋‹จ ์‹คํ˜„๋˜๋ฉด ์ปจํŠธ๋กค์˜ ํ…œํ”Œ๋ฆฟ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•

๋“œ๋กœ์ž‰ ํ…œํ”Œ๋ฆฟ

์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๋งˆ์ปค ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ํ…œํ”Œ๋ฆฟ์ด DrawingTemplate์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public class DrawingTemplate : ControlTemplate {}

๊ทธ๋ฆผ

๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†๊ณ  ๋Œ€์‹  ์ƒ์œ„ ๋ทฐ์—์„œ ๊ธฐ๋ณธ ๋„๋ฉด์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ์ž…๋‹ˆ๋‹ค. Drawing์€ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๋ ˆ์ด์•„์›ƒ์ด์ง€๋งŒ ๋ ˆ์ด์•„์›ƒํ•  ๋•Œ ํ•ญ์ƒ ๋ชจ๋“  ์ž์‹์˜ ํฌ๊ธฐ๋ฅผ ์ž์‹ ๊ณผ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

public class Drawing : Layout<View> {}

๋ณด๊ธฐ์—์„œ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์œ„ํ•œ ์ƒˆ API

public class View : VisualElement // new API only
{
  public ControlTemplate Template { get; set; }

  protected BindableObject GetTemplateChild(string childName);

  protected virtual void OnApplyTemplate ();
}

๋ธŒ๋Ÿฌ์‹œ

public class Brush : BindableObject
{
  public static readonly BindableProperty OpacityProperty;
  public double Opacity { get; set; }
}

์†”๋ฆฌ๋“œ์ปฌ๋Ÿฌ๋ธŒ๋Ÿฌ์‹œ

public class SolidColorBrush : Brush
{
  public static readonly BindableProperty ColorProperty;
  public Color Color { get; set; }
}

๊ทธ๋ผ๋””์–ธํŠธ ๋ธŒ๋Ÿฌ์‹œ

public class LinearGradientBrush : Brush
{
  public static readonly BindableProperty GradientStopsProperty;
  [Content]
  public GradientStopCollection GradientStops { get; set; }
}

GradientStopCollection

public sealed class GradientStopCollection : IEnumerable<GradientStop>, IList<GradientStop>

GradientStop

public sealed class GradientStop : BindableObject
{
  public static readonly BindableProperty ColorProperty;
  public Color Color { get; set; }

  public static readonly BindableProperty OffsetProperty;
  public double Offset { get; set; }

  public static readonly BindableProperty StartPointProperty;
  public Point StartPoint { get; set; }

  public static readonly BindableProperty EndPointProperty;
  public Point EndPoint { get; set; }
}

๋“œ๋กœ์ž‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ

์—ฐ๊ด€๋œ ์†์„ฑ์ด ์žˆ๋Š” ๋งŽ์€ ์ˆ˜์˜ ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ •์˜ํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ณ , ์กด์žฌํ•ด์•ผ ํ•  ๋ช…๋ฐฑํ•œ ๊ฒƒ๋“ค ์ค‘ ์ผ๋ถ€๋งŒ ๊ธฐ๋กํ•ด ๋‘์‹ญ์‹œ์˜ค. ๋“œ๋กœ์ž‰ ๊ธฐ๋ณธ API๋Š” SkiaSharp๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Skia ๋˜๋Š” paltform์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋“œ๋กœ์ž‰ ๋ฐฑ์—”๋“œ ์‚ฌ์šฉ์— ๋ถˆ๊ฐ€์ง€๋ก ์ ์ž…๋‹ˆ๋‹ค.

Skia๋ฅผ ์œ„ํ•œ ์ข‹์€ ๊ฒฝ๋กœ๋Š” Skia๋ฅผ ํ†ตํ•ด ๋“œ๋กœ์ž‰์„ ๋ Œ๋”๋ง ํ•˜๋„๋ก ์ง€์‹œ ํ•˜๋Š” SkiaDrawing ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Skia๋Š” ๋ชจ๋“  ์Šคํ†ก ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์ฝ”๋”ฉ๋œ ๋“œ๋กœ์ž‰์„ ํ—ˆ์šฉํ•˜๋Š” Skia ๋“œ๋กœ์ž‰ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ์–‘

namespace Xamarin.Forms.Shapes 
{
  public class Shape : View
  {
    public static readonly BindableProperty FillProperty;
    public Brush Fill { get; set; }

    public static readonly BindableProperty StrokeProperty;
    public Brush Stroke { get; set; }

    public static readonly BindableProperty StrokeThicknessProperty;
    public double StrokeThickness { get; set; }
  }
}

์„ 

namespace Xamarin.Forms.Shapes 
{
  public sealed class Line : Shape
  {
    public Point Start { get; set; }
    public Point End { get; set; }
  }
}

ํƒ€์›

namespace Xamarin.Forms.Shapes 
{
  public sealed class Ellipse : Shape
  {
  }
}

ํ…์ŠคํŠธ

public sealed class Text : Shape 
{
  // All the same properties as Label more or less
}

์ง์‚ฌ๊ฐํ˜•

namespace Xamarin.Forms.Shapes 
{
  public sealed class Rectangle : Shape
  {
    public CornerRadius CornerRadius { get; set; }
  }
}

๋ฒ ์ง€์–ด์„ 

์ด๊ฒƒ์€ UWP์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด์ง€๋งŒ ๋ฒ ์ง€์–ด ๊ณก์„  ๊ฒฝ๋กœ/๋ชจ์–‘๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ ๋‹ค๊ฐํ˜• ๋ฐ ํด๋ฆฌ๋ผ์ธ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

namespace Xamarin.Forms.Shapes 
{
  public sealed class BezierLine : Shape
  {
    public IList<BezierPoint> Points { get; }
    public bool ShouldClose { get; set; }
  }
}

๋ฒ ์ง€์–ดํฌ์ธํŠธ

namespace Xamarin.Forms.Shapes 
{
  public sealed class BezierPoint : Point
  {
    public Size LeftControlOffset { get; set; }
    public Size RightControlOffset { get; set; }
  }
}

ํ•  ๊ฒƒ

  • [x] ๊ทธ๋ฆฌ๊ธฐ์šฉ API ์ถ”๊ฐ€
  • [x] ๋ธŒ๋Ÿฌ์‹œ API ์ž‘์„ฑ

๋ฌธ์ œ

๋ชจ์–‘

ํ˜ธ๋งŒ ๊ทธ๋ฆฌ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•œ UWP์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์•ฝ๊ฐ„... ์–ด, ์žฌ๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Shapes๊ฐ€ ํ˜„์žฌ Views๋ผ๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด์„œ๋„ ํ•  ๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ํ‘œ์ค€ ๋ ˆ์ด์•„์›ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๋“œ๋กœ์ž‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ๋“œ๋กœ์ž‰์˜ ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋“œ๋กœ์ž‰ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ ์‚ฌ๋ก€๋Š” ํ˜„์žฌ ๋” ํฐ ์•…์œผ๋กœ ๋ณด์ด๋Š” Drawing ํŠน์ • ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์€ View ๋ฐ Drawing Primitives๊ฐ€ ๊ตฌํ˜„ํ•  ์ผ๋ถ€ ILayoutable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์ž์‹์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” View๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์˜ต์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ธŒ๋Ÿฌ์‹œ

ImageBrush๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”Œ๋žซํผ์ด ๋ธŒ๋Ÿฌ์‹œ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ImageBrush๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋“œ๋กœ์ž‰ ํ…œํ”Œ๋ฆฟ

ํ˜„์žฌ ํ•„์š”ํ•œ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”๋Ÿฌ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ฝ”์–ด์— ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ์Šค์œ„์น˜๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

brushes shapes in-progress high impact enhancement โž•

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ Material Shell์ด โ€‹โ€‹์ด๊ฒƒ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— Material Shell๋ณด๋‹ค ๋จผ์ € ์ผ์–ด๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. Shell๋ณด๋‹ค ๋จผ์ € ์ด๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

Shell์€ ๋” ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์ด์‹์„ ๊ณ ๋ คํ•˜๋„๋ก ๊ถŒ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Shell์€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›จ์”ฌ ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ „ํ›„์— ๋กœ๋“œ๋ฅผ ์ง€์—ฐ/์ง€์—ฐํ•˜์—ฌ ๋”ธ๊พน์งˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ 0 GPU ์˜ค๋ฒ„๋“œ๋กœ ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์„ ์˜ค๋ฒ„๋“œ๋กœ๊ฐ€ ์ฐจํŠธ์˜ "๋นจ๊ฐ„ go fuck yourself" ๋ถ€๋ถ„์— ์žˆ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

Shell์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋นจ๋ฆฌ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•ฑ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Shell์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€/ํƒญ/๊ทธ๋ฃน์„ "์ž์ฃผ"๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์‹œ์Šคํ…œ์—์„œ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋Œ์•„์˜ฌ ๋•Œ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹ํŽ˜์ด์ง€์˜ ์ „์ฒด ๊ณ„์ธต์„ ์†Œ์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฆฌ๊ธฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ธฐ๋ฅผ Shell๋กœ ์ œํ•œํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ๋™์ผํ•œ ํŒจ์Šค์—์„œ ๋ชจ๋“  ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ŠคํŒŒ์ดํฌ๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์†Œ๊ธˆ ์•Œ๊ฐฑ์ด๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ข…์ด์—๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  69 ๋Œ“๊ธ€

@jassmith ,

์ด๊ฒƒ์€ XAML ํ‘œ์ค€ํ™”์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋งค์šฐ ์ข‹์€ ์•„์ด๋””์–ด์ด๋ฉฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐˆ ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Xamarin.Forms๋ฅผ XAML ํ‘œ์ค€(https://github.com/Microsoft/xaml-standard)์œผ๋กœ ์ด๋™ํ•˜๋ ค๋Š” ์ „๋ฐ˜์ ์ธ ๋ชฉํ‘œ์— ํ™•์‹คํžˆ ๊ธฐ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ VisualStates์™€ ํ•จ๊ป˜ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ• ์ง€์— ๋Œ€ํ•œ ํฐ ๋ฌผ์Œํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜์—ญ์—์„œ ๊ทธ๋ž˜ํ”ฝ ๊ฐ€์†์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ๊ฐ€์†์˜ ๋ถ€์กฑ์€ ์ด๋ฏธ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€์—์„œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— Xamarin.Forms๊ฐ€ ๋ฒกํ„ฐ ์ด๋ฏธ์ง•์„ ๋ Œ๋”๋งํ•˜๋Š” ์ฑ…์ž„์„ ๋งก์œผ๋ฉด ์ดํ›„์— ๊ธฐ๋ณธ ํ”Œ๋žซํผ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  GPU ์ฒ˜๋ฆฌ์—์„œ CPU ์ฒ˜๋ฆฌ๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌ๋ฅผ CPU๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ  GPU ์ˆ˜์ค€์—์„œ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค. XF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†Œ๋น„์ž๋Š” ๊ธฐ๋ณธ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋  ํ•ญ๋ชฉ๊ณผ XF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ๋ Œ๋”๋ง๋˜๋Š” ํ•ญ๋ชฉ์„ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋กœ์ž‰๊ณผ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋“œ๋กœ์ž‰ ์ฐจ์ด ๊ฐ„์˜ ๊ท ํ˜• ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ท ์ผ์„ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ธ€๊ผด ๋ Œ๋”๋ง์„ XF๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด XF์˜ ์ „์ฒด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์˜์‹์ ์œผ๋กœ ์ž‘์€ ์‹œ๊ฐ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ”Œ๋žซํผ์˜ ํ‘œ์ค€์—์„œ ์กฐ๊ธˆ๋งŒ ๋ฒ—์–ด๋‚˜๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋„๋ฉด์„ ๊ท ์ผํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์ข‹์€ ์ƒ๊ฐ์€ ์•„๋‹™๋‹ˆ๋‹ค. Avalonia๋Š” ํ™•์‹คํžˆ ๊ทธ ๊ธธ์„ ๊ฐ€๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฒฝ์šฐ์ด๋ฉฐ ์ด๊ฒƒ์ด Avalonia์™€ Xamarin Forms์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ ํ˜•์‹์˜ ์ด๋ฆ„์„ ๋™์ผํ•˜๊ฒŒ ์ง€์ •ํ•˜๊ณ  XAML ํ‘œ์ค€๊ณผ ์ธ๋ผ์ธ๋˜๋„๋ก UWP ๋ฐ WPF์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”Œ๋žซํผ๊ณผ ์ตœ๋Œ€ํ•œ ๊ฐ€๊น๊ฒŒ ์ •๋ ฌ๋˜๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@davidortinau , ์ด์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” Ripple์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?
์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ™˜์ƒ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฐฉํ–ฅ์ด ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. iOS์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์š”์†Œ(i, > ์˜ต์…˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ณด๊ธฐ ์…€์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž ์ง€์ • ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ• ์ˆ˜๋ก ์•ฝ๊ฐ„์˜ ๊ธฐ๋ณธ ์…€์„ ๋ชจ๋ฐฉํ•˜๊ณ  ์œ ์ฐฝํ•˜๊ณ  ๋ฉ‹์ง„ ๋ณด๊ธฐ/์ž‘์—… ํ…Œ๋งˆ๋ฅผ ์œ„ํ•ด ๋” ๋งŽ์ด ๊ฐ€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ์ด ์žˆ์ง€๋งŒ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด GPU๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Skia๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. Flutter๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณ„๊ฐœ์˜ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋™์‹œ์— SVG๋ฅผ Forms์˜ 1๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ‹ดํŒ…๊ณผ ๊ฐ™์€ ๊น”๋”ํ•œ ํšจ๊ณผ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์˜๊ฒฌ์€ ๊ฒฐ๊ตญ ํ”Œ๋žซํผ์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ์ˆ˜์šฉํ•˜๋Š” ์ด์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ”Œ๋žซํผ ๊ฐ„ ์ผ๊ด€๋œ ๋™์ž‘์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์‰ฌ์šด ๊ฐ•๋ ฅํ•˜๊ณ  ํ’๋ถ€ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์ด๋Š”(๊ธฐ๋ณธ์ด ์•„๋‹Œ!) ์ปจํŠธ๋กค์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ: Android์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ.

@ChaseFlorell ์‚ฌ์‹ค ์ €๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์˜ ์ด๋ฆ„์„ x:Nameํ•œ ๋‹ค์Œ FindByName์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒํ—ค์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๊ธฐ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฝœ๋ฐฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง๋„ ๊ทธ ์ •ํ™•ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Skia๊ฐ€ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋ฉด Android์—์„œ๋Š” ์‰ฝ๊ฒŒ 60FPS์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Skia๊ฐ€ ์—†์–ด๋„ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋Š” 60FPS์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rogihee SVG๋Š” ์‹ค์ œ๋กœ ๋ฐฐ์†ก ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. / ์ €๋Š” SVG๋ฅผ ํ”Œ๋žซํผ ๊ฐ„์— ์ผ๊ด€๋˜๊ฒŒ ๋ Œ๋”๋งํ•˜๋ ค๋Š” ์ฑ…์ž„์„ ์ง€๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋“ค์€ ์–ธ์ œ SVG์— ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ...

@jassmith , ์ด๊ฒƒ์€ ํ•˜๋“œ์›จ์–ด ๊ทธ๋ž˜ํ”ฝ ๊ฐ€์†์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

Qt์˜ QML์—์„œ ์˜จ๋‹ค๋ฉด ์ด๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ถ„๋ช…ํ•œ ๋‚ด์žฅ ์ปจํŠธ๋กค๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ์‹œ๊ธฐ์ƒ์กฐ์ด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ/ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ์Šคํ† ๋ฆฌ ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@RichiCoder111y ๋Š” ํ™•์‹คํžˆ ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” Text ์š”์†Œ๊ฐ€ ๊ฐ„๋‹จํ•œ ์ปจํŠธ๋กค์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์†์„ฑ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ xf 4.0์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๊นŒ?

3.0 ์‹œ๋ฆฌ์ฆˆ

@jassmith ๋กœ๋“œ๋งต์— ๊ทธ๋ฆฌ๊ธฐ ๋ฐ ์…ธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

AFAIK ๊ณต๊ฐœ ๋กœ๋“œ๋งต์—๋Š” ์™„์ „ํžˆ ์˜ˆ์ •๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2018๋…„์— ์ด ๋ชจ๋“  ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋ ๊นŒ์š”?@jassmith

@juepiezhongren ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ํ•˜๊ธฐ๋กœ ์•ฝ์†ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ž์‹ ์˜ ์žฅ์ , ๊ฒฐ์  ๋“ฑ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ํ† ๋ก ์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ด€์‹ฌ์—์„œ ์ด๋Ÿฌํ•œ ์‚ฌ์–‘์ด ๋‹น์‹ ์—๊ฒŒ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Xamarin.Forms๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๊ณ  ๋ณด์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋“ค์ด ๋‹น์‹ ์—๊ฒŒ ์–ด๋–ค ๊ธฐํšŒ๋ฅผ ์—ด์–ด์ค€๋‹ค๊ณ  ๋ณด์‹ญ๋‹ˆ๊นŒ?

๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์‚ฌ๋ก€์™€ ์ด์•ผ๊ธฐ๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ตฌ๋“ ์ง€ ์ €์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ๋ฐ์ด๋น„๋“œ. [email protected]

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ž ์žฌ ๊ณ ๊ฐ๊ณผ UX/UI์— ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” "์šฐ๋ฆฌ๋Š” Forms ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์‹ ์šฉ์„ ๋–จ์–ด ๋œจ๋ฆฌ๊ณ  ๊ณ ๊ฐ๊ณผ ํ•จ๊ป˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ™๋ณดํ•˜๋Š” ๊ตฌ์„ฑ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” UI ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํƒ์ƒ‰, ์• ๋‹ˆ๋ฉ”์ด์…˜(์˜์›… ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ ํฌํ•จ), UI ์š”์†Œ ๋ฐ ์ œ์Šค์ฒ˜์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์ด ํ”Œ๋žซํผ ์ค‘๋ฆฝ์ ์ธ ๊ตฌ์„ฑ UI ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ• ๊นŒ์š”?

@timahrentlov ์šฐ๋ฆฌ๋Š” ๋…ผ์˜๋ฅผ ๋ณด๊ณ  ๊ทธ ํ•œ๊ณ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ•œ๊ณ„์˜ ์ด์œ ๋ฅผ ์ •ํ™•ํžˆ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†”์งํžˆ ๋‚˜๋Š” ๊ฐํžˆ ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ์ƒ๊ฐํ•˜๊ฑฐ๋‚˜ ๋ฉ€๋ฆฌ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Xamarin Forms์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ํ›จ์”ฌ ๋‹จ์ˆœํ•œ ๊ด€์ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งค์šฐ ์ œํ•œ๋œ ํ”„๋กœ์ ํŠธ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ถฉ๋ถ„ํ•œ ์ „๋ ฅ๊ณผ ์—ฐ๋ฃŒ๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ด๊ฑฐ๋‚˜ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์š”์ ์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. Xamarin์€ ๋น„๋ฐ€๋ฆฌ์— ์—ฌ์ „ํžˆ OSS ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ๋ถ€ ๊ฐœ์ธ์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €๋Š” Xamarin์ด Xamarin Forms์— ํˆฌ์žํ•œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค.

@davidortinau
ํฌ๋กœ์Šค ํ”Œ๋žซํผ์€ ๋…ํŠนํ•œ ์‹œ๊ฐ์  ๋””์ž์ธ, ๋…ํŠนํ•œ ๋ฒ„ํŠผ ๋ชจ์–‘, ๋…ํŠนํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž ์‚ฌ๋ผ์ง€๋Š” ํšจ๊ณผ ๋“ฑ์„ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•ฝ๊ฐ„์˜ ํญ๋ฐœ๊ณผ ํ•จ๊ป˜ mac์˜ ์•Œ๋ฆผ์ด ํฌ๋ฏธํ•ด์ง€๋ฉด ๊ณ ๊ฐ์—๊ฒŒ ๊นŠ์€ ์ธ์ƒ์„ ์ฃผ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋‚  ์šฐ๋ฆฌ๊ฐ€ wpf๋ฅผ ๋งŽ์ด ์ข‹์•„ํ•˜๋Š” ์ด์œ , ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•  ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ๋ชจ์„œ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์œก๊ฐํ˜• ๋ฒ„ํŠผ๊ณผ ๊ฐ™์ด ๊ณ ์œ ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋กค ํ…œํ”Œ๋ฆฟ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” xf๊ฐ€ ์ด๊ฒƒ์„ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@juepiezhongren ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ UI ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ ๊ฐ„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WPF์— ๋Œ€ํ•ด: WPF๋ฅผ ๋ชจ๋ฐ”์ผ๊ณผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€๋„ react native๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ jers๊ฐ€ ๋งŽ์€ ๊ธฐ์—ฌ๋ฅผ ํ•˜์ง€๋งŒ 3๊ฐœ์›” ํ›„์—๋Š” ์ „ํ˜€ ์ƒ์‚ฐ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค. xf์˜ ๊ฒฝ์šฐ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฌ๊ณ ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. eps x.native๋Š” ๋ชจ๋“  ๊ธฐ๋ณธ API๋ฅผ ์œ ํšจํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ถ€์กฑํ•œ ๊ฒƒ์€ ์œ ๋น„์˜ ์™ธ๋ชจ, ์„ค๋ ˜์„ ์•ˆ๊ณ  ์žˆ๋Š” ์ตœ๊ทผ์˜ ์•ผ์„ฑ๋ฟ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ shell์„ ์‚ฌ์šฉํ•˜๋ฉด flutter๋Š” ๋ฌด์šฉ์ง€๋ฌผ์ด ๋  ๊ฒƒ์ด๊ณ , flutter.ios์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์œผ๋ฉด flutter๋Š” ๋„ค์ดํ‹ฐ๋ธŒ API์™€ ๋ฌดํ•œํ•œ ๊ณ ํ†ต์„ ๊ฒช๋Š” rn๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@opcodewriter
์šฐ๋ฆฌ๋Š” Skiasharp๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์„ฑ๋Šฅ์€ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

@jassmith ๋Š” webgl์„ ์‚ฌ์šฉํ•˜์—ฌ wasm์— materialShell์„ ์ด์‹ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. Skia์˜ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋“œ๋กœ์ž‰ API์— ๋Œ€ํ•œ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ•˜๋“œ ๋Ž์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. \๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

xamarin.mono ๋ฐ wasm์˜ ์‰˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์•ŒํŒŒ ์ œํ’ˆ์€ dotnet์— ๋Œ€ํ•œ ์ฆ์˜ค๊ฐ€ ๋„ˆ๋ฌด ๋งŒ์—ฐํ•œ ์ค‘๊ตญ์—์„œ dotnet ๋ฅด๋„ค์ƒ์Šค๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jassmith ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@juepiezhongren์— ๋Œ€ํ•ด ์–ด๋–ค ๋‰ด์Šค๋ฅผ ์ฐพ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ์ด ์‹œ์ ์—์„œ ํ† ๋ก ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๋œ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค.

๋“œ๋กœ์šฐ์™€ ์‰˜์ด ๋กœ๋“œ๋งต@ChaseFlorell ์— ์–ธ์ œ ํฌํ•จ๋ ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์œ ๋‹ˆ๋ฒ„์„ค ๋ Œ๋”๋ง์€ ์ด๋ฏธ ์•„๋ฐœ๋กœ๋‹ˆ์•„์™€ ํ”Œ๋Ÿฌํ„ฐ์— ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํƒ€์ž„๋ผ์ธ์€ ๋‚ด ๊ฐœ์ธ ๊ฐœ๋ฐœ ์†๋„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ชฉํ‘œ๋Š” ์ „์ฒด ํŒ€์„ ์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์— ์‚ฐ๋งŒํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ €๋งŒ ์ฐธ์—ฌ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‰˜ ๋ถ„๊ธฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Shell์€ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” ์ˆ˜์ง์œผ๋กœ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๋ถ€๋ถ„์„ ๋งค์šฐ ๋นจ๋ฆฌ ์„ธ์šฐ๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ๋นจ๋ฆฌ ๋๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ๋„์›€์„ ์š”์ฒญํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋‘ ๋งค์šฐ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ทธ๋ž˜ํ”ฝ ๊ฐ€์†์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

@jassmith on ios, system.draw ์‚ฌ์šฉ Android์—์„œ๋Š” skiasharp๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค || ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ skiasharp?

@juepiezhongren ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ Skia๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Skia๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ ๋“œ๋กœ์ž‰ API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋Œ€์‹  Skia๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Skia๊ฐ€ ์˜ตํŠธ์ธ๋˜์–ด ์ข…์†์„ฑ์ด ๊ฐ•์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jassmith ๊ทธ๊ฒƒ์€ system.draw๊ฐ€ ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์•„๋‹Œ ios์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ์ •๋ง ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@juepiezhongren ์ด System.Drawing์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์ œ ๋ฒ”์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์‚ฌ์–‘์—์„œ๋Š” System.Drawing์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ธฐ๋Š” ๋ Œ๋”๋ง์„ ํ›จ์”ฌ ์ ๊ฒŒ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋“œ๋กœ์ž‰์€ ๋“œ๋กœ์ž‰์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฌด์–ธ๊ฐ€์— ์˜ํ•ด ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋œ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” "๊ฐ€๋Šฅํ•œ ํ•œ wpf/uwp์— ๊ฐ€๊น๊ฒŒ ํ•˜๋ผ"๋Š” ์ง„์˜์— ์†ํ•ด ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ํ•ญ์ƒ ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์œ„์น˜๋Š” ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ˜„์žฌ XF ํŒจ๋Ÿฌ๋‹ค์ž„ ์‚ฌ์ด์—์„œ ์™„์ „ํžˆ ๋ณด์ด์ง€ ์•Š๋Š” ์ ˆ์ถฉ์•ˆ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€์‘ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋”ฐ๋ผ์„œ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Windows/iOS/Android/etc๋Š” ์—ฌ์ „ํžˆ ์ง์‚ฌ๊ฐํ˜•, ์›, ๊ทธ๋ผ๋””์–ธํŠธ ๋“ฑ์„ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ •๋„๋กœ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ปจํŠธ๋กค ๋””์ž์ด๋„ˆ์—๊ฒŒ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ Apple์˜ ์•„์ด๋””์–ด์™€ Microsoft์˜ ์•„์ด๋””์–ด์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ  ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค์„ ๋””์ž์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์š”์•ฝํ•ฉ๋‹ˆ๊นŒ?

@pmorelegistek ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ๋””์ž์ธ ์š”์†Œ๋กœ ๋ธ”๋Ÿฌ(Blur)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋จธํ‹ฐ๋ฆฌ์–ผ(Material)์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(Android๋ฅผ ๋ณผ ๋•Œ).

Shell v1์„ ๋งˆ์น˜๋ฉด ์ฆ‰์‹œ ์—ฌ๊ธฐ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

@jassmith ํ™ฉ๊ธˆ์ž…๋‹ˆ๋‹ค. UX ๋””์ž์ธ์— ๋งž๋Š” ๊ธฐ๋ณธ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•„์š”ํ•œ ๋””์ž์ธ ์š”์†Œ(๊ฐ€๊ธ‰์  ์†Œ์ˆ˜)์— ๋Œ€ํ•ด์„œ๋งŒ ์Šคํ‚ค์™€ ๊ฐ™์€ ๊ทธ๋ ค์ง„ ์ปจํŠธ๋กค์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ด์ƒ "Xamarin Forms์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋””์ž์ด๋„ˆ ๋ฐ ๊ณ ๊ฐ๊ณผ ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ (ํ”Œ๋Ÿฌํ„ฐ์™€ ๋‹ฌ๋ฆฌ) ์ง„์ •ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋Š๋‚Œ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋””์ž์ธ ์ œํ•œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฃŒ ์‰˜ ์ „์— ์ด๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ XF์˜ ์‹ค์งˆ์ ์ธ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
Shell์€ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” n๋ฒˆ์งธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. _์‹œ์ž‘_์„ ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ์ดˆ์ ์ด ๋˜์–ด ์™”์ง€๋งŒ _์ถ”๊ฐ€_๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ XF ๊ฐœ๋ฐœ์ž๋ฅผ _์œ ์ง€_ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Material Shell์ด โ€‹โ€‹์ด๊ฒƒ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— Material Shell๋ณด๋‹ค ๋จผ์ € ์ผ์–ด๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. Shell๋ณด๋‹ค ๋จผ์ € ์ด๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

Shell์€ ๋” ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์ด์‹์„ ๊ณ ๋ คํ•˜๋„๋ก ๊ถŒ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Shell์€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›จ์”ฌ ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ „ํ›„์— ๋กœ๋“œ๋ฅผ ์ง€์—ฐ/์ง€์—ฐํ•˜์—ฌ ๋”ธ๊พน์งˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ 0 GPU ์˜ค๋ฒ„๋“œ๋กœ ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์„ ์˜ค๋ฒ„๋“œ๋กœ๊ฐ€ ์ฐจํŠธ์˜ "๋นจ๊ฐ„ go fuck yourself" ๋ถ€๋ถ„์— ์žˆ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

Shell์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋นจ๋ฆฌ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•ฑ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Shell์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€/ํƒญ/๊ทธ๋ฃน์„ "์ž์ฃผ"๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์‹œ์Šคํ…œ์—์„œ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋Œ์•„์˜ฌ ๋•Œ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹ํŽ˜์ด์ง€์˜ ์ „์ฒด ๊ณ„์ธต์„ ์†Œ์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฆฌ๊ธฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ธฐ๋ฅผ Shell๋กœ ์ œํ•œํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ๋™์ผํ•œ ํŒจ์Šค์—์„œ ๋ชจ๋“  ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ŠคํŒŒ์ดํฌ๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์†Œ๊ธˆ ์•Œ๊ฐฑ์ด๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ข…์ด์—๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@weitzhandler ์•ž์œผ๋กœ 4-6์ฃผ ์•ˆ์— ์ด ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ ์‰˜์„ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐ ํ›จ์”ฌ ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‹œ๊ฐ„ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+1

@jassmith https://github.com/nventive/Uno
์ข‹์•„์š”.
๋‹จ์ผ ๋ Œ๋”๋ง์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค

form์€ ๊ธ‰์ง„์  ํƒํ—˜๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ด๊ณ  uno๋Š” ๋ณด์ˆ˜์  ํƒํ—˜๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๋‘˜ ๋‹ค ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค

+1 ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋ณด๊ณ  ์‹ถ์€ ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ UI ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ

@jassmith ๋Š” 3.3.0์—์„œ ์ถ”์ฒจ์„ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ์—๊ฒŒ ์ด๊ฒƒ์€ Xamarin์ด ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ LoB ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉฐ, ์ตœ์šฐ์„  ์ˆœ์œ„ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐœ๋ฐœ ์†๋„์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ ์ ˆํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฉ‹์ง€๊ฒŒ ๋ Œ๋”๋ง๋˜๋ฉฐ, ๊ฐœ๋ฐœ ์‹œ๊ฐ„์ด ๋œ ๊ฑธ๋ฆฌ๋Š” ๋งค๋ ฅ์ ์ธ UI๊ฐ€ ์žˆ๋Š” ํ•œ ๊ธฐ๋ณธ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์— ๋œ ์‹ ๊ฒฝ์„ ์”๋‹ˆ๋‹ค.

๊ฐ ํ”Œ๋žซํผ์—์„œ ๊ฐ ์–‘์‹๊ณผ ํŽ˜์ด์ง€๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์‹œ๊ฐ„ ํ‚ฌ๋Ÿฌ์ด๋ฉฐ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์•ž๋’ค๋กœ ์„ธ ๋ฒˆ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์†Œํ•œ UI ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Shell & Material Shell์€ ์ถ•๋ณต์ด์ž ๊ธฐ์œ ์†Œ์‹์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฐ€์–ด์ฃผ์„ธ์š”! ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ณณ(Uno, Flutter ๋ฐ ๊ธฐํƒ€)์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

3.3์—์„œ๋Š” ์ถ”์ฒจ์ด ์•ˆ ๋œ๋‹ค๋Š” ์Šฌํ”ˆ ์†Œ์‹

์ด๊ฒƒ์— ๋Œ€ํ•œ +1, uwp ๋ฐฐ๊ฒฝ์—์„œ ์˜ค๋Š” XF๋ฅผ ์ •๋ง๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๊ตฌํ˜„๋œ๋‹ค๋ฉด XF๋กœ ํ™•์‹คํžˆ ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹ค์„ , ์ ์„  ๋“ฑ๊ณผ ๊ฐ™์€ ์„  ์Šคํƒ€์ผ๋„ ํฌํ•จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œ์‹์ด ์žˆ๋‚˜์š”? ๊ณ„ํš? ๋กœ๋“œ๋งต?

์›ƒ๊ธฐ๊ฒŒ๋„, ์–ด์ ฏ๋ฐค ๋‚˜๋Š” ์ปค์Šคํ…€ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‹คํ—˜ํ•˜๊ณ  ์žˆ๋Š” ๋‚˜ ์ž์‹ ์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ปค์Šคํ…€ ๋ทฐ๋กœ ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•ํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค. Border, Ellipse, Line ์ด์ƒ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :)

@jassmith
์˜ˆ๋ฅผ ๋“ค์–ด Line ๋ฐ Rectangle ๊ฐ€ ์‹ค์ œ ์กฐํšŒ์ˆ˜๊ฐ€ ๋ ๊นŒ์š”? (์˜ˆ์ œ์—๋Š” Ellipse ๊ฐ€ ์žˆ๋Š” Grid ๊ฐ€ ์ž์‹ ๋ณด๊ธฐ๋กœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ํ•  ๊ฒƒ์ด๋‹ค
ํƒญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Rectangle ์— ์ถ”๊ฐ€ TapGestureRecognizer๋ฅผ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ๋“ค์€ ์‹ค์ œ ๋ทฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์‹ค์ œ ๋ทฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ Œ๋”๋ง ์†๋„๊ฐ€ ์ €ํ•˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@andreinitescu ๋‚˜๋Š” ์˜๋„๊ฐ€ Xamarin Forms ์ธก์˜ ์‹ค์ œ ๋ณด๊ธฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๊ธฐ๋กœ ์‹คํ˜„๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

_๋“œ๋กœ์ž‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†๋Š” ๋ทฐ์ž…๋‹ˆ๋‹ค_

๋”ฐ๋ผ์„œ ์ฒด์ธ( Drawing ? DrawingTemplate ?)์˜ ๋ Œ๋”๋Ÿฌ๋Š” ๋“œ๋กœ์–ด๋ธ” ์ž์†์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ทธ๋ฆฌ๋Š” ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด CompressedLayout.IsHeadless ๊ฐ€ ์„ค์ •๋œ ๋ ˆ์ด์•„์›ƒ์— ์ ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ์ œํ•œ์ด ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์ œ์Šค์ฒ˜ ์ธ์‹๊ธฐ, ํšจ๊ณผ ์—†์Œ, ๋ณ€ํ™˜ ์—†์Œ ๋“ฑ).

@GalaxiaGuy ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์ง€๋งŒ Grid์™€ ๊ฐ™์€ ์‹ค์ œ ๋ณด๊ธฐ์™€ ํ˜ผํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? View์—์„œ ํŒŒ์ƒ๋˜๋Š” ๋Œ€์‹  ์ถ”์ƒ ๋“œ๋กœ์ž‰ ์š”์†Œ DrawingElement ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ข‹์€ ์ง์—… ๊ทธ๋ƒฅ ์˜ฌ๋ฐ”๋ฅธ ์ƒ˜ํ”Œ

<Button x:Class="Local.MyButton">
  <Button.Template>
    <DrawingTemplate>
      <Drawing>
        <Grid>
          <RoundedRectangle Background="{x:Bind BackgroundColor}" />
          <Ellipse x:Name="TouchFeedback" Opacity="0" />
          <Text Content="{x:Bind Text}" />
        </Grid>
      </Drawing>
    </DrawingTemplate>
  </Button.Template> --> correct this line
</Button>

์•„๋งˆ๋„ 4.0์—์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

Drawing ๋Š” ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ธ ๊ทธ๋ž˜ํ”ฝ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค์„ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” NControl์ด ์žˆ์—ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ (netstandard2.0 ์ด์ „, SkiaSharp ์ด์ „) ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ์–‘ 1. SkiaSharp์—์„œ ํ›จ์”ฌ ๋” ์™„์ „ํ•œ ํ˜•ํƒœ๋กœ ์ด๋ฏธ ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๊ณ , 2. ์ด๋ฏธ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๋Š” Xamarin.Forms ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” XAML/๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ SkiaSharp๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์€ ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—”์ปจํŠธ๋กค++

@jassmith @rogihee SVG๋Š” ์ •๋ง ๋ฐฐ์†ก ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. // ์ €๋Š” SVG๋ฅผ ํ”Œ๋žซํผ ๊ฐ„์— ์ผ๊ด€๋˜๊ฒŒ ๋ Œ๋”๋งํ•˜๋ ค๋Š” ์ฑ…์ž„์„ ์ง€๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SkiaSharp๋Š” SVG๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋ณด๊ธฐ ํ‰ํ•˜์ง€ ์•Š์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์›ํ•˜๋Š” ์ง„์˜์— ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@legistek SkiaSharp๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋“œ๋กœ์ž‰์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•˜๋Š” Xamarin.Forms ๊ด€๋ จ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

UI ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๊ทธ๋ฆฌ๊ธฐ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ๋Š” UI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹Œ ๊ทธ๋ฆฌ๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...

Xamarin Forms์šฉ ๊ทธ๋ฆฌ๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ์ค‘์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

SkiaSharp๋Š” Xamarin Forms์šฉ ๊ทธ๋ฆฌ๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ .Net UI ํ”Œ๋žซํผ์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ํ™•์‹คํžˆ ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  OP์—์„œ ๋งํ–ˆ๋“ฏ์ด SkiaSharp๋Š” ๊ฐœ๋ณ„ ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ๋“œ๋กœ์ž‰ ์—”์ง„์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์ œ์•ˆ์˜ ์•„์ด๋””์–ด๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชจ๋“  ์ด์ ๊ณผ ํ•จ๊ป˜ XAML์„ ํ†ตํ•ด ๋“œ๋กœ์ž‰์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ๋‚˜๋Š” ์šฐ์•„ํ•˜๋‹ค๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„์ง ์‚ด์•„ ์žˆ๊ณ /๋˜๋Š” MAUI๋กœ ๋กค๋ง๋ฉ๋‹ˆ๊นŒ?

@legistek https://github.com/xamarin/Xamarin.Forms/wiki/Feature-Roadmap ์€ Xamarin.Forms 4.7.0์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต์—์„œ์™€ ๊ฐ™์ด ๋ชจ์–‘, ๊ฒฝ๋กœ ๋ฐ ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์†Œ์‹! ๊ฐ์‚ฌ ํ•ด์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰