アンドロイドは線をきっちり引かない

  • 投稿日:
  • by
  • カテゴリ:

なんとなく、Androidの上で動作するプログラムとか書いているんですよ。いえ、これは完全に趣味です。まあ、Flex/AIR用に Eclipse導入したから、簡単にAndroidのSDKに手を出せた、という側面はありますが。

で、とりあえず、先に書いたように Hello Worldを作ってみたわけですが、そこで止まっていても仕方がないので、何か、もう少し形になるものを、と思ったわけです。

既に、モテンダス作れとかって声もあるので、Google Calendarとの連携方法とか調べたりもしました。が、そこではなく、違うものから、とりあえず、やって見ようかな、と、思ったんです。

それが、何かはさておき、実現には、昔のBASICのpaint命令互換の機能が必要なんです。あれ、何だか、判っちゃった? と、とにかくそれが必要なんです。Android SDKは、非常に、グラフィックス回りの機能が充実していますが、それでも、境界色で囲まれた領域を塗り潰すような命令はありません。

なければ、作ればいいので、とりあえず、android.graphics.Canvas を拡張して、paint(int x,int y, int fgc, int bc)という関数を持たせてみました。ロジック自体は、昔、PalmOSに実装したやつの移植で済ませました。

変に凝ったものより、枯れてる方が、問題起きにくくて、いいしね。……なんて、思っていたんですが、起きました。延々と何かをし続けています。デバッガをつなげてみたら、塗りはじめの点を入れておくキューが、偉い勢いで増殖中 oTL

ロジック移し間違えたか? と、コードをレビューしても問題点は見つからず。おかしい、と、頭を捻るも解は得られず。最後は力業で、境界付近のビットマップの内容を表示させながら、走らせて、ようやく原因を発見。

結論からいうと、Canvas.drawLine()は、何故か、終端の一ドットを残すのです。渡している、Paintの設定が悪いのかと、いじってみても変わらず。仕方がないので、終端は強制的に、Bitmap.setPixel(x,y,c)して、逃げて見ました。

すると、所々、色が漏れて塗られてしまった部分がでているものの、無限に同じ所を塗りつづける現象は消えました。結局色漏れを完全に無くすには、線をきっちり書くように自分で、drawLine()を実装しなおすしかないようです。

幸い、直線の描画ルーチンも、その昔、Cマガジン用にPC-9821の拡張グラフィックスを使うために書いたロジックがあったので、それを流用して、書き直しました。すると、今度はエミュレータでは我慢の限界近い低速さで、実機での速度が気になるほどに。いや、まあ、僕のVAIO TypeGが、想像を絶する非力さなのが主要因で、実機では問題ない速度で動くと思いたいのですが…。

とにかく、アンドロイドは、結構仕事が雑。しかし、線をきっちり最後まで引かないなんて、なんて人間っぽいんだ! 中身はR田中一郎じゃあるまいな?