Huaweiのスマホのテーマを自作する

Huaweiこそ至高

EMUIの魅力の一つとして、テーマ(見た目)を自由に変えられるということがあります。Huaweiのテーマストアなり、Playストアなりでテーマを手に入れて適用することで、通知バーやロック画面、ランチャーなどを変更することができます。

悩み

割と有料のテーマが多い。

自分にピッタリ合う物が見つからない。

適用すると文字が読めなくなりがち。

ほならね?

ストアで提供されてるものであればSDKが配布されてるはずなので、自分で作れるだろ、と。やっていきましょう。

Toolのインストール

developer.huawei.com

ここから Huawei Theme Tool Suite のzipをダウンロード、インストール。私はWindows Defenderに文句を言われました。

f:id:Nageler:20190818011400j:plain

hwtToolがそれです。

f:id:Nageler:20190818011523p:plain

作成

左の Themes->New で新規作成できます。もしくは.hwtファイルをimportして編集することもできます。

f:id:Nageler:20190818011849p:plain

色々と編集ができる。

ロック画面は結構自由度高めに編集できるよう(触ってない)で、他は色を指定したり画像を指定することでテーマを作れます。手元にHuawei端末があればPCにつないでその場で動かすこともできます。GUIで簡単に作れて素晴らしいですね。

 

...と思いきや

実際には一部分しか作れない

このテーマ、全部一括で変更できそうに思えますが、実はアプリ単位でテーマを設定してます。なので最大でも左に表示されているアプリ(launcher, contacts, messaging)+システムUI(通知バーなど)しか変更できません。私としては設定アプリのテーマを弄りたかったのですができませんでした。

まだ手はある

実はhwtToolで新規作成・importしたテーマは /hwtTool/res 下に配置されています(ex: C:\Program Files (x86)\hwtTool\res)。そこに色を指定したxmlや画像が入っているので、直接弄ることでもテーマを作ることができるのです。というよりもそもそも.hwt自体がただのzip圧縮なのでTool Suiteなんぞ無くともテーマは作れるんですね。

問題

ただ製作するにあたって一つだけ問題があります。ドキュメントが見つからない。

日本語はおろか英語にも多分存在しません(中国語ならある?)。Huawei DeveloperもhwtToolの使い方しか載せていませんでした。

fqdeboer.net

www.xda-developers.com

頑張っている人たちはいるようですが私は解読する気力がないです...

私は諦めました

通知バーのデザイン変えたい!くらいなら好きな色にできるので有用だと思います。

エセダークモード

誰かドキュメントの作成...ないしは発掘お願いします!(他力本願)



Windows Terminal(Preview)でコピー&ペースト

注意

これは2019年8月14日時点の記事です。まだPreview版なのですぐ仕様が変更される可能性があります。

環境:Windows Terminal (Preview) 0.3.2171.0

コピペができない

Windowsコマンドライン(cmd)ではコピペは通常のctrl+c,ctrl+vででき、WSLを実行中などでもctrl+shift+c,ctrl+shift+vで可能なのですが、Windows Terminalは標準でコピペがブロックされています。

なぜ

ctrl+cはWindowsではコピーのコマンドですが、Linux(他でも?)ではSIGINTシグナルを送信してプロセスを終了するという役割を持っています。なのでコマンドが被らないため無効にされていたんですね。

解決法

しかしコピペできないのは不便(面倒)です。と思ったらissueで色々議論されていました。

github.com

結論からすれば v0.3.2142.0 から設定できるようになったみたいです。

github.com

ということで設定していきます。

Windows Terminal→上の「∨」みたいなところ→設定

or Ctrl+,

でprofiles.jsonが開かれます。その中のglobals > keybindingsに以下を追加します。

{
    "globals" : 
    {
        //略
        "keybindings" : 
        [
            //略

            {
                "command" : "copy",
                "keys" :
                [
                    "ctrl+shift+c"
                ]
            },
            {
                "command": "paste",
                "keys": [
                    "ctrl+shift+v"
                ]
            }
        ],
        //略
    },
 //略
}

 keysの部分は好きなショートカットでOKです。これを保存すればコピペができるようになります(再起動必要なし)。

AndroidのScrollViewで一番下までスクロールできない現象

問題

コンテンツを全て表示させる目的でScrollViewを使うことは多いと思います。

しかし

のように書くと

下までスクロールできずCardViewが切れてしまいます。

なんなのか

いろいろ試してみたところ、事象としてはCardViewの上のmarginの分下が切れているように思われます。ScrollViewのスクロール長さの決定にChildのmarginは含まれていない...?

marginを0にすると問題は起こりません

解決策

LinearLayoutで中身をラップする

しっかり下のmarginまで表示されました。

 

後記

ドキュメントを見ると

A view group that allows the view hierarchy placed within it to be scrolled. Scroll view may have only one direct child placed within it. To add multiple views within the scroll view, make the direct child you add a view group, for example LinearLayout, and place additional views within that LinearLayout.

 

developer.android.com

とあるので、childが一つならラップしなくてもいいはずなんですが...

 

SampleはGitHubに上げています。

github.com

FlutterでGrid

Flutterを触っていたところ、Xamarin.Formsに見られるような比率でレイアウトできるGridが見つからなかったので、作り方をメモしておきます。

作り方

LayoutBuilderでWidgetのサイズを取得し、RowとColumnを使って配置をしています。

ソース

class LayoutBuilderSample extends StatelessWidget{
	@override
	Widget build(BuildContext context) {
		return new LayoutBuilder(
			builder: (BuildContext context, BoxConstraints constraints)
			{
				Size size = new Size(constraints.maxWidth,constraints.maxHeight);
				return new Column(
				  children: <Widget>[
				    new Row(
				    	children: <Widget>[
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/3,
				    			child: new Card(color: Colors.blue),
				    		),
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/2,
				    			child: new Card(color: Colors.greenAccent),
				    		),
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/6,
				    			child: new Card(color: Colors.orange),
				    		),
				    	],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/4,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/12*5,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3*2,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/5,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/15*2,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/6,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/2,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				  ],
				);
			},
		);
  }
}

f:id:Nageler:20180504233356p:plain:w200

それぞれのSizedBoxでheightとwidthが全体の大きさの何分の何なのかを指定し、大きさを決めています。子の合計の幅が親を超えるとエラーが出るので注意が必要です。

全体のコードはGitHubにあげておきます。
github.com

Xamarin.iOSのAsset Catalogが反応しない件について

 Xamarin.iOSでアプリのアイコンを設定しようとプロジェクトにMedia.xcassetsを追加しても、デバッグしたときにアイコンが結びついていないことがあります。

f:id:Nageler:20180402170204p:plain

 写真のようにInfo.plistにはちゃんと結びつけているのですが…

解決策

 エクスプローラーでInfo.plistを開いて編集します。中身はXMLで書かれているので、下の方に書いてある

 <key>XSAppIconAssets</key>
<string>Resources/Media.xcassets/AppIcons.appiconset</string>

 のところがxcassetsの正しい場所を示すようにします。私の場合はResourcesフォルダにMedia.xcassetsが入っておらず、Info.plistと同階層にあったため

 <key>XSAppIconAssets</key>
<string>Media.xcassets/AppIcons.appiconset</string>

に変えたところ、アイコンが認識されるようになりました。

 

 

 これはバグなんだろうか…

Azure Mobile Apps Quick StartをXamarin.Formsで行う時

AzureのMobile Apps Quick StartをXamarin.Formsでやろうと思った時、

すごい量のエラーが出ることがあります。

アセンブリ参照が古いためにこれが起こるため、

ソリューションエクスプローラーのソリューション○○を右クリック→ソリューションのNuGetパッケージの管理から

アセンブリを更新するとエラーが消えると思います。