投稿

ラベル(android)が付いた投稿を表示しています

Android・・・テキスト描画あれこれ, ascent(), descent()等

Androidのテキスト描画に必要なTipsをメモ。 存在に忘れがちな横方向のAlignや、意外に正解がわかりにくい縦方向のセンター合わせ等。 ascentとdescent Paint及びFontMetricsで取得可能なascentとdescent。 テキスト描画の原点となるbaselineから上方向の高さがascentで、下方向の高さがdescentとなる。 baselineを割ってdescent領域に入るのは例えば小文字の"j"等だ。 しかし理解しづらいのは、ascentが負の値であることだ。 これは、画面の座標系を思い浮かべてbaselineを(0,0)と考えるとイメージしやすい。 つまり、画面上にはみ出すascentが負、画面内に入るdescentが正、となる。 テキスト用Paintの作成 TextPaint tp = new TextPaint(); tp.setColor( Color.WHITE ); // アンチエイリアスON tp.setAntiAlias( true ); // 塗りつぶしのみ。STROKEを入れると太くなる。STROKEだけだと中抜き tp.setStyle( Style.FILL ); // テキストのフォントサイズ。Paintに直接指定する場合、Density等の考慮が必要。 tp.setTextSize( 11f * density ); 縦方向にセンター合わせ @Override protected void onDraw(Canvas canvas) { // 領域の高さ int areaHeight = getHeight(); FontMetrics fm = tp.getFontMetrics(); // フォントの高さを求める float fh = fm.descent - fm.ascent; // センター合わせにしたあと、Baselineの位置を求めるためにdescentを引く float ty = (areaHeight/2f) + (fh/2f) - fm.descent; canvas.drawText( "text", 0, ty, tp ); } 横方向に原点を右端で設定する...

Bluetooth開発

AndroidとPCを組み合わせて何かできそうだ。。 AndroidでのBluetooth実装 http://www.atmarkit.co.jp/fsmart/articles/android35/01.html PCでのBluetooth実装 http://www.hoge256.net/2009/03/322.html AndroidとMacをSPPで接続 http://d.hatena.ne.jp/propella/20120403/p1 HIDプロファイル・・・PICでHIDデバイスを作成する? http://phys.sci.hokudai.ac.jp/LABS/yts/pic/GB002/hid.html PCをHIDデバイス(マウス)として認識させる実験 http://homebrew.jp/show?page=1203 AndroHid・・・AndroidをHIDデバイスにする? http://code.google.com/p/androhid/wiki/AndroHid やはり、L2CAPを実現するのに、NDKでBlueZを組み込むのか。

Android:端末にインストールされているパッケージ名

端末にインストールされているパッケージ名を参照したい時はadbを使用する。 adb.exeの場所 AndroidSDKのplatform-tools よくある例) C:\Program Files\Android\android-sdk\platform-tools 使い方 コマンドラインで以下のコマンドを使用する。 (adb.exeにパスが通っている必要あり) adb shell pm list packages 抽出したい場合 例)パッケージ名にyyyが入っているもののみ表示 adb shell pm list packages|find "yyy" 参考 http://d.hatena.ne.jp/shima111/20110903/p1

Android...EditText

EditText、地獄だぜ。 ヒントになるサイトをまとめてみた。 文字数制限、入力制限、ヒント表示 EditTextの文字制限/ヒントとかについて EditTextに文字数制限を課す方法。(xmlだとandroid:maxLength) EditText edit = new EditText( this ); edit.setFilters( new InputFilter[]{ new InputFilter.LengthFilter(2) } ); ソフトキーボードを消す http://y-anz-m.blogspot.jp/2009/12/android.html ソフトキーボードを表示する ソフトキーボードの制御 ※「別アクションでソフトキーボードを制御」の項、参照 inputMethodManager#showSoftInput(); TextViewのソース http://tools.oesf.biz/android-2.3_r1.0/xref/frameworks/base/core/java/android/widget/TextView.java

auのxoomでAndroid4.0キタ

auのxoomでandroid4.0のバージョンアップが始まった! 驚いたことにgoogleplayでバージョンアップの案内が表示された。 勝手に表示されたから最初何の事か解らなかった(^_^;) その時に、オプションとして別のバイナリが選べるような表示が出ていたがロクに調べないで普通のダウンロードを開始してしまった。 もしそれが英語版だったら、そっちの方が良かったと若干後悔… (Jerrybeansの時、アップデート早いだろうから…) インストールはいつも通り特に問題なし。 これでついにウチのxoomもAndroid4.0だ! 全体の動作が軽快だが、 何と言ってもChromeだ。動作が軽快すぎる!今までの苦労は何だったのか!? この投稿もChromeでbloggerを開いて入力しているが、まるでネイティブアプリのごとく軽快だ。 但し、物理キーボードによる日本語入力が出来なくなってしまった模様。 コチラは引き続き調査する必要がある。

Android:ArrayAdapterでaddを使う時

ArrayAdapterでaddを使ったら、 java.lang.UnsupportedOperationException なる例外が発生。 ArrayAdapter#addって使えないかなーと一瞬意気消沈したが、 これを使うにはList渡しのコンストラクタにて、"ArrayList"を渡さないといけないことが判明。 今までは、配列渡しのコンストラクタを使っていたのでできなかった。 そうか。。 そういう実装にした気持ちはなんとなくわかるが、そういうことはAPIドキュメントにはっきり書かないと判らないと思うのだが。 自分の英語力が低いからかもしれないが、何回見てもそういったことは書いていないように思えるのだが~

Googleドライブにアップデート?

ウチのXOOMに来たアプリのアップデート通知の中に なぜがウワサの「Googleドライブ」が混じっていた。 インストールしたつもりもないのにアップデートとはこれいかに、と思っていたら ヤツは「Googleドキュメント」がバージョンアップしたものらしい。 なんか一気にテンションダウン(笑) AndroidのGoogleドキュメントって役に立った試しがない・・・ あの中身って結局WebKit使ったブラウザ画面だし中途半端感が否めなかったんだよね。 「Googleドライブ」はどうなることやら。 そして、しかも、「Googleドライブは準備中」とかいって使えなかった(笑) -- 2012/04/27 追記 準備中が解除されて使えるようになった。 第一印象は…Googleドキュメントっぽい(笑)

Android:Dialogとメモリ解放後の起動

Androidの2.xでDialogを使うとき、onCreateDialog()をオーバーライドして作成するのが正しいやり方っぽい。 その機構を使うことでDialogのリソース管理をActivityが行なってくれるようになり、アプリ側ではその解放処理を考える必要が無くなるからだ。 解放処理以外にも、例えば、ボタンがタップされた時にダイアログを開くとした時、自前でDialog#show()すると、連打された時、その分ダイアログが開いてしまうが、Activity#showDialog()の機構を利用すると、以前のDialogを閉じてから開いてくれるなど、排他処理も行なっている。 そして、Activity#removeDialog()というものがあって、それは管理しているDialogのリソースを解放してくれるらしいのだが、ここでワナ発見。 アプリが復帰する時、ダイアログは閉じておきたいと思い、Activity#onPause()でActivity#removeDialog()してみた。 しかしながら恐ろしいことに、メモリクリア後にアプリを再開しようとした時、Androidったら、表示する必要のないはずのダイアログをActivity#onCreateDialog()で作成しに行くじゃありませんか。 ・・・と思ったら、Android4.0だけかもしれない。 手元のAndroid2.3.5端末ではonCreateDialogを呼んでいないようだ。。 どちらにしても、Activity#onCreateDialog内の処理も、「メモリクリア後の再開」を考慮しておかなくちゃなのね・・・

Logicool ワイヤレス スピーカー アダプターを買ってみた

イメージ
以前書いた ロジクールの「 普通のスピーカーをBluetooth対応にしてしまうアダプター 」を買ってみた。 大きさは、下の写真にあるように食塩より一回り大きいような大きくないようなそんな感じだが結構厚みを感じる印象。 というわけでリビングに置いてあるKENWOOD K'sの外部入力に接続してみた。 電源がACコードしかないことにちょっとびっくりしたが、最終的にアンプに付いている外部コンポーネント用コンセントを使うことで、アンプの電源を入れている時だけ電源が入るようになったので全く問題なし。 XOOMとのBluetooth接続も全く問題なし。 音質も特に問題は感じなかった。 (細かいところを聞き分ける耳もないので。。) それにしても便利な世の中になったものだ~。 コードで接続することなく、CDも不要になり、Youtubeをリビングのアンプで聴けるなんて。

Android:解像度違いの画像が正しく認識されない

hdpiの端末のはずなのに、なぜか「drawable-hdpi」ではなく「drawable-mdpi」の画像が使われてしまう現象が発生していて、しばらく悩んでいた。 ようやく解明した。 AndroidManifest.xmlのanyDensityの設定がfalseにされていた。 (参考ページ: http://y-anz-m.blogspot.com/2010/02/android-multi-screen.html ) これだから 保守不能ソース ってヤツは。。 ちなみに、trueにしたら、あちこちの画面のレイアウトが崩れた(笑) -- 2012/04/26追記 autodensityがfalseの場合、ToastにDensityが適用されないという問題も発覚。 つまり、Toastがやけに小さくなってしまうということだ…。

Android:メモリ解放とアプリ再開の問題の再現

Androidったら、アプリをVMごと停めてしまうくせにそのActivityから再開しようとするニクいヤツだ。 アプリの先頭ではないのにClassLoadから始まっているってことが、 絶妙なイヤらしさ。 メモリ解放したら強制的にアプリの最初から動いてくれれば話は単純なのにね。 (もしかしたらAndroidManifest.xml辺りでそういう設定できそうだな・・・) さらにイヤらしいのは、その動作しても大丈夫だよねっていう確認方法だ。 一体いつメモリが解放されるのかわからなくて、他のアプリを色々起動してみても 再現しなくて諦めたころ発生するという、非常にムキーッ!状態になる。 しかし、よくあるメモリ管理ツールでメモリ強制解放を行うと、その状況が再現できることに気づいた。 (もしかしたら知らないツールがSDKに既に存在していたら悲しい限りだが・・・) 例えば「メモリブースター」っていうアプリの「ワンクリック高速最適化」っていう機能。 (なんだか怪しいので本当はインストールしたくないのだが・・・) これを使ったら一発で発生した。 あとはバグを直すだけだ。。 -- 2012/03/15 メモリブースターはAndroid4.0(104SH)で動かなかった。FMR Memoryは動いた。

なんでもBluetoothスピーカー

今までありそうでなかった 「普通のスピーカーをBuletooth対応にしてしまう」 アダプターがロジクールから発売されたらしい。 http://plusd.itmedia.co.jp/pcuser/articles/1203/06/news030.html これがあったら、家のステレオとXOOMが タップ一発で無線接続できてしまうということだ! すげぇ、CDプレイヤーが本格的に不要になる。。 それに家の中を移動するのにスピーカーとXOOMを持つ必要がなくなる …まぁ、そんなのはワタクシだけだと思うが (「 CREATIVE D100を買ってみた 」参照) 音質はどうだかわからないが、 シャレで買ってもいいくらいの値段だ。 (逆に言うとあまり期待できそうにない程度の値段だ…) -- というわけで、買ってみた記事はこちら → Logicool ワイヤレス スピーカー アダプターを買ってみた

Android:角丸でグラデーションのDrawable

まあ、Androidのサンプル「ShapeDrawable1.java」にあったんだが、 コピペしやすいようにしてみた。 float[] outerR = new float[] { 4, 4, 4, 4, 4, 4, 4, 4 }; ShapeDrawable d = new ShapeDrawable( new RoundRectShape(outerR, null, null) ); d.getPaint().setShader( new LinearGradient(0, 0, 0, 25, new int[] { 0xFF707070, 0xFF000000 }, null, Shader.TileMode.CLAMP ) );

Android:stateに応じてTextの色を変更する・・・ColorStateList

テキストの色をButton等のstateに合わせて変えることを、 xmlでやらずに自前でやるにはColorStateListを作成し、それをsetTextColorすれば良い。 以下、select状態で色が変わるTextViewを作成するサンプル TextView text = new TextView(this); text.setTextColor( new ColorStateList( new int[][] { new int[]{ android.R.attr.state_selected }, new int[]{ -android.R.attr.state_selected }, }, new int[] { Color.argb(0xff,0xff,0xff,0xff), Color.argb(0xff,0x8f,0x8f,0x8f), } ) );

Android:TextViewがどうしても2行になってしまう件

TextViewに日本語の文字列をセットしてWRAP_CONTENTで表示するのって普通だが、 文字列が長いわけでもないのに、なぜか、最後の文字が改行して、2行表示になってしまうことが時々ある。 ちなみにAndroid2.3.5だ。 3.xや4.xでは検証してない。もしかしたら発生しないかもしれない。 また、xmlでレイアウトしたものではなく、自前でsetTextSize()にて設定を行った時の話だ。 調べてみると、どうもwidthが1pixelだけ足りない。 もしやと思って、フォントサイズを見てみると奇数になっていた。 それを+1して偶数にしたら、改行せず1行表示になった。 なるほど。 残念だ。フォントサイズには注意しよう。

Android:TextのBoldについて・・・特に日本語

2.x系でしか試していないが、日本語のBoldフォントが載っている機種は少ない。 載っている機種はSHARP製の端末だけのようだ。 これはつまり、せっかくBold設定にしても、ほとんどの端末では英語だけBoldで日本語は細いってことだ。 3.xや4.xでは改善されているのだろうか。 ところで、TextViewにBoldを自前で設定するやり方は下記の通り。 TextView text = new TextView(this); text.setTypeface( Typeface.DEFAULT_BOLD, Typeface.BOLD );

Android:ViewのSizeをレイアウトに頼らない・・・onMeasure

Viewのサイズをレイアウトに頼りたくない時、レイアウトに頼れない時、 そんなときはonMeasureをオーバーライドしやがれ。 下記はButtonのサイズを100x100にするサンプル Button btn = new Button( context ) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // このようにして自身のサイズをコントロールできるぞ setMeasuredDimension( 100 , 100 ); } }; 次は、親のレイアウト指定がWRAP_CONTENTだったら自分のサイズを主張する現実的なサンプル。 Button btn = new Button( context ) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); float density = getResources().getDisplayMetrics().density; int hmode = MeasureSpec.getMode(heightMeasureSpec); int wmode = MeasureSpec.getMode(widthMeasureSpec); int hsize = MeasureSpec.getSize(heightMeasureSpec); int wsize = MeasureSpec.getSize(widthMeasureSpec); // 高さを求める int height = 0; if( hmode==MeasureSpec.EXACTLY ) { height = hsize;...

Android:stateに応じて切り替わるdrawable・・・StateListDrawable

Androidでは、pressやfocus等のstatement別にdrawableを指定するdrawableが作成可能だ。 xmlでは<selector>で指定を行う。 ところで、こういったリソースをxmlで書くのは非常にしんどいので事ある毎にコードで実装しているのだが、<selector>を自前で実装する方法を研究してみた。 それを実現するのは、StateListDrawableというDrawableだ。 下記は、StateListDrawableをButtonの背景色に適用するサンプル。 Button btn = new Button( context ); Drawable tomei = new ColorDrawable( Color.argb(0,0,0,0) ); Drawable tap = new ColorDrawable( Color.argb(0xff,0xff,0,0) ); Drawable normal= new ColorDrawable( Color.argb(0xff,0,0xff,0) ); StateListDrawable d = new StateListDrawable(); d.addState( new int[]{ android.R.attr.state_pressed }, tap ); d.addState( new int[]{ android.R.attr.state_focused }, tap ); d.addState( new int[]{ android.R.attr.state_enabled }, normal ); d.addState( new int[]{ -android.R.attr.state_enabled }, tomei ); btn.setBackgroundDrawable( d ); 面白いポイントは以下の通り。 orじゃなくて配列で指定するんだね。 xmlでいうfalseを指定するにはマイナス(minus)にするんだね!(1時間くらい探した・・・) ところで、Drawable.setStateの使い方がよくわからん。 例えば、下記の設定を行なってみたが効かない。 // 効いていない...

SHが4.0(ICS)に順次VerUpしていくらしいぞ

SHARPは、ハイエンド端末を順次Android4.0(ICS)にバージョンアップしていくようですよ。 http://plusd.itmedia.co.jp/mobile/articles/1202/13/news083.html いよいよ4.0シフトが本格的に始まりつつありますね。 早く、ウチのXOOM(AUの)のバージョンアップ、始まらないかな・・・

android.bat

for Windows ビルド出来るTarget及びTargetIDをリストアップする > android.bat list targets SDK Managerを起動する > android.bat update sdk プロジェクトをビルドするantを作成する > android.bat update project --path プロジェクトのパス これで作成されたBuild.xmlをantで実行するのだ。 罠 「Please provide a --target to the 'android.bat update' command.」 eclipseで使っているSDKと、Command lineで使ったSDKが異なることに気が付かず、古いTargetがDownloadされてなくてProjectのBuildに失敗する問題に30分悩んだ罠。ちなみにupdate projectに渡す--targetのtargetIDは、「android.bat list target」で得られるものであってAPI番号とは異なることに注意。