しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Xamarin iOS で円弧を描く

なんとか Xamarin iOS のアプリ起動に成功したので、今度は円弧を描画してみます

円弧ぐらいなら Xamarin.Forms で描画できるのでは・・・と調べてみたらこれがない!

こういった場合各プラットフォーム固有の API を使うしかないようです

とりあえず Xamarin.Forms のプロジェクトで円弧を描画するコードを作ってみました

まずは Shared プロジェクトに手を入れます

/// <summary>
/// 共有表示用 View
/// </summary>
public class CanvasView : ContentView
{
}

中身は空っぽですが ContentView を継承した CanvasView というクラスを Shared プロジェクトに追加します

/// <summary>
/// アプリケーション共通クラス
/// </summary>
public class App
{
    /// <summary>
    /// MainPage の取得
    /// </summary>
    /// <returns>初期画面</returns>
    public static Page GetMainPage()
    {
        return new ContentPage()
        {
            Content = new CanvasView()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
            },
        };
    }
}

次に App.cs を上記のように修正

縦横に拡張するようにして CanvasView を表示するようにしているだけです(なんで HorizontalAlign とか XAML に文言を合わせてくれないの!)

[assembly: ExportRenderer(typeof(CanvasView), typeof(CanvasViewRenderer))]

namespace XamarinSample.iOS
{
    /// <summary>
    /// 表示用 View の iOS 固有 Renderer
    /// </summary>
    public class CanvasViewRenderer : ViewRenderer<CanvasView, CanvasViewRenderer>
    {
        /// <summary>
        /// 描画処理
        /// </summary>
        /// <param name="rect">描画範囲の矩形</param>
        public override void Draw(RectangleF rect)
        {
            base.Draw(rect);

            using (var gc = UIGraphics.GetCurrentContext())
            {
                // 色の指定
                gc.SetStrokeColorWithColor(UIColor.FromRGB(0xc0, 0xc0, 0xc0).CGColor);

                // 線幅の指定
                gc.SetLineWidth(20f);

                // 円弧を追加
                gc.AddArc(
                    rect.Width / 2f,
                    rect.Height / 2f,
                    Math.Min(rect.Width, rect.Height) * 0.3f,
                    0f,
                    Convert.ToSingle(270f * Math.PI / 180f),
                    false);

                // 枠線描画
                gc.StrokePath();
            }
        }
    }
}

あとは iOS プロジェクトに上記の CanvasViewRenderer を追加して完了

f:id:matatabi_ux:20140908223740p:plain

じょうずにかけました!

この Renderer クラスの内部では iOS 固有 API にアクセスできます

Xamarin.Forms と各プラットフォーム固有 API を組み合わせる方法はいくつかあるようですが、Renderer の仕組みを使うのが一番柔軟性があるのではないでしょうか

ただ、API のお作法は当然ながら Windows 系とは異なり、数値系が全部 float だったり角度がラジアンだったりちょっとめんどくさいです

f:id:matatabi_ux:20140908223916p:plain

メソッドにマウスオーバーしてもコメント記述がないのでこのあたりのお作法が全然わからないのも不便;