Xamarin.MacでCoreGraphicsの基本的な使い方

提供: MonoBook
ナビゲーションに移動 検索に移動

CGContextを取得する[編集 | ソースを編集]

NSGraphicsからCGContextを取得する。

    var nsContext = NSGraphicsContext.CurrentContext;
    var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;

線幅、線色、塗る潰し色[編集 | ソースを編集]

色指定はRGBだが一般的な0〜255ではなく0.0〜1.0の浮動小数点で指定する。 色指定はCMYKでもでき、こちらも0.0〜1.0の範囲の浮動小数点となる。

    cgContext.SetLineWidth(2.0f);
    cgContext.SetStrokeColor(red: 0.0f, green: 0.0f, blue: 0.0f, alpha: 1.0f);
    cgContext.SetFillColor(cyan: 1.0f, magenta: 1.0f, yellow: 1.0f, black: 1.0f, alpha: 1.0f);

四角形を描く[編集 | ソースを編集]

画面初期化でよく使う四角形である。

    cgContext.SetFillColor(1.0f, 1.0f, 1.0f, 1.0f);
    cgContext.FillRect(dirtyRect);

直線を描く[編集 | ソースを編集]

よくあるMoveToとLineToである。似たような描画システムではLineToで描画されるのが一般的だが、CoreGraphicsでは最後にStrokePathを呼ばないと描画されない。

    cgContext.MoveTo(100, 100);
    cgContext.AddLineToPoint(200, 200);
    cgContext.StrokePath();

放射状の線を描く[編集 | ソースを編集]

放射状の線を描くカスタムビュー。カスタムビューの詳細は「Xamarin.Mac/カスタムコントロールを使用する」を参照。 やってることは線を描くのと同じである。

    public class RadialLineView : NSView
    {
        //〜〜〜省略〜〜〜

        public override void DrawRect(CGRect dirtyRect)
        {
            base.DrawRect(dirtyRect);

            var context = NSGraphicsContext.CurrentContext.GraphicsPort;

            var length = dirtyRect.Width / 2;
            var divide = 90;
            for (int i = 0; i < divide; i++)
            {
                var x1 = dirtyRect.X + (dirtyRect.Width / 2);
                var y1 = dirtyRect.Y + (dirtyRect.Height / 2);
                context.MoveTo(x1, y1);

                var x2 = (nfloat)(Math.Cos(2 * Math.PI / divide * i) * length ) + x1;
                var y2 = (nfloat)(Math.Sin(2 * Math.PI / divide * i) * length ) + y1;
                context.AddLineToPoint(x2, y2);

                context.StrokePath();
            }
        }
    }

丸を描く[編集 | ソースを編集]

丸は四角形で指定する。 丸だけはStrokePathやFillPathではなくStrokeEllipseInRectとFillEllipseInRectなっている。

    cgContext.SetLineWidth(2.0f);
    cgContext.SetStrokeColor(0.0f, 0.0f, 0.0f, 1.0f);
    cgContext.StrokeEllipseInRect(dirtyRect);

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]