投稿

サイズの異なる文字列をボタン上に配置する

ヒントは ここ にあったけど、惜しい、XMLからstrings.xmlのリソースを指定したいのにこの方法だとダメ。あと一歩足りない。 というわけでやり方はこちら。 MultiTextViewというカスタムViewを作成します。 仕様的にはmainTextとsubTextを指定可能とし、それぞれ、テキスト、文字サイズ、文字色を指定可能とします。 まずは、XMLから指定可能な拡張attrを定義します。 valuesフォルダ配下にattrs.xmlファイルを配置して中身をこんな感じに。 -attrs.xml 次に、MultiTextButton.javaで実装。 -MultiTextButton.java public class MultiTextButton extends Button { public MultiTextButton(Context context, AttributeSet attrs) { super(context, attrs); initAttribute(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiTextButton); CharSequence mt = a.getText(R.styleable.MultiTextButton_mainText); CharSequence st = a.getText(R.styleable.MultiTextButton_subText); if ( mt != null ) mainText = mt.toString(); if ( st != null ) subText = st.toString(); mainTextSize = a.getDimension(R.styleable.MultiTextButton_mainTextSize, 10.0f); subTextSize = a.getDimensi...

うちの子Ver.1.1

NewbornクラスにSensorListenerを追加しました。 眠い時はZ軸方向加速度を与えてやると寝ます。 値の絶対値が閾値より小さいと例外発生します。 @Override public void onSensorChanged(SensorEvent event) { // 眠い時のみ発動 if ( this.state == STATE_SLEEPY ) { // 加速度センサー if ( event.sensor.getType() == Sensor.TYPE_ACCELEROMETER ) { // Z軸方向のみ対象です float z = event.values[SensorManager.DATA_Z]; // 閾値を超えないとやり直し if ( Math.abs(z) { sleepy = 0; throw new HumanException(OUTPUT_CRY); } else { // 一定回数閾値を超え続けると寝ます sleepy++; if ( sleepy > SLEEPY_THRESHOLD ) { setState(STATE_SLEEPED); } } } 結構感度高いです。

うちの子

生後35日目です。 10分で実装したのでちょっと雑な動作をします。 未試験です。 package com.awwa.newborn; import Human; public class Newborn extends Human { public static final int OUTPUT_NO_CRY = 0; public static final int OUTPUT_CRY = 1; public static final int STATE_HUNGRY = 0; public static final int STATE_WET = 1; public static final int STATE_SLEEPY = 2; private int state = STATE_HUNGRY; private int outputState = OUTPUT_CRY; @Override private static void life() { while( true ) { try { switch(state) { case STATE_HUNGRY: throw new HumanException(OUTPUT_CRY); break; case STATE_WET: throw new HumanException(OUTPUT_CRY); break; case STATE_SLEEPY: throw new HumanException(OUTPUT_CRY); break; } Thread.Sleep(10800000); } catch (HumanException ex) { outputState = ex.getMessage(); publishState(outputState); } finally { continue; } } } }

ViewをTranslateして表示する

イメージ
Button01の背後からButton02をスライドアニメーションさせて表示する。 なんでこんなの実装しなきゃいけないんだろう、とか思いつつ。 個人的には趣味じゃないですが、やらなきゃいけない状況だったのでやってみました。 結構ハマりつつ。 ◇完成イメージ こんな感じでButton02がアニメーションする。 → → ◇やり方 「layout.xml」はこんな感じ。 ポイントはButton02を乗せたSlidingPanelクラスをButton01の下に配置します。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 前面に表示されているボタン --> <Button android:id="@+id/Button01" android:text="Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <!-- 下にスライドするLayout(初期状態はGONE) --> <com.awwa.animsample2.SlidingPanel android:id="@+id/panel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_below="@id/Button01" android:...

EditTextPreferenceを拡張する

EditTextPreferenceをそのまま使いたくないこともあるわけです。 例えば、Preferenceに永続化させるときは文字列を暗号化さたい、とか。 そんな時はEditTextPreferenceをextendsしてonPrepareDialogBuilder()をオーバーライドしちゃえばいいわけです。 こんな感じ。 ※値は"CCC"として保存するけど、EditTextに表示する際には"CCC converted"と表示して、保存するときは再び"CCC"で保存。 これに暗号化と復号化を組み合わせればいいわけですね。 @Override protected void onPrepareDialogBuilder(Builder builder) { super.onPrepareDialogBuilder(builder); // get value from xml file String value = getText(); Log.d(TAG, "value : " + value); // convert value value = value + " converted"; // display converted value this.getEditText().setText(value); // event handler when select ok button builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // re-convert value and save to xml setText("CCC...

Viewを丸く切り取る

イメージ
Viewを丸く切り取るには、onDraw()をオーバーライドしてclipPath()してあげたクラスを作ってあげればOK。 こんな感じ。 public class ClipImageView extends ImageView { private static final String TAG = "ClipImageView"; public ClipImageView(Context context) { super(context); } public ClipImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ClipImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private Path pathCircle = new Path(); /** * Viewのサイズ確保 */ protected void onSizeChanged(int w, int h, int oldw, int oldh){ // 丸いパス pathCircle.addCircle(w/2, h/2, 24, Path.Direction.CW); } /** * 描画処理 */ protected void onDraw(Canvas canvas) { // パスに沿って切り取り canvas.clipPath(pathCircle); super.onDraw(canvas); } } あとは、これをLayoutにぺたっと貼り付け。 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_...

Android2.1(X06HT/Desire)でハマったこと

SmartTraining 2.2.1にバージョンアップするにあたり、3点ハマりました。 いずれもAndroid2.1側の問題かと思います。 ムカついたのでメモメモ。 1.画面OFF時に加速度変化イベントが取れない。  あちこちで書いていますが、開発者の間では Issue3708 として認識されているAndroid側の不具合という認識の問題です。様々なアプリケーションもこれにより影響を受けており、Smart Alarm ClockやCardioTrainerなどの超有名どころアプリケーションもこの問題を解決できていません。この中の投稿でBrunoさんという方が、問題を回避する方法を提案しています。実際にX06HT(Desire)とNexus Oneで試してみましたが現象が改善されませんでした。やり方が悪いのか、何なのかわかりませんが、Brunoさんの方法を試しても改善されないという報告がいくつか見られたので、この方法は疑わしいと考えています。  Android側を弁護するとしたら、バックグラウンドでセンサーを不用意に扱うアプリケーションがバッテリーを大量消費してしまうことを回避する、という意味ではこの動作変更は成功しているかもしれません。しかし、バックグラウンドでの動作に制限をかけるのであれば、よりバッテリ喰いのGPSにはこういった制限がありません、これでは中途半端でしょう。明らかに旧バージョンからダウングレードしています。  回避方法としては、PowerManagerでSCREEN_DIM_WAKE_LOCK以上に設定します。SCREEN_DIM_WAKE_LOCKというのは、画面の液晶が暗くなっているが、OFFではない状態です。当たり前ですがバッテリかなり喰います。かつ、この状態でポケットに入れたりすると当然誤操作の元となります。SmartTraining的にはこの対応はありえないので、結局「残念なお知らせ」を表示してこの問題がAndroid側の問題であることをアピールするに留めました。 2.画面OFF時にTimerが動作しない(ことがある)。  上記問題と少し似ているのですが、画面OFF時にTimerが動作しません。「しないことがある」としているのには、いくつか条件が必要なためです。こちらで確認している条件としては、以下の条件でTimerが動作しません。 ・画...