投稿

Skyhook試してみました。

◇ Skyhook って? Google翻訳によると、 「スカイフックの場所の位置、コンテキストと知能の世界的リーダーです。スカイフックは、今日のWi - Fi測位システムの先駆けと場所を提供します。モバイルデバイスとアプリケーションの数千万します。」 だそうです。ふ~ん。 Android標準のLocationManagerと似たような機能を持つシステム、ということが言えるかと思います。 ◇特徴は? XPSと呼ばれる位置測位の仕組みが特徴です。 XPSはA-GPSとWPSを組み合わせた精度の高い位置測位を提供します。 A-GPSは屋外での精度の高い位置測位に有利です。 WPSはGPSが利用できない屋内・地下でWi-Fi APまたはCell towerの電波により位置測位を可能にします。 詳しくは コチラ 。 また、Tilingという仕組みを利用することによりあらかじめ一定の範囲のWi-Fi APデータベース情報を端末内にダウンロードしておくことで、Skyhookサーバと通信できない状況でも位置測位可能にすることができます。 ◇利用可能なエリアは? ヨーロッパ、アメリカ合衆国、韓国、日本などで 利用可能 です。 日本では、東京、大阪、名古屋とそれらを結ぶ東海道新幹線に沿った地域で利用可能です。 また、「 Submit a Wi-Fi Access Point 」することにより、対応可能地域を増やしてやることが可能です。 GoogleのNetwork Providerによる位置測位の対応エリアがどの程度なのかはよくわかりません。 ◇どうやって使うの? いろいろなプラットフォームをサポートしていますが、ここではAndroid版についてのみ説明します。 1.まず、Skyhook SDKを ダウンロード します。 2.SDKには、ライブラリ、ドキュメント、サンプルが含まれます。 3.自前のプロジェクトにライブラリ(wpsapi.jar)を含めることで利用可能になります。 4.詳しくはサンプル、ドキュメントを参照のこと。 ◇Android標準のLocationManagerとの違いは? LocationManagerもGPS_PROVIDERとNETWORK_PROVIDERを利用することで、XPSと全く同じようなことができます。 それじゃ、Skyhook使う意味ないじゃん、と...

サイズの異なる文字列をボタン上に配置する

ヒントは ここ にあったけど、惜しい、XMLからstrings.xmlのリソースを指定したいのにこの方法だとダメ。あと一歩足りない。 というわけでやり方はこちら。 MultiTextViewというカスタムViewを作成します。 仕様的にはmainTextとsubTextを指定可能とし、それぞれ、テキスト、文字サイズ、文字色を指定可能とします。 まずは、XMLから指定可能な拡張attrを定義します。 valuesフォルダ配下にattrs.xmlファイルを配置して中身をこんな感じに。 -attrs.xml 次に、MultiTextButton.javaで実装。 -MultiTextButton.java public class MultiTextButton extends Button { public MultiTextButton(Context context, AttributeSet attrs) { super(context, attrs); initAttribute(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiTextButton); CharSequence mt = a.getText(R.styleable.MultiTextButton_mainText); CharSequence st = a.getText(R.styleable.MultiTextButton_subText); if ( mt != null ) mainText = mt.toString(); if ( st != null ) subText = st.toString(); mainTextSize = a.getDimension(R.styleable.MultiTextButton_mainTextSize, 10.0f); subTextSize = a.getDimensi...

うちの子Ver.1.1

NewbornクラスにSensorListenerを追加しました。 眠い時はZ軸方向加速度を与えてやると寝ます。 値の絶対値が閾値より小さいと例外発生します。 @Override public void onSensorChanged(SensorEvent event) { // 眠い時のみ発動 if ( this.state == STATE_SLEEPY ) { // 加速度センサー if ( event.sensor.getType() == Sensor.TYPE_ACCELEROMETER ) { // Z軸方向のみ対象です float z = event.values[SensorManager.DATA_Z]; // 閾値を超えないとやり直し if ( Math.abs(z) { sleepy = 0; throw new HumanException(OUTPUT_CRY); } else { // 一定回数閾値を超え続けると寝ます sleepy++; if ( sleepy > SLEEPY_THRESHOLD ) { setState(STATE_SLEEPED); } } } 結構感度高いです。

うちの子

生後35日目です。 10分で実装したのでちょっと雑な動作をします。 未試験です。 package com.awwa.newborn; import Human; public class Newborn extends Human { public static final int OUTPUT_NO_CRY = 0; public static final int OUTPUT_CRY = 1; public static final int STATE_HUNGRY = 0; public static final int STATE_WET = 1; public static final int STATE_SLEEPY = 2; private int state = STATE_HUNGRY; private int outputState = OUTPUT_CRY; @Override private static void life() { while( true ) { try { switch(state) { case STATE_HUNGRY: throw new HumanException(OUTPUT_CRY); break; case STATE_WET: throw new HumanException(OUTPUT_CRY); break; case STATE_SLEEPY: throw new HumanException(OUTPUT_CRY); break; } Thread.Sleep(10800000); } catch (HumanException ex) { outputState = ex.getMessage(); publishState(outputState); } finally { continue; } } } }

ViewをTranslateして表示する

イメージ
Button01の背後からButton02をスライドアニメーションさせて表示する。 なんでこんなの実装しなきゃいけないんだろう、とか思いつつ。 個人的には趣味じゃないですが、やらなきゃいけない状況だったのでやってみました。 結構ハマりつつ。 ◇完成イメージ こんな感じでButton02がアニメーションする。 → → ◇やり方 「layout.xml」はこんな感じ。 ポイントはButton02を乗せたSlidingPanelクラスをButton01の下に配置します。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 前面に表示されているボタン --> <Button android:id="@+id/Button01" android:text="Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <!-- 下にスライドするLayout(初期状態はGONE) --> <com.awwa.animsample2.SlidingPanel android:id="@+id/panel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_below="@id/Button01" android:...

EditTextPreferenceを拡張する

EditTextPreferenceをそのまま使いたくないこともあるわけです。 例えば、Preferenceに永続化させるときは文字列を暗号化さたい、とか。 そんな時はEditTextPreferenceをextendsしてonPrepareDialogBuilder()をオーバーライドしちゃえばいいわけです。 こんな感じ。 ※値は"CCC"として保存するけど、EditTextに表示する際には"CCC converted"と表示して、保存するときは再び"CCC"で保存。 これに暗号化と復号化を組み合わせればいいわけですね。 @Override protected void onPrepareDialogBuilder(Builder builder) { super.onPrepareDialogBuilder(builder); // get value from xml file String value = getText(); Log.d(TAG, "value : " + value); // convert value value = value + " converted"; // display converted value this.getEditText().setText(value); // event handler when select ok button builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // re-convert value and save to xml setText("CCC...

Viewを丸く切り取る

イメージ
Viewを丸く切り取るには、onDraw()をオーバーライドしてclipPath()してあげたクラスを作ってあげればOK。 こんな感じ。 public class ClipImageView extends ImageView { private static final String TAG = "ClipImageView"; public ClipImageView(Context context) { super(context); } public ClipImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ClipImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private Path pathCircle = new Path(); /** * Viewのサイズ確保 */ protected void onSizeChanged(int w, int h, int oldw, int oldh){ // 丸いパス pathCircle.addCircle(w/2, h/2, 24, Path.Direction.CW); } /** * 描画処理 */ protected void onDraw(Canvas canvas) { // パスに沿って切り取り canvas.clipPath(pathCircle); super.onDraw(canvas); } } あとは、これをLayoutにぺたっと貼り付け。 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_...