ラベル 初心者 の投稿を表示しています。 すべての投稿を表示
ラベル 初心者 の投稿を表示しています。 すべての投稿を表示

12/07/2011

AndroidでのAdapterView-Adapter

どうもJudaです。

今日はAndroidでのAdapterVIewとAdapterの関係についてです。

AdapterViewの継承クラスでは、Adapterを使ってデータと表示を密に連携させることだと思います。
この場合にAdapterViewは大量のデータを高速に表示し、スクロールをよりよくサポートしていることを要求されます。

単純なLinearLayoutの実装では、子要素の数が増えれば増えるほど遅くなります。
これは表示可能領域以外の要素の計測、レイアウト、描画を行ってしまうからです。
また合わせて覚えておきたいことは、Androidでもっとも計算コストの高い処理の一つにLayoutInflaterでのinflateメソッドがあります。XMLからのパース処理はAndroidでもやはり遅いのです。またView要素のコンストラクトも同じく重くなる可能性が高く、あまり多用すると著しい処理コストになります。

上記のような制約がある中で、ListViewなどは高速な表示を可能にしています。
これは、一度生成したViewを再度利用しているからです。
ここからがAdapterViewとAdapterの連携に関わります。
AdpaterViewは、onLayoutでItemを準備します。
この際に、新規にレイアウトする際に、スクロール変位を計算し、それのあと可視領域内に残っているView要素のみを残して、可視領域を外れたものをリサイクルするために格納します。ここでAdapterのTypeIDCount分の格納場所が用意されています。
Viewは排除したあとに、新しく可視領域に出現するView要素を子要素として追加します。このときに使われるのが、addViewInLayoutです。この段階では、単純に子要素として追加したのみであるので、計測処理を行い、のちにLayoutを行います。これはAndroidのLayoutメカニズムの基本です。
addViewInLayoutで追加する際に、利用しているViewは、AdapterのgetViewメソッドによって提供されるものです。このときにconvertViewとしてViewが提供されます。このViewは先ほどの可視領域外にでてしまったViewを格納したところからリサイクル用に提供されたり、また存在しない場合にはnullで提供されます。

大まかな流れはこんな感じです。Adapterには、今回説明していない実装を行うことが求められるメソッドがあります。

静的なIDはデータベースで言うところのIDであり、通常使われるPositionは抽象的な意味でリストの「位置」を表します。またこれを抽象的な意味での「位置」とすることで、内部でソートを行っても、フィルタリングをかけても、とにかく該当するデータを取得する、表現を行うViewを提供することの実装部分をうまく隠蔽できます。

ただ、よくできたInterfaceなのですが、AdapterViewからの実装がめんどくさいです。AbsListViewはそもそもの実装がY-座標系指向が強いので、X-座標系向けではありません。

10/11/2010

継承関係ということについての試論

どうもJudaです。
ちゃんとOOPを学習していないのですし、該当する書籍を読み込んでいないのでなんともいえませんが、軽症という事象にはいくつかの要因があるのではないかと推察します。

  1. インターフェイス

  2. 実装

  3. データ構造


この3要素があると思う。
よく考えずにこれらをごっちゃにして継承をさせていくとどこかで使いにくさが出てくるように思われる。さらにいうとデータ構造の部分が特に危険だと感じています。
インターフェイスの継承は一般的なOOPでの利用に関して合致しそうです。多態性の文脈に合致します。
実装の部分は、特化したインターフェイスを生かし続ける形で実装しないといけないのでとてもナイーブな感じがします。
データ構造に関しては実に困難さを覚えるのですが、多態のためにサブクラス分化するとあまりにクラスが分割されすぎる気もしますし、それぞれの振る舞いがデータ構造に依存しているときにはやりようがないのですが、うまくまとめないと理解しにくくなりすぎる感があります。
どうすりゃいいんだ。OOPはあまりに強い困難さを覚えます。設計ということに向いていないのかもしれない、、、データ構造と実装があまりに緊密になっている感が。。。でもデータ構造が抽象された実装はアルゴリズムとなっているなぁ。。。
インターフェイスはある意味ではさらにもう一層上のレベルでの継承関係をあらわすのかもしれない。
そう仮定すると、COMやインターフェイス志向の記述は、実装を含めたデータ構造を抽象化したものであり、これは一層抽象度が高いので変更可能性強度が増すと思う。

2/22/2010

Silverlightの開発環境

どうもJudaです。

Silverlightの開発環境はここをみれば、一発。だってここが本家だもの。

2/21/2010

Silverlightのためのいくつかの話

どうもJudaです。

Silverlight SDK Sample Browser
SDKのサンプル集であり、実行形式になっているものばかりだから、とてもわかりやすい。。。とは言い難いが、それでも基本的な使用方法はよくわかるので参考にされたし。

基本的な使用方法のなかで、全画面表示を考えている場合には、とても重要な情報があります。
全画面表示サポート
使い方に関しては、書かれているがこれはとてつもなくわかりにくい。
基本的な開発をVisualStudioで行うことを考えていると思いますが、この場合に重要になるのは、基本的にはProjectNameで作られたXAMLやcsファイルに対して変更を加えていきますが、この場合にSampleとして上げられているものはどこに導入すればいいのかさっぱりです。
@IT - [Silverlight 2]Silverlight アプリケーションをフルスクリーンで表示するには?
この記事を利用すれば比較的簡単にボタンに対して処理を使っていけましょう。
これで導入ができますが、これよりも詳細なものの設定は個別のイベントに対しておこないます。
しかしここで4未満においては入力関係に対しては制限がかかります。4からはOut of Browseモードでのみ全画面時にキーボード系の入力を受け付けるみたいですが、これがIn Browseでつかえるのかは謎です。たぶんできないのだと思います。
ほかにも全画面表示の解除を行うためのキーのバインドを変更することができません。ちょっと調べただけですが。
Pageクラスがこの全画面関連のメソッドをもっているので、このクラスを継承もしくは利用するクラスを作成すれば良さそうですが、それでも連携部分に対して不安が残ります。

簡単に調べただけなので、これらの情報の確度は不定です。

11/14/2009

携帯電話類のアプリケーション開発

どうもJudaです。

最近ようやくAndroidとiPhoneの開発のエントランスのやってきました。

とりあえずそれぞれの環境設営について。

iPhoneではXCodeとiPhone SDKをつかって開発します。というか、Mac以外での開発は出来ないと思います。権利的な問題だと思うのですが、MacOSはApple以外の機器へのインストールを許諾していませんし、そのMacに付随するものとしてXCodeが提供されています。まぁ、最近は徐々に状況が変化してきていますが、それはおいておきましょう。(個人的にはVisualStudioもしくはEclipseでWindows上で開発できるといいなぁと)
まぁ、XCodeのインストールはApple Developer ConnectionでDownloadできるのでまぁ、それにしたがってもらえば大丈夫です。最新は XCode 3.2.1?でSnow Leopardが最低Verになるので、Leopardは3.1.4になると思います。

次にAndroid。こいつは結構厄介です。というか、厄介でした。JavaのVMが複数インストールされている場合には、それがいろいろと面倒なことを引き起こしてくれちゃうのでそれはおいおい。
とりあえず標準的な開発環境としてEclipseを選択します。この場合にさきほどのVMの設定が悪さをする場合があるので、うまく動かないときには、-vm オプションでVMを指定すれば、Eclipseがうまく起動する、はず。とりあえず、こういうサイトのほうが詳しいので、こちらをどうぞ。EclipseならAndroid Plug-inが使えるので、導入を検討する価値アリです。
Eclipseが動くのを確認してからAndroidSDKを入れるほうが無難だと思います。
そしてAndroid SDKは本家からDownloadします。
その後はAndroid SDK.exeを起動するのですが、まず注意があります。起動させた場所にSDKの中身を持ってくるので、はじめから入れたい場所で起動することをオススメします。これはあとでEclipseでAndroid SDKへのパスを設定する部分があるので、そこを注意しないといけません。
それでまぁたぶんうまくSDKの実行ファイルからはうまく動かないので、Settingの「Force http://..」な項目をチェックしてRefreshするとたぶん該当するデータを手に入れることが出来るようになると思います。そしてこのインストール作業なのですが、結構失敗していたりするので、ログを確認して、何度かトライしてみて下さい
インストールできたら、Eclipseと関連付けるためにWindowのPreferenceのAndroidの項目でSDKへのパスをさきほどインストールしたパスで指定すれば、文句は言われなくなります。
これで環境はほとんどできました。最後にAndroidはiPhoneと違いターゲットが多様なので、それにあわせたVirtualDeviceの作成が必要になります。本家のサンプル「Hello,Android」でAVDと表記されている項目はConsoleでの設定ですが、Eclipseで設定している場合、もしくはSDKの起動ファイルから起動できる「Android SDK and AVD Manager」を使用すればGUIで構築が出来ます。Virtual Devicesという項目がAVDの構築と管理を行ってくれます。AVDはAndroid Virtual Deviceの略称ですね。
本家のサンプルはAPI2で作るように書いてありますが、これは使うAPIで整合性が取れていればいいと思っていいと思います。あとサンプルをつくった後にRunすると思うのですが、ここにも注意があります。それは、「とにかく実行されるまで時間がかかる」ということです。Eclipseなどは実行をスムーズに行えるのですが、よくみるとステータスバーのシーケンスパーセンテージの上がりが遅いことが分かると思います。ここが特に不便ですが、分かっていれば、動かないと不安にならなくてすみます。

とりあえず環境設営はこんな感じです。
あとは各種サンプルを探すほうがよいと思います。