もこたんブログ@mocuLab(・ω・)

Programming & Designing

Android エミュレータ(AVD)のスキンとは

f:id:mocotanus:20180117063358p:plain

この画面はVisualStudio Macのメニューのからだと、
ツール>Googleエミュレーターマネージャーから出せます。

f:id:mocotanus:20180117063707p:plain

 

Android エミュレータのスキン

エミュレータの外観やコントロールを定義したファイル(いくつかのファイルのアーカイブファイルらしい)

カスタムスキンも作れる。

 

スキンに含まれる内容

・hardware.ini ファイル
・レイアウト ファイル(画面の向き(横向き、縦向き)と物理的な設定)
・イメージ ファイル(背景、キー、ボタンなど)

 

 参考

仮想端末の作成と管理 _ Android Studio
エミュレータ スキンの作成

https://developer.android.com/studio/run/managing-avds.html?hl=ja#skins

VisualStudioforMacでMVVMCrossをインストールする(Xamarin+C#)

Xamarinの解説本を参考に進めていたのですが、書籍ではWindows版のVisualStudioで解説されています。私はMac版で進めていたのでちょこちょこ操作が違う部分がありましたので、メモしておきます。

Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎

Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎

 

↑解説が丁寧なのでオススメです(・ω・ ) 

 

以下、新規ソリューションを作成してから、MVVMCrossをインストールして使う準備を整える部分です。 

 

 

準備

VisualStudioforMacのインストールと、AndroidエミュレーターiOSシミュレーターが動くように準備をしておきます。

 

新規ソリューションの作成

メニュー>ファイル>新しいソリューション(またはcommand+shift+N)

f:id:mocotanus:20171218165443j:plain

 

マルチプラットフォーム>アプリ>ネイティブ から
「空のネイティブアプリ(iOSAndroid)」のほうを選択します。

f:id:mocotanus:20171218165502j:plain

 

アプリ名でソリューションのファイル名?を入力します。
「MVVMCrossSample」としてみました。
MVVMCrossを使う場合は必ずポータブルクラスライブラリ(PCL)を選択します。

f:id:mocotanus:20171218165519j:plain

 

プロジェクト名とソリューション名を入力します。
MVVMCrossではPCLに「.Core」が付いているものとしてインストールされるとのことなので、それに合わせて命名します。(ここで忘れてもあとで変更は可能ですし、合わせなくても数カ所修正すれば動くようです)

f:id:mocotanus:20171218165532j:plain

1.プロジェクト名の後ろに「.Core」を入力する
2.ソリューション名の後ろに自動入力された「.Core」を削除する
3.作成場所を選択する
サンプルなので、UIテストのチェックはずせばよかったかも。

「作成」ボタンを押すと、ファイルが作成されます。

 

↓この段階でのプロジェクトの状態です

 f:id:mocotanus:20171218165721j:plain

一番上の紫のアイコン:ソリューション
青い四角のアイコン:プロジェクト

〜.Core:共通で使うプロジェクト
〜.Droid:Android用プロジェクト。画面とか
〜.iOSiOS用プロジェクト。画面とか
〜.UITests:テスト用プロジェクト

アイコンはWindows版の方が見やすいです… 

 

ビルドしてシミュレーターで実行してみる(Android)

 

ウィンドウの左上にある三角ボタンで、ビルド+実行ができます。

f:id:mocotanus:20171224075415j:plain

 

Androidエミュレータが立ち上がり(少し時間がかかります)、
VisualStudioが用意したAndroid用の初期画面(HelloWorld)が表示されます。

f:id:mocotanus:20171223163956j:plain

 

この画面のファイルは、Android用のプロジェクト「MVVMCrossSample.Core.Droid」の
Resources>layout>Main.axml

です。ダブルクリックすると、デザイナーモードでファイルが開きます。

f:id:mocotanus:20171223164232j:plain

 

ビルドしてシミュレーターで実行してみる(iOS)

スタートアッププロジェクトをiOSに変更する。

f:id:mocotanus:20171221063450j:plain

 

または、スタートアッププロジェクトに設定したいプロジェクト名の上で右クリックして「スタートアッププロジェクトとして設定」を選択します。

f:id:mocotanus:20171221064034j:plain

 

スタートアッププロジェクトは太字になっています。

f:id:mocotanus:20171221063841j:plain

 

エラーが出た場合ですが…
VSとXcodeのバージョンの足並みが揃っていないと以下のようなエラーが出ます。

f:id:mocotanus:20171223164701j:plain

 

今回はXcodeを最新にアップデートして、iOSSDKを更新しました。

f:id:mocotanus:20171223164834j:plain

Xcodeアップデート後に、一度起動することで更新がインストールされます。Xcodeを一度起動しましょー(´・ω・`) 

 

 

VisualStudioに戻り、iOSのほうを実行してみます。
VisualStudioが用意したiOS用の初期画面(HelloWorld)が表示されます。

f:id:mocotanus:20171221063709j:plain

 

 画面はiOSプロジェクトのMain.storyboardにあります。ダブルクリックするとデザイナーが開きます。

f:id:mocotanus:20171223163052j:plain

  

ここまでは素のXamarinのみです。
次からはMVVMCrossをインストールしていきます。

 

MVVMCrossのパッケージをインストール

 VSMac版だと、ソリューションにパッケージ追加ができないようで悩みました。結局プロジェクトごとに個別にインストールしました。
共通プロジェクト、iOSAndroidの3つにインストールしていきます。

 

パッケージで右クリック>「パッケージの追加」

f:id:mocotanus:20171223165520j:plain

 

MVVMCross.StarterPackをインストールします。
「mvvmcross starterpack」を入力して検索します。一字でも入力ミスがあるとヒットしてきませんので(シビアすぎぃ)、出てこないときはコピペで検索してみてください…
Formsじゃなくて、今回はネイティブです。

f:id:mocotanus:20171223165737j:plain

「パッケージを追加」ボタンを押します。

 

f:id:mocotanus:20171223165815j:plain

追加されます。

 

AndroidiOSも同様にインストールします。

f:id:mocotanus:20171223170044j:plain

f:id:mocotanus:20171223170203j:plain

 

ビルドしてシミュレーターで実行してみる(iOS)

エラーを修正する

ビルドするとiOSのプロジェクトでビルドエラーが出ると思います。
エラーを修正します。

 

何をするかはToDo-MvvmCross>_ iOS UI.txtに書いてあります。

f:id:mocotanus:20171224084717j:plain

 

1. Core PCLプロジェクトへの参照を追加する
↓最初から追加されていたようなので、特に作業なし。

f:id:mocotanus:20171224085131j:plain

 

2. AppDelegate.csを変更する

AppDelegate.cs.txtをダブルクリックで開きます。
内容を全選択して、コピーします。

f:id:mocotanus:20171223181547j:plain

 

AppDelegate.csをダブルクリックで開きます。
全選択して貼り付け(上書き)します。

f:id:mocotanus:20171223181742j:plain

 

実行する

左上の三角ボタンで実行します。

 MVVMCrossが用意したiOS用の初期画面が表示されます。

f:id:mocotanus:20171223181831j:plain

 

 この画面は、Views>MainView.xibにあります。

f:id:mocotanus:20171223182102j:plain

サンプルでは.xibファイルが使われていますが、ストーリーボードも使えます。

 

ビルドしてシミュレーターで実行してみる(Android

ファイルを修正する

このまま実行してもエラーは出ませんが、MVVMCrossが用意した画面が表示されませんので、修正します。

 

MainActivity.csに「MainLauncher = true」があると初回起動時に表示されてしまいます。
MainLauncherの指定を削除するか、

f:id:mocotanus:20171223190107j:plain

 

MainActivity.csを削除またはプロジェクトから除外します。
forMacでは「プロジェクトから除外」という名称じゃないようです。

f:id:mocotanus:20171224070808j:plain

f:id:mocotanus:20171224070854j:plain

削除:ゴミ箱へ移動?
プロジェクトから削除:プロジェクトから除外して、ファイルは残す 

 

実行する

スタートアッププロジェクトをAndroidに変更します。
左上の三角ボタンで実行します。
MVVMCrossが用意したAndroid用の初期画面が表示されます。

f:id:mocotanus:20171223182811j:plain

 

 

f:id:mocotanus:20171223183202j:plain

 

プチ解説

リセットボタンを押したときの処理は、iOSAndroid共通で使用するプロジェクト「MVVMCrossSample.Core」のViewModels>MainViewModel.csで記述されています。

f:id:mocotanus:20171224072642j:plain

 

 

 

ポケ森「あおいパンジー」「むらさきのパンジー」の交配のコツと方法

「あおいパンジー」「むらさきのパンジー」を交配する方法

どうぶつの森ポケットキャンプ(ポケ森)」にガーデン機能が追加実装されました。
で、交配でレア度の高い花の種を出す方法です。記録を取っていなかったので、感覚的な結果ですが…これから作る方の参考になれば。

 

f:id:mocotanus:20171223082327p:image

 

コツ

混色からのほうが珍しい色(青や紫)が出やすい!気がした。
黄色と青から紫が出たりするらしいですが、なかなか出ないですね…

 

手順

1.青を出す

×→ を量産
×→ オレンジを量産(オレンジは1つは植えたままにしておき、後の交配で使う)
オレンジ×オレンジ→ を作る(青は1つは植えたままにしておき、後の交配で使う)


2.紫を出す

×→ を量産
×→ を量産
×→ を出す

 


IDは67109615925です。(´・ω・`)
移動は「フレンド>フレンドを追加する>相手のIDを入力する」でできると思います。あおいパンジーとか置いときますね〜

f:id:mocotanus:20171223082912p:image

 

 

「could not connect to the debugger.」がiPhone実機でデバッグ実行中に起きた

f:id:mocotanus:20171203161616p:plain

iPhone実機に接続してデバッグ実行しようとして出た。
理由がわからない。どこかに書いてあるのかね?
・昨日デバッグ実行できていた
・シミュレーターでは動いた


・リビルドして(関係ないかも)
・USBコネクタを抜いて、再度さして
・三角デバッグ実行開始
できた〜

最初に試したときに、配置中にちょうど通知が来たせいでできなかったのかも…?

C#で自作クラス(カスタムクラス)をキーにする方法(Dictionary,HashSet)

ディクショナリの内部では、値(value)を特定するためのインデックスとしてハッシュコード(ハッシュ値)が使われています。

1.まずGetHashCodeメソッドで、ハッシュ値が同じかを調べる
2.ハッシュ値が同じときは、Equalsメソッドでオブジェクトの同値性を調べる
1と2が同じだったら、同じと判断する。

GetHashCodeメソッド、Equalsメソッドを自分でオーバーライドしないときは、Object型のEqualsメソッドが呼ばれます。
Object型のEqualsメソッドは参照アドレスの値を比較するみたいです。それぞれnewしたオブジェクト同士は、プロパティの値が同じでも参照アドレスが一致しないので、別物と判断されます。

◼︎ハッシュコード(ハッシュ値)
 →オブジェクトの値を元に何らかの計算を行なって求めたint型の値。

ディクショナリのキーに使うクラスの定義

例として、氏名と電話の2つをキーとして使い、2が同じ時に同じであると判断してほしいとします。

キーに使うクラスで
・GetHashCodeメソッドをオーバーライドする
・Equalsメソッドをオーバーライドする
をしておきます。

public class UserKey
{
    /// <summary>氏名</summary>
    public string Name { get; set; }
    /// <summary>電話</summary>
    public string Tel { get; set; }

    public UserKey(string naem, string tel)
    {
        this.Name = naem;
        this.Tel = tel;
    }

    // 
    // overrideしておきます(´・ω・`)
    // 
    public override int GetHashCode()
    {
        return Name.GetHashCode() * 31 + Tel.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        // asでは、objがnullでも例外は発生せずにnullが入ってくる
        var other = obj as UserKey;
        if (other == null)
        {
            return false;
        }

        // 何が同じときに、「同じ」と判断してほしいかを記述する
        return this.Name == other.Name && this.Tel == other.Tel;
    }
}

自作クラスをディクショナリのキーに使った例

上記のUserKeyクラスをディクショナリ型のキーに使ってみた例です。

var userKeyList = new List<UserKey>()
{
    new UserKey("名前1", "00-0000"),
    new UserKey("名前2", "00-0000"),
    new UserKey("名前1", "00-0000"),// 同じキー
    new UserKey("名前1", "11-1111"),
};

var userDic = new Dictionary<UserKey, List<string>>();
foreach (var userKey in userKeyList)
{
    if (userDic.ContainsKey(userKey))
    {
        // GetHashCodeメソッドで一致したとき
        // Equalsメソッドでも一致するかを確認する。
        // なので両方オーバーライドしないといけない。
        continue;
    }

    userDic.Add(userKey, new List<string>());
}

HashSetでの使用例

newしているので参照アドレスが違いますが、Addメソッドで同じと判断されてます。

var hashset = new HashSet<UserKey>();

var key1 = new UserKey("名前1", "00-0000");
var key2 = new UserKey("名前1", "00-0000");
var key3 = new UserKey("名前2", "00-0000");

bool isAdded1 = hashset.Add(key1);// true
bool isAdded2 = hashset.Add(key2);// false
bool isAdded3 = hashset.Add(key3);// true

演算子 ==」の場合も同様

演算子 ==」は、既定では参照の等価(オブジェクトへの参照アドレスが同じかどうか)を調べます。それぞれnewしたオブジェクト同士だと、参照アドレスが違うため元々の動作ではfalseが返ります。

Equals() と演算子 == のオーバーロードに関するガイドライン (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/ms173147(v=vs.90).aspx

var uKey1 = new UserKey("名前1", "00-0000");
var uKey2 = new UserKey("名前1", "00-0000");

// 等しいというのを調べるのも、オーバーライドしたEqualsメソッドを使えばOK
bool isEqual1 = (uKey1 == uKey2);// false
bool isEqual2 = uKey1.Equals(uKey2);// true