XamarinでAndroidアプリをフルスクリーンで表示させる

Xamarin.Nativeの場合

MainActivity.csに以下を追加

var systemUiFlags = SystemUiFlags.LayoutStable
			| SystemUiFlags.LayoutHideNavigation
			| SystemUiFlags.LayoutFullscreen
			| SystemUiFlags.HideNavigation
			| SystemUiFlags.Fullscreen
			| SystemUiFlags.ImmersiveSticky;
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)(int)systemUiFlags;

Xamarin.Formsの場合

Android 4.4以下はNativeと同じでいいんですけど、Android 5以降はなぜかステータスバーの内容だけ消えて表示領域が取り残される謎状態になります。

対応としてはbase.OnCreateのあとに以下を追加します。

	if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
	{
		this.Window.AddFlags(WindowManagerFlags.Fullscreen);
		this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
	}

OnCreate全体を見るとこんな感じ

protected override void OnCreate(Bundle bundle)
{
	base.OnCreate(bundle);

	if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
	{
		this.Window.AddFlags(WindowManagerFlags.Fullscreen);
		this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
	}

	global::Xamarin.Forms.Forms.Init(this, bundle);
	LoadApplication(new App());

	var systemUiFlags = SystemUiFlags.LayoutStable
				| SystemUiFlags.LayoutHideNavigation
				| SystemUiFlags.LayoutFullscreen
				| SystemUiFlags.HideNavigation
				| SystemUiFlags.Fullscreen
				| SystemUiFlags.ImmersiveSticky;
	Window.DecorView.SystemUiVisibility = (StatusBarVisibility)(int)systemUiFlags;
}
広告

Androidで横固定にする(回転あり)

[Activity (Label = "XamarinNativeApp5.Android", MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.SensorLandscape)]

ScreenOrientation = ScreenOrientation.SensorLandscapeを指定する。
ScreenOrientation.Landscapeだと片方の横固定にしかならず、反対側の横にはならない。

ユーザーの画面回転に依存させるならScreenOrientation.UserLandscapeを使う

SobaChaの基本操作とUI

Screenshot_2015-12-08-01-14-37.png

唐突にAndroid向けTwitterクライアント「SobaCha」について書いてみたいと思ったので書きました。

黒澤がAndroidで常用しているTwitterクライアントです。
最近Androidが推し進めている?マテリアルデザインには程遠いですが個人的にとても気に入っています。

作者のわかめそば氏の謎のこだわりにより、IS03などのAndroid1.6でも動くどころか、専用カスタマイズをしていると本人から聞いたことがあります。

ただ意図的にツイート以外は誤爆しないようにツーステップ以上の手数が必要になるような設計となっているため煩わしく感じる人もいるかもしれません。

続きを読む

Android 2系でCSSのposition:relativeが効かない件

イベントリリースする4時間前になって急にここのレイアウトぶっ壊れてるという報告があり、確認するとAndroid 2系だけで発生している模様。

検索するとAndroid 2系ではtableのセル(th, td)にposition: relative;は効かないらしい。
対象のhtmlは大雑把にこんな感じ

table-cellも同じようなものだからそりゃ効かないですね。
ちゃんと直すのは時間もなかったし、面倒だったのでdivをクッションにしてこんな感じで応急処置

いつまでソシャゲ界はAndroid 2系をサポートするのか…

ListViewでsmoothScrollByを使う

ListViewのonScrollStateChangedでsmoothScrollByしたらAndroid 2.3.x(RAM512MB)でStackOverFlowが発生する状態になりハマったのでメモ


listview.setOnTouchListener(new ListView.OnTouchListener(){
	@Override
	public boolean onTouch(View arg0, MotionEvent event) {
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_MOVE:
			isTouch = true;
			break;
		}
		return false;
	}
});

listview.setOnScrollListener(new ListView.OnScrollListener() {
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		switch (scrollState) {
		case OnScrollListener.SCROLL_STATE_IDLE:
			if(isTouch)
			{
				//listview.smoothScrollBy(distance, duration);//ここでsmoothScrollするとStackOverFlowする
				mSmoothScrollHandler.removeCallbacks(doSmoothScroll);
				mSmoothScrollHandler.post(doSmoothScroll);
				isTouch = false;
				break;
			}
		}
	}

	private Runnable doSmoothScroll = new Runnable() {
		@Override
		public void run() {
			listview.smoothScrollBy(distance, duration);
		}
	};
}

Android4.0とCanvasメモ

Android 4.0以降の一部の端末でCanvas関係でブラウザが終了するやつ。
描画サイズがでか過ぎたせいで落ちてる可能性。

Android 4.0以降のデフォルトブラウザはJavaScriptのscreen.widthが実際の解像度で返ってくるが、
iPhoneや、Android 2.x、Google ChromeだとdevicePixelRatioで割った値が返ってくる。

例:SC-02E(Galaxy Note 2)だとデフォルトブラウザで720なのに、Chromeだと360

function init() {
	var devicePixelRatio = window.devicePixelRatio;
	var width = screen.width;
	var canvas = document.getElementById("canvas");
	ctx = canvas.getContext("2d");
	ctx.scale(devicePixelRatio, devicePixelRatio);            
	if (width <= 360)
	{
	    canvas.width = width * devicePixelRatio;
	    canvas.height = 400 * (width / 320) * devicePixelRatio;
	    canvas.style.width = width + "px";
	    canvas.style.height = 400 * (width / 320) + "px";
	else
	{
	    canvas.width = width / devicePixelRatio;
	    canvas.height = 400 * (width / devicePixelRatio / 320);
	    canvas.style.width = (width / devicePixelRatio) + "px";
	    canvas.style.height = 400 * (width / devicePixelRatio / 320) + "px";
	}
}