Android

2011年5月4日水曜日

あおたんのグルグルライブカレンダー

あおたんシリーズ第2弾!
あおたんのグルグルライブカレンダーをリリースしました。
こちらからダウンロードできます。

待ち受け画面でいつでもあおたんに会えますよ!!


あおたんのおやぢくさいけど、ちょっと哀愁漂う姿と、はなちゃんのつれなさそうなクールビューティなイラストシリーズでお届けする、グルグルまわるカレンダー壁紙!
背景は十二ヶ月分をテーマにしていますがお気に入りのものを自由に選べるようになっています。






2011年5月3日火曜日

AdMob SDK 4.0.4導入

AdMob SDK の導入にあたり、ググってみたけど古い情報が多いので、新しいSDKについてまとめてみました。


  1. 用意

  2. 当然のことながら最初はAdMobへの登録とSDKのダウンロードします。
    ここは他のサイトにも解説はあるし、英語を見ながら指示にしたがって頑張ってください。
    広告を貼ろうと思っているアプリを登録してパブリッシャー IDをもらうのもお忘れなく。

  3. ライブラリのコピーと登録

  4. プロジェクトにlibフォルダを追加します。
    ダウンロードしたファイルを解凍して出てきた GoogleAdMobAdsSdk-4.0.4.jar をlibフォルダにコピーします。その後、ビルド・パス→ビルド・パスの構成→ライブラリー→JARの追加でファイルをプロジェクトに追加します。

    ※ライブラリをプロジェクト外において、ビルド・パス→ビルド・パスの構成→ライブラリー→外部JARの追加でもできるはずです。

  5. Manifest

  6. AndroidManifest.xmlの変更点は次の2つだけです。
    1. <application>タグ内にActivityを追加します。
    2. <activity android:name="com.google.ads.AdActivity"
         android:configChanges="keyboard|keyboardHidden|orientation">
      </activity>
      
    3. permissionを2つ追加します。元からこれらのpermissionがある場合はなにもしません。
    4. <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      

  7. Layoutの修正

  8. 広告を表示したいViewに広告用のLinearLayoutを追加します。追加したLinearLayoutは、あとでプログラムで参照するのでIDをつけます。IDの名前はなんでも構いません。たとえばこんな感じ。
    <?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">
     <!-- 広告表示用のLinearLayout -->
     <LinearLayout android:id="@+id/admob"
      android:layout_width="fill_parent"  android:layout_height="wrap_content"
      android:layout_alignParentTop="true" />
     <!-- ここから下は任意 -->
     <TextView android:id="@+id/header"
      android:layout_width="fill_parent" android:layout_height="wrap_content"
      android:layout_below="@+id/admob"
      android:gravity="center"
       android:text="Header" />
     ....
    </RelativeLayout>
    
    ここで追加したのは6~8行目で、この例ではViewの一番上に広告が表示されるようにLayoutしてみました。
    ここで重要なのは広告用のLinearLayoutがView内に追加されることです。
    ※LinearLayoutでなくとも良いような気もしますが、深く考えずに…。

  9. codeの追加

  10. 広告を表示するActivityのonCreateあたりに広告用のコードを追加します。 ここでやるべきことは2つだけです。
    1. AdViewを作成して先程追加した広告用のLinearLayoutにaddViewします。
    2. AdRequestを作成してAdViewの広告読み込みを開始させます。
    具体的には次のような感じになります。
    private final static String AD_UNIT_ID = "...............";
          //AdModからもらったパブリッシャーID
    
    @Override protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);   //広告用のLinearLayoutを含むLayout
    
     //AdMob
     AdView adView = new AdView(this, AdSize.BANNER, AD_UNIT_ID); //広告Viewを作成
     LinearLayout layout = (LinearLayout)findViewById(R.id.admob); //LinearLayoutを探す
     layout.addView(adView);           //広告Viewを追加
    
     AdRequest request = new AdRequest();       //広告のリクエストを作成
     //request.setGender(Gender.FEMALE);        //いろんな設定がここでできる。
     //request.setTesting(true);          //Debug Mode リリース時は外す!
     adView.loadAd(request);           //リクエスト発行
      ...
    }
    
    AdRequestに設定するパラメータで広告のターゲッティングなどが行えるようです。
    AdRequestの設定関係Methodには次のようなものがあります。
      .setBirthday("20110503");
      誕生日を設定?
      .setGender(AdRequest.Gender.FEMALE or AdRequest.Gender.MALE );
      性別を設定。
      .setLocation(Location location);
      位置の設定。
      .setKeyword("Keyword");
      キーワードの指定。
    ※ちなみに条件を付けない方が広告の表示率が良いとか言う話を聞きます。



ということで、これだけでアプリに広告がでますよ~♪。

2011年4月27日水曜日

あおたんのすいすいスライディングパズル リリースしました。

あおたんのすいすいスライディングパズルをリリースしました。
こちらからダウンロードできます。
暇つぶしにどうぞ…。


一応 15パズル的なゲームなのですが 4x4だけではなく
5x5, 6x6, 7x7まで遊べます。

7x7はかなり根気が要りますが、達成感がありますよ。

ただ、4”くらいの携帯電話ではちょっと厳しいかも。
タブレット端末を持っている方はぜひチャレンジしてください。






2011年4月20日水曜日

津波にのまれたノートPCの続き

1週間たったのでHDDに電源を入れてみた。
スピンドルは正常に回ったが、カツン・カツンと音がする。
やっぱダメかぁ・・・。
まあ、お金かければ復旧する方法もあるんだろうけど、そこまですることもないみたいだし、あきらめてもらうことにします。

ただ、一緒に引き上げてきた無線LANルータは同じように水洗いして乾燥させたら無事息を吹き返しました。(コネクタとかスイッチの一部は錆が出てたけど。)

2011年4月14日木曜日

津波にのまれたノートPC

先の震災で気仙沼で津波にのまれたノートパソコンを発掘してきました。
とりあえずこんな感じで発見されました。約1ヶ月間瓦礫の下に埋もれてました。

今からのデータのサルベージにトライします。


内部はまだ塩水でべとべとです。




分解してみました。最初は、洗えばなんとかレストアできるかなとかあまい考えをもっていたのですが…



もう、洗えば何とか・・・とか言う次元ではないですね。金属部分には錆がでており、樹脂部分は腐食してボロボロになっています。
とりあえず、HDDからデータだけでもサルベージできればラッキーとします。

HDDも塩まみれ。コネクタ部や他の金属部分にはまだ錆が出てないようです。
とりあえず取り出し塩が固着した部分を水洗い。

Discの機構内部まで浸水してたり、モータがさび付いてたらアウトです。
今から乾燥剤と一緒にジップロックに入れて一週間以上乾燥させてから通電にトライしてみます。
運よくデータが読み出せるようになればいいのですが…。
見た目から想像するにかなり可能性低め。あとは神だのみです。

2011年3月4日金曜日

雛祭りスマートフォン講座

ちまたで特集してるスマフォ女子は、PCの変わりにガンガン使おうと言うビジネス女子が多い!
だけど、携帯を使ってて、別に仕事で使いたいとは思わないけど新しい携帯を買うんだったら
スマートフォンにしたいよねっていう女子の為に
お気楽・お気軽・お手軽! でも、三倍楽しいスマフォライフ
を提供したいとなんの指針もなく急遽スマフォ講座をしました。

内容は

スマートフォンって
  • 電話ができる
  • メールができる
  • パソコンのまねが出来る
  • インターネットができる
  • 暇つぶしも出来る
  • 友達も出来る
  • ブログも出来る
  • 自分色に出来る
を説明してきました。

Ustreamで録画して置いたので興味のある方、見てください。

2011年2月16日水曜日

GoogleMapをIntentで表示する。

GoogleMapをIntentで表示するだけなら簡単なのだが、パラメータの渡し方に色々とくせがあるようです。

まず、GoogleMapをIntentで起動し表示する基本的なコードは次の通りです。


public class GoogleMapTestActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  
  String mapurl = "geo:38.230844,140.323316";  //←ここの書き方で動作が微妙に変わる!

  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_VIEW);  intent.setClassName("com.google.android.apps.maps","com.google.android.maps.MapsActivity");  intent.setData(Uri.parse(mapurl));
  startActivity(intent);
 }
}
ここで、mapurlの部分の書き方によりいろんなパターンが指定できます。
ちなみにこの情報はGoogleMap アプリのバージョンで変わる可能性があります。
  1. 座標指定

  2. mapurl = "geo:latitude,longitude"と指定した場合、 指定位置を中心とした地図を表示する。
    その位置にPinは表示しない。
    戻るボタン一回で元アプリに戻る。

  3. ピンを立てたい

  4. mapurl = "geo:0,0?q=latitude,longitude"と指定した場合、 最初に(0,0)を指定、つまり現在位置の地図を表示する。
    その後、latitude,longitudeで指定した位置を検索し検索位置を中心とした地図に移動する。
    (検索位置への移動はアニメーション効果あり。)
    0,0の代わりにlatitude,longitudeを指定すれば移動アニメーションは発生しないが、やはり動作は2段階になる。
    指定位置にはピンを表示する。
    戻るボタンは一回目で検索前の画面(つまりピンがない状態)に戻り、 2回目で元のアプリに戻る。
    プログラム的には微妙に使いにくい。

  5. ズーム指定

  6. mapurl = "geo:latitude,longitude?z=xx"でズーム指定ができます。
    xxは1~23で1を指定すると全世界表示、23で最大拡大になります。
    ただし、位置を指定して?z=1を指定するとエラーになることがある!
    あくまでめやすですが、13~15で市町村サイズ・10~11で都道府県サイズ・6で日本全土サイズくらい。
    今のところ、上記2の検索とズーム指定は組み合わせできないようだ…。
と言うことで、IntentでGoogleMapを表示してみたけど、やはりキチンとした表示を行うならMapViewを使って自ら制御するしかない??

2011年2月12日土曜日

AndroidでLibraryを使う(Part2)

さらに前回の続き…。

前回はビルド・パスの構成にてライブラリを追加しましたが、この方法だとLibrary内のリソースが参照できない;;
<libraryPackageName>.R.xxxとかでLibrary側のR.javaのリソースIDは参照できるようだが、そのIDを使ってgetString()とかやってもLibrary側のリソースは取得できない。

さらにLibraryの内部でリソースにアクセスする場合にもcontextが必要で、contextはプロジェクトのMain側で取得するため、プロジェクトのMain側のリソースにアクセスすることはできるが、Library側のリソースにはアクセスできません。

どうやら、リソースを参照するにはライブラリのソースパスごとプロジェクトに含めてやる必要がありそうです。
(どうにかなんないのかな??リソースを使うLibraryはJARで配布できないんだろうか?)

具体的には、

  • プロジェクトのプロパティを開く→Androidのタブ
  • 追加を選んで、Libraryのプロジェクトを選択します。
    ※Libraryのプロジェクトは事前に作成するか、既存のプロジェクトをImportするかしておきます。



  • あとはOKを押すだけで完了。ソースパス毎追加するとパッケージ・エクスプローラはこんな感じになります。

  • genの中にLibraryのR.javaが追加されています。



  • これで、Library側のR.javaも参照できて、そのIDでリソースが参照できるようになります。 ただし、プロジェクト Main側のリソース名とLibrary側のリソース名が区別されない(どちらもR.string.xxxとかで参照することになる)ので、名前の付け方には注意する必要がありそうです。

2011年2月10日木曜日

AndroidでLibraryを使う。

前回の続き…。

今度は作ったLibraryを別のProjectで使う方法。
Libraryの運用方法により、Library自体をProject内部に保存しておきたい場合と、外部のものを参照したい場合の2通りの運用方法が考えられます。

まずは、ProjectにLibraryファイルを含めて運用したい場合。

  1. 普通にAndroid Projectを作成

  2. 既存のプロジェクトを使ってももちろんOK!

  3. プロジェクト内にLibrary(.jarファイル)をコピー。

  4. 場所はどこでも構わないと思うけどlibフォルダを作ってコピーするのがわかりやすいかと。

    ↓こんな感じ


  5. ビルドパスの構成変更

  6. プロジェクトを右クリックしてビルド・パス→ビルド・パスの構成を選ぶ

    ↓↓こんな画面が開きます


    ここで、JARの追加を選ぶとさらに次の画面に


    ここで先程追加したJARファイルを選択してOK。今回はlibフォルダの中に追加してます。
    そうすると↓のようにビルド・パスにライブラリが追加されます。

    このままOKで完了。パッケージ・エクスプローラに参照ライブラリーの項が追加されています。

  7. ライブラリを利用するコード

  8. ライブラリのパッケージをimportすると、ライブラリ内のクラスが使えるようになります。たったこれだけ。
    package com.sample.Application;
    
    import android.app.Activity;
    import android.os.Bundle;
    import com.sample.library.SampleLibrary;
    
    public class SampleApplicationActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            SampleLibrary sampleLibraryClass = new SampleLibrary();
            
            sampleLibraryClass.test(); //SampleLibraryのtest()メソッドを実行
        }
    }
    
外部Libraryを参照する場合
    プロジェクトにLibraryを含めたくない場合(共通Libraryを使う場合など?)は、上記手順の
    2.JARファイルのコピーを行わない。

    3.ビルド・パスの構成の 『プロジェクトのプロパティ・Javaのビルド・パス』の画面で『外部JARの追加』を選ぶ。
    出てきたダイアログで使いたいのJARファイルを選択する以外は一緒です。

2011年2月8日火曜日

AndroidでLibraryを作る

Android用のライブラリを作成する方法

手順をメモ。
  1. プロジェクト作成
    • 新規→Androidプロジェクトを選択
    • 通常通りにプロジェクト名・ビルドターゲットの設定を行う。
    • Create Activityのチェックを外す。


  2. プロジェクトのプロパティ設定
    • プロジェクトを選択→右クリック→プロパティ→Androidタブで Is Libraryをチェックする


  3. AndroidManifestの設定
    • アプリケーションタブでDefine an <application> tag in the AndroidManifest.xmlのチェックを外す。
    • なお、Label/Iconの指定は無視されるので気にしない。


    • これで、できたAndroidManifest.xmlはこんな感じでとってもシンプル。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.sample.library"
          android:versionCode="1"
          android:versionName="1.0">
    </manifest>
    

  4. リソースの整理
    • デフォルトで不必要なリソースができているので削除する。


    • こんな感じでできてるはずなので、drawable-xxx/icon.png(3か所), layout/main.xml, values/string.xmlを削除。
    • リソースを使用しない場合は、resフォルダ内のサブフォルダ drawable-xxx, layout, values等は削除しても構わないが、 assets, res, genのフォルダのみは残しておかないとエラーになる。
    • genフォルダ内にR.javaが自動生成されている。気持ち悪いので一応これも消しておく。
    • リソースを使用する場合は、必要なものを残しておくか、削除後に新しく作成する。

  5. ソースクラスの作成
    • ライブラリとして実装したいクラスをjavaで普通に作成する。

  6. ビルド実行
    • 普通に自動ビルドされるが、一旦クリーンアップして再ビルドするのがなにかと問題が起きにくい。
    • default.propertiesが非同期と言われた場合は、そのファイルを右クリック→リフレッシュしてみる。

  7. ライブラリ(*.jar)作成
    • プロジェクトを右クリック→エクスポート→Java→JARファイル→次へ を選択。
    • エクスポートするものを選択。
      初期設定ではすべてが選択されているが、rootにある次のものは除外すべき。
      (.classpath, .project, AndroidManifest.xml, default.properties, propguard.cfg)
      これらを除外しないと、(これらを除外していない)複数のLibraryを使用するときにDuplicate ..... といって怒られる。
    • また、ライブラリを自プロジェクト内のフォルダに生成した場合、2回目のエクスポート時にライブラリもエクスポート対象になっていると、「JAR ファイルは、それ自体にはエクスポートできません。」と表示される。この時は、あわてずライブラリをエクスポート対象から除外する。


    • その他はデフォルトのままで特に問題なし。Jarファイルの場所を名前を選択し、次へ もしくは 完了。
    • 次へを選んだ場合は適宜設定を進めて完了を選ぶ。

  8. これで、選択した場所にライブラリが作成される。
    • あとは、できたjarファイルを好きなところにコピーして運用するだけ。ライブラリの使い方はまた別途書きます。

2011年2月7日月曜日

Twitter雑感

Twitter参加しています。
@aoi_terenceというIDでやっていますので、覗いて見てください。

ということで、現在フォローしている数1891、フォローされている数1767です。
かなりヘヴィユーザーですが、殆ど地元山形の方との出会い交流の場になっています。

さて、Twitterやる上で覚えなくてはいけないことをちょっと説明します。
以下はさっき呟いた内容です。
  1. 南ジャスコへデート?旦那と。
  2. こんなラベルにしたよ。新しいCD。 http://twitpic.com/3xa1tb
  3. @web_eye 主にかあ、してないから主婦じゃないなあ。
  4. 現在は可読性を重視するので短い名前は付けないように、また動詞と名詞、形容詞の順番を英文に近くとなってますね。開発ツールもそれに対応しているのでパンチは楽ですが。RT @_h4: aoi_terence 変数名の付け方で世代がわかりますね。学生時代の実習はpascalで、研究には
  5. どれくらいで復活するんだろうね?QT@ishikotukotu: わたしは一時下山したけど、、、代わりに東北電力さんがすごい勢いで登っていきましたよ~~。ナイターまで復活したら、ナイター行きます~。
  6. 主婦って何をすれば主婦って呼ばれるのかな?三食ご飯作ってないからなあ。RT @web_eye: 私達ってそもそも主婦なんかな?主婦の定義が気になった朝…w RT aoi_terence: web_eye スーパー主婦とな?一番私がなれなさそうなものだな…
解説
1.は、ただ呟いただけのまず基本の呟き。
2.は、ただの呟きに他サイトにあげた画像リンクを貼ってます。
  画像あげる場所はTwitter対応のところが複数あります。
3.@web_eyeに呟きを投げて居ます。通常@やReplyと言われるものです。相手先の@やReplyに表示されます。
4.非公式RT;参照して返信。相手の呟きを自分の呟きに取り込んで返信しています。
 これをすると私をフォローしている方にも参照内容が見えます。
 あまり推奨されてませんが、これに関しては後ほど。
5.QT:上記の非公式RTと一緒です。
他に公式RT があります。参照して情報を付加せずに呟いてます。と言う感じ。

で、まあ、こんな感じでツイッターをだらだらやっていると、遠くの方から、
RTを非公式で使うな、呟きをだらだら長くするな
と言う声が聞こえるのです。
確かに、同じユーザさんをフォローしてると同じ発言が重複してきて見づらいってのは分かるのですが、如何せん現在の私のツイッターは一人で誰に向かって呟いてるのか分からない状態ではなく、ある程度意味を持った集まりの中で繋がった関係を持って呟いているので、呟きの前後の状況が分かった方が話の流れに乗り易いのです。
これは既にコミュニティを作ってるのと同じ感覚です。
意図して作ったのではなく、同じような地域で暮らしているもの同士がふとした生活の中の情報を共有しているうちに出来ていったもので、ある程度の人数が集まってきたのもこのRT・QTのおかげだと思います。
自分のフォロワーさんがRT・QTして居る方ってどんな人だろう、あ、私が知りたい情報を知ってる人だ。じゃあ、私もフォローしておこう。
こんな連鎖で、どんどん膨らんできている気がします。
現実にお会いした方も、もう10人を超えようとしていて異業種交流が活発になっています。
このように、目的をもってフォローして行くのはとても有意義なのですが、Twitter本来の姿からするとどうでしょうね?
でも、悪い使用方法ではないと思うので、ここで、非公式RTは罪悪ばかりじゃないと言うことを言いたかったのです。

2011年2月6日日曜日

Activity内でのViewの遷移について

さて、アプリケーションの開発についてですが、
大抵のAndroidアプリ開発サイト(本)では、Activity = Windowっぽく解説してあります。

つまり、複数の画面間の遷移が必要なアプリの場合は、
Activity1⇔Activity2⇔Activity3・・・のようにActivityをIntentで遷移するのが一般的だということでしょうか。

しかし、草木塔アプリは1つのActivityでViewを入れ替える方式で作ってみました。
もちろん、Activity切り替え方法を否定するつもりは毛頭なく、こういった実装方法もあるのでは?といった意味で実験的手法です。
実際やってみるとパンくずリスト付きの画面遷移っぽいことをやるのにはこっちの方が向いてるかもしれません。

 この方式で悩ましい点は、
  1. 俗にMVC手法で言うところのControlerの役割をどうする?
    • 本来Activityがこの役割のはず。→でも今回はActivityは1個って決めたから;;
    • View = ViewControlerという位置づけにする。つまりUserView Classを作成して必要に応じOnClickとかをImplementしてUIイベントをハンドルしようということ。
    • こうすると、ViewとControlerが分離されてないじゃないか…と言う声も聞こえてきそうだけど、この場合はR.layoutで指定した部分をViewだと言い切ることにする。現にlayout部分では、Viewの要素の定義やら、レイアウトに関する記述がある。
  2. 戻る処理をなんとかしなければならない。
    • 通常、Activityではバック キーでActivityを閉じてしまいますが、今回は前の画面に戻るようにしなければならない。
    • この処理は必須ではなく、画面上に戻る遷移のボタンを設けることも可能。(けど一般的なApplicationの操作から乖離するからやめた方が良い?)

ということで、sampleコードは次のようになります。
 (OnBackPressed()はAPI Level5 なんで、その辺はゴニョゴニョ・・・。)

MainActivity Class
メインのActivityはViewの制御機能を持たないようにしています。

public class MainActivity extends Activity {
 private Stack<View> childView;


 /*********************************************************
  * Application実行時の最初のイベント。
  * 最初の画面を作成し、WindowListのTopに設定する。
  *
  * @see android.app.Activity#onCreate(android.os.Bundle)
  *********************************************************/
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);

  childView = new Stack<View>();
  childView.clear();

  // 最初のViewを表示
  pushContentView(R.layout.user_first_view);
 }

 /*********************************************************
  * 戻るボタンが押されたイベント処理。
  *
  * @see android.app.Activity#onBackPressed()
  *********************************************************/
 @Override
 public void onBackPressed() {
  if(!popContentView()) {
   // 取り除く前のViewがない場合は、
   //本来のBackPressed(=finish())を実行(必須ではない)
   super.onBackPressed();
  }
 }
 /*********************************************************
  * 子Viewを追加する。
  *
  * @param view 追加する子View
  *********************************************************/
 public void pushContentView(View view) {
  childView.push(view);
  super.setContentView(childView.peek());
 }
 /*********************************************************
  * 子Viewを追加する
  *
  * @param resid 追加する子のリソースID
  *********************************************************/
 public void pushContentView(int resid) {
  // 最初の子Viewを作成
  LayoutInflater inflater
   = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
  View view = (View)inflater.inflate(resid, null);

  childView.push(view);
  super.setContentView(childView.peek());
 }
 /*********************************************************
  * 子tViewを取り除く
  *
  * @return true 取り除き成功 / false 取り除けなかった
  *********************************************************/
 public boolean popContentView() {
  if(childView.size() > 1) {
   // ViewStackに前の画面がある場合はPop
   childView.pop();
   //最上位のViewをsetContentView()する。
   setContentView(childView.peek());
   return true;
  }
  return false;
 }
}

最初のViewのClass
ボタンをクリックすると次のViewに遷移するようにしてみました。

public class UserFirstView extends LinearLayout {
 /*********************************************************
  * コンストラクタ(LinearLayout)
  *
  *********************************************************/
 public UserFirstView(final Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 /*********************************************************
  * Inflaterを使ってViewを実体化する場合は
  * onFinishInflate()以降で findViewByIdをする。
  *
  *  @see android.view.View#onFinishInflate()
  *********************************************************/
 @Override protected void onFinishInflate() {
  //Buttonの処理を追加
  Button buttonNext = (Button)findViewById(R.id.buttonNext);

  buttonNext.setOnClickListener(new OnClickListener() {
   /*********************************************************
    * ボタンがクリックされた
    * →次の画面に遷移する
    *
    * @see android.view.View.OnClickListener#onClick(android.view.View)
    *********************************************************/
   @Override public void onClick(View v) {
    MainActivity mainActivity = (MainActivity)getContext();
    // 次のViewを表示
    mainActivity.pushContentView(R.layout.user_next_view);
   }
  });
  super.onFinishInflate();
 }
}

次のViewのClass
ボタンをクリックすると前のViewに戻るようにしてみました。

public class UserNextView extends LinearLayout {
 /*********************************************************
  * コンストラクタ(LinearLayout)
  *
  *********************************************************/
 public UserNextView(final Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 /*********************************************************
  * Inflaterを使ってViewを実体化する場合は
  * onFinishInflate()以降で findViewByIdをする。
  *
  *  @see android.view.View#onFinishInflate()
  *********************************************************/
 @Override protected void onFinishInflate() {
  //Buttonの処理を追加
  Button buttonNext = (Button)findViewById(R.id.buttonPrev);

  buttonNext.setOnClickListener(new OnClickListener() {
   /*********************************************************
    * ボタンがクリックされた
    * →前の画面に遷移することもできる
    *
    * @see android.view.View.OnClickListener#onClick(android.view.View)
    *********************************************************/
   @Override public void onClick(View v) {
    MainActivity mainActivity = (MainActivity)getContext();
    // 前のViewを表示
    mainActivity.popContentView();
   }
  });
  super.onFinishInflate();
 }
}

UserFirstViewのXMLです
UserNextViewは省略しますが似たようなものです。あくまでSampleなんで…

<?xml version="1.0" encoding="utf-8"?>
<com.sample.UserFirstView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
 <TextView
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:text="FirstView">
 </TextView>
 <Button
   android:id="@+id/buttonNext"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:text="Next">
 </Button>
</com.sample.UserFirstView>

※ということで、結局この方法のメリットは何かと言うと、各画面間でたくさんパラメータを受け渡ししなければならない時にIntentだとちょっと不便…を解消できるかなと。

なお、ブログにソース貼り付けるにあたり、こちらのページを参考にさせていただきました。

2011年1月31日月曜日

アプリ開発記(1.草木塔編)

:::Android Aplication::: 草木塔のページでも紹介している通り、アプリを開発&公開しています。
 ※草木塔の画像や位置をみることができるアプリです。


アプリの開発にあたり、最初に感じたことは…

全体的にはとっても作りやすくていい感じなのですが、その中で感じた不満をぶちまけてみます。

・標準のリソースってださい。(何があるのかわかんない;;)
 ボタンとか貼り付けると、デザイン的にもちょっと微妙なおっきいボタンが…。
 iPhoneの洗練された(とあくまでAppleが言っているのであって、主観ではありません!)UIのイメージからはかけ離れているように感じます。
何か作るときはまずリソースから作んなきゃならないみたい。


・是非はあると思いますが、iPhoneでいうところのUINavigation関連のような標準的なFrameWorkが用意されていない。
 もちろんほとんどのAndroid端末には戻るのハードボタンがついているのでiPhoneのNavigationBarのように戻るボタンとかパンくずリストとかの実装をどうするのかは微妙な感じなのは知ってますが…
 あの標準のタイトルバーはないでしょう、もう無条件でrequestWindowFeature(Window.FEATURE_NO_TITLE); 決定みたいな。


※草木塔アプリでは自前のタイトルバーを用意してiPhoneっぽいNavigationBarをイメージしてみました。


・ListViewの機能が微妙。
 Category付のListViewとか作るのがちょっと大変。
 ExpandableListViewとか使うと以外に簡単にできるのかもしれないが、今回はListViewの勉強を兼ねてListViewに細工して使ってみた。




 ・標準でピンチズーム対応のViewがない。
 ピンチで拡大縮小するのもiPhoneの専売特許?かどうかはわかりませんが、ピンチでの拡大縮小はある程度市民権を得ているものと思われ、実装していないとなんだかな~のアプリになりそう。
 マルチタッチ対応がAnrdoid2.0からということで、ピンチズームはどうなんだろうと言う意見もあるかのしれないが、この状況をみる限り2.0以下はほとんど無視して構わなそう!?って言うか無視するって決めました。(1.6な方ごめんなさい!)


※草木塔アプリでは、画像を表示する部分でピンチズームに対応しています。
iPhoneっぽく、ダブルタップで初期状態(標準ズーム)に戻るようになってるんですよ!?
また、この画面をシングルタップすると、詳細表示画面に遷移するのですが、ここにはくるんと回って遷移するAnimationをSDK Sampleからいただいて採用しています。


ここまでいろいろとiPhoneと比べて書いてきましたが、実は(諸般の事情でまだ公開していませんが)草木塔アプリのiPhone版が最初に存在しており、それを移植したからなんです。

現時点では不満点はまだまだありますが、それでも作りやすい・使いやすいものであることは間違いないようです。
今後、ライブラリとかSDKのアップグレードとかでどんどん良いものになっていくことを期待します。
Published with Blogger-droid v1.6.6

2011年1月7日金曜日

GALAXY Tabってこんなやつ Part2

>

GALAXY Tabでブログ更新

アメブロにこんな記事を更新してみました。 ----------------------------------------------------------------- Galaxy Tab が我が家に来てから、色々文句言いながら使ってます。 取り敢えず先住民のアイポッド君と比較してみます。
  1. 外見に関して
  2. <良いところ> 大きくて見易い 意外と液晶が綺麗 片手で持って、操作が出来る
    <悪いところ> 結構厚い、1センチ近くあるから持ちづらい 片手で持ってると、流石に小指が痺れる 見た目より、重い
  3. 操作性
  4. <良いところ> 電源のスイッチがおおきいので、押しやすい。 比較的音質がいいかな
    <悪いところ> カメラのシャッターボタンがホームボタンの脇に表示されて間違えて終了しちゃう。 ズーム操作が出来ない。
  5. 日本語入力時
  6. <良いところ> 画面が大きいのでタッチが楽。 キ-ボード入力も楽なので、ローマ字入力が出来る。 Androidなので、色々な変換ソフトの選択肢がある。
    <悪いところ> フリックセンスが悪い。 とにかくキーセンスがださい。 自分で細かく設定しないと使いづらくて。。。 試しに、殆ど変換なしのフリック入力でどんな文章になるかテストです。 ちやみに,今からフリックエラーガどれくらいでるか、修正無でやってみますが、やっぱ。文節へんかんご遅くてかすなので、もう少し早く最適な変換に成ってほしいです。ちょっと、すとれすふるこなあ、そう、かってにゆうりよくしようとして、こッテナルノガオオイデス 流石に、ギャラクシータブでブログ書くのは疲れました。 携帯からまめにブログ更新をする、有名人は偉いなあ。
----------------------------------------------------------------- と、途中加筆訂正しましたが、こんなもんでした。

カメラ機能について

カメラに関しては、調査不足だったのでどんな機能があるか全然徒手空拳でした。 携帯電話に付いてるカメラ機能位なんだろうなあと思って使って見たらと言う前提で使った結果が以下です。
  1. ズームがない!
  2. え?なんでズームがないの? SO905iにさえ付いてたのに、遠くのものをズーム出来ない。 自分が撮りたい部分だけを撮影できない。 結構ショックでした。
  3. ライトが眩しい!
  4. 暗い所を撮影する時、フォトライトとフラッシュが光ります。 バッテリーが大きいので結構強い光です。 カメラに見えないものが、あんな強い光を放つのは周囲の人もびっくり。
  5. 動画を撮っても容量気にしない
  6. SIMに保存するので2GのSIM積んでれば、容量なんて気にしない。 片手持ちだとさすがに撮りづらい。 大きい液晶で見ながら撮影が出来ます。
  7. 撮った写真のサンプル
  8. 撮った動画のサンプル

  9. 幼稚園の壁画紹介です。外からも中からも入っていかないと見えないところを紹介してます。 歩きながら撮ってるので、手振れしてるとは思いますがこんな感じならOK?
  10. 設定画面色々
  11. 撮影サイズ:2048×1536、2048×1232、1600×1200、1600×960、1024×600、800×600 ホワイトバランス:自動、晴天、くもり、白熱光、蛍光灯 撮影効果:標準、ネガポジ反転、モノクロ、セピア ISO:自動、100、200、400 画質設定:スーパーファイン、ファイン、標準
    プレビュー表示:撮影するたびにプレビューする GPS:撮影画像にGPS情報を設定するか シャッター音:3種類 保存先:本体もしくはmicroSDカード 設定リセット
    露出値
    フラッシュ:自動、On、Off

2011年1月6日木曜日

Androidからもblogger(に更新テスト

試し書き。
Galaxyからも、bloggerに更新出来るかblogger-droidをおためしなかったって書いたブログを寝ぼけて半分消した。
もういいや、寝ます。
おやすみなさいませ。


本当は上記の倍以上の文章を書いていたんだけど、寝ぼけて削除ボタンを握っていた。
タブだとキーボードじゃないから、ふっと意識が飛んだ時にどこを触ってるかで大惨事になるのだ。
まあ、誤字脱字も沢山だし、量を入力するのはなれが必要。

Published with Blogger-droid v1.6.5

GALAXY Tabが降臨した日 Part1

予約開始

2010年11月15日、GALAXY Tabが予約開始になり、
その日のお昼に山形のdocomoショップに行き、予約しました。

貰った予約票の整理番号が「…-99」、もしかしたら発売日に手が入らないかもという不安。

それに、予約は開始して受け付けているのにも拘らず、発売日が不明???

結局、発売日が決定したのが11月22日でした。よかった、よかったと安心したのもつかの間、
11月26日が発売日決定したのにも関わらず、在庫確保の連絡は25日の夕方まで来ませんでした。

連絡するって言っていたのに、まあ、ショップの対応なんてこんなもんですね。

結局自分でショップに連絡して、明日受け取れると確認しました。

発売開始

2010年11月26日、SAMSUNG GALAXY Tab SC-01Cが発売日でした。

製品情報

お昼に取りに行くとガラガラの店内。待つ事もなくカウンターへ。

買い増しと言うことで、今使ってるSO905iのSIM差し替えで使いますと言って色々手続き。

パケ放題にしたり、と小一時間かかって現物引渡しとなりました。

お値段としては24ヶ月契約割引やらなんやらで45,000円位です。

ちなみに、このショップでは3台入荷したそうです。

どれくらい予約者がいたかは聞きませんでしたが、
買う人はそういなかったんだろうなあと言う感じ。



色々とやってみた

大きさの具体的な比較

まずは、SO905iとiPodとGalaxy Tabの大きさを比較してみた。


大体SO905iの4倍、iPodの3倍位かなあ。

知らない人に、iPhone・iPodとiPadの中間だからiPedですって言ったら信じるかな?

なんてアホな事を考えてしまいました。

スイッチオン

さて、スイッチオン!


こんな感じの初期画面<ホーム>が立ち上がってきました。

最初はもっと綺麗な背景画像だったのですが、アイコンが見づらいので
単色系の背景に変更しています。

簡単に説明すると、上のバッテリーとかSIMカード、時刻が表示されてるのがステータスバー。

液晶には各アイコンが、下のフレームには左から「メニュー」ボタン、「ホーム」ボタン、「バック」ボタン、「検索」ボタンがあります。


結構このステータスバーの表示、キーになるので記憶しておいて損はない。

あ、とりあえずeメールの設定をしました。
spモードメールは、基本SO905iで受けたいので設定しませんでした。


アプリケーション

ホーム画面のアプリアイコンをクリックして既に入っている
アプリケーションを色々眺める。結局ほしいものを探す為、
ホーム画面に戻ってマーケットからAndroidアプリマーケットに。

とりあえず、tweetdeck、twicca、青空読手、Evernote、ジョルテ、Simejiをインストール。
青空読手と豊平文庫の比較をしてみる。左がiPodの豊平、右が青空です。

机の下で、光を遮って撮影してみました。やっぱり文字は大きい方がいいけどね。

フォントはあまり気にしない方なので、ま、いっかあですね。

tweetdeckは操作性の違いがあって、GALAXYのtweetdeckはいまひとつだったので、現在はtwiccaでツイート中。既読未読がはっきりしないのでちょっと困る。

見た目は変わらないんですけどね、リストを複数表示しておいて横スクロールで切り替えられないの不便でした。

でも、iPodではTwitBirdを使っています。PCはTweenを使う嗜好なので、そこは汲んで下さい。

スケジューラーはジョルテをインストしたけど見れればいいや程度なので、Google Calenderと同期させて内容を確認しました。

EverNoteはiPodでは意味がなかったので今回初インストール。まだ未使用。


カメラ

こんな感じで撮れましたが、丁度シャッターアイコンが、ホームやなんかの
フレームキーに近い所にあって、間違えて押してしまって使いこなすのに
コツが必要かも。

また、この大きさとは言えなんか板を持ってる感じの撮影なので、QRリーダも手がぶれやすくてしんどいです。

なんで買ったか

勿論Androidアプリケーションの製作のために買いました。

もう少しするとそちらの情報も載せていきます。

しばしお待ちを・・・。