Custome View ハマりどころ

| 2012年5月24日木曜日
OnDrawを拡張して、描画機能を持ったViewを作りたいなと思い、サンプルを作成していました。

・参考『素人のアンドロイドアプリ開発日記』様
http://andante.in/i/%E6%8F%8F%E7%94%BB/view%E3%82%92%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81%E5%86%8D%E6%8F%8F%E7%94%BB%E3%82%92%E3%81%99%E3%82%8B%E3%80%82/

まずは、上記サイトを参考にまずは描画機能をお勉強。
だいたいOnDrawに描画処理を書いておけば大丈夫みたい。

で、自分用のサンプル作成。

機能としては、
・四角描く処理を埋め込んだView(Viewを継承したクラス)を、メインのViewに埋め込む。
・メインのViewにはシークバーを設置して、埋め込まれたViewの四角の透明度を変更する。

これだけ。
これだけで意外とはまって、結果的に一週間ぐらい悩んでしまいました。


【ハマりどころ】
・カスタムViewを埋め込んだxmlに表示される謎のエラーメッセージ(←メイン)
Custom view * is not using the 2- or 3-argument
        View constructors; XML attributes will not work
Viewを継承したクラスで、コンストラクタが足りていない場合に出るメッセージ。
*は対象のクラス名
このメッセージが表示されていると、カスタムViewが正しく表示されない。

(今読んだらちゃんとコンストラクタって書いてあるんだな)


      ■解決方法
      ・参考
『IGOE Solutions』(※英語)
Custom view * is not using the 2- or 3-argument View constructors; XML attributes will not work

Viewを継承したクラスで、スーパークラスのコンストラクタをすべて実装すること。

これだけでした。
解決方法は簡単だけど、こんなことでエラーが起こるなんて可能性が思い浮かばないかぎり、解決は難しいですね。このブログに辿りつけてよかった。
 
・画面の再描画
初歩です(でした)。
対象のカスタムViewのinvalidate()メソッドを呼び出す。
これが無いと、onDrawメソッドが呼び出されずに、再描画処理がされません。

・描画位置
テキストの描画位置で特にハマりました。
(図添付予定)

drawTextでは、指定した座標から右上にテキストが描画されます。
このため、座標0,0から描画した場合、テキストは右上に見切れ、画面には表示されません。







0 コメント:

コメントを投稿