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から描画した場合、テキストは右上に見切れ、画面には表示されません。







Androidでカメラを使う(1)

| 2012年5月8日火曜日
・参考
『素人のアンドロイドアプリ開発日記』
http://andante.in/i/%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%A2%E3%83%97%E3%83%AA/android%E3%81%A7%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82/

1.SurfaceViewを継承し、SurfaceHolder.Callbackインターフェースを実装する


2.マニフェストにカメラのパーミッションを追加する
applicationのタグの前に追加します。
<uses-permission android:name="android.permission.CAMERA">
また、プレビューを表示する予定のActivityに、以下のパラメータを追加
android:screenOrientation="landscape"

3.実装していく
今回扱うのは初めて扱うものばかりだ。
Cameraも初めてなら
SurfaceViewも初めて
ActivityのsetContentViewにSurfaceViewが入るのか!


4.確認
基本的なところを書き終えたので確認。
Emulatorを起動・・・おや画面が真っ白だ。

調べてみたところ、Emulatorではカメラの映像は映らないらしい。
なので実機、MEDIASさんを取り出し接続!

実行、そしてエラー。

    parameters.setPreviewSize(width, height);
でRuntimeException。
中身は、setParameters failed。
ググってみると、有名なエラーで、カメラ開発初心者に対する洗礼のようだ。
Android2.0から発生する仕様で
・参考
『理系のためのTIPS集』
『hiroki.kanaの日常』

getSupportedPreviewSizes();というメソッドで正しく取得できるようだ。
    List<Size> previewSizes = myCamera.getParametors.getSupportedPreviewSizes();
    Size size = previewSizes.get(0);
    parameters.setPreviewSize(size.width, size.height);
    

これで、はじめに紹介した参考サイト『素人のアンドロイドアプリ開発日記』さんと同じ状態のものができました。
引き続き、
『素人のアンドロイドアプリ開発日記』さんの記事を参考に勉強を進めていきます。