ラベル android の投稿を表示しています。 すべての投稿を表示
ラベル android の投稿を表示しています。 すべての投稿を表示

2015年4月5日日曜日

RIFFT 1

開発環境:AndroidStudio1.1.0

簡単にリフ(音楽のフレーズ)を記録しておけるようなアプリを作ろうかと。
セッションで役立ったりするので。


・音を鳴らす

音ファイルの挿入は実エクスプローラ上でコピーしてオブジェクトエクスプローラのRawへ直接コピー(ドラッグ等は不可、なんだそら)

MediaPlayerは長めの音系、単発でクリック音出したいならSoundPoolを使う。

sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
 第一引数:ロードするファイルの数
 第二引数:ストリームのタイプ
  ストリームタイプ一覧
  AudioManager.STREAM_ALARM アラーム音
  AudioManager.STREAM_MUSIC 音楽音
  AudioManager.STREAM_NOTIFICATION 通知音
  AudioManager.STREAM_RING 着信音
  AudioManager.STREAM_SYSTEM システム音
  AudioManager.STREAM_VOICE_CALL 通話音
 第三引数:サンプリングレートのクオリティを指定します。(デフォルトは0)

(http://ougiitirou.web.fc2.com/AndroidMain/bgm.htmlより)

onCreateでリソースを読むよりアプリがアクティブになるonResumeで読み込みし、
onPauseで解放、がメモリ節約になるそう。ふむふむ。
したがって、onCreateはいたってシンプルにレイアウト読み込みとボタンのリスナ登録のみ。

後々読み込む音が増えてきたときに見直しが必要かも。


・簡易メトロノーム作成まで

4・8・16の3パターンを用意して実験。
ボタンを3つ作っておく。
あと小節区切りの4つ目の音リソースも追加。
ついでにSoundpoolのロードファイル数を1→5へ。
onClick時のイベントでcase分岐、条件はR.idで。

メトロノームなのでBPM調節機能もプログレスバーで実装する。

BPMは、1分間に鳴る四分音符の数なので、BPMがたとえば100なら
音符の間のsleep(msec) = 60sec / 100 = 0.6秒(sleepの引数は600)となる。
これでメトロノームまでは完成。




とりあえず。

2013年5月4日土曜日

Context達。

androidには様々なところで出てくるけど、よく悩まされる存在。

API叩くときに渡すContextは、

・getApplicationContext
・getActivityContext
・this

が使われる。

ActivityContextとthisは同義、Activity毎に存在。
割と良く破棄(解放)される。

ApplicationContextはアプリケーション固有の値。
基本はstatic。

Activity内で渡すなら基本は前者を使って、
どうしても静的に保持したいなら後者かな。


で、そもそもContextって何さ!
→アプリケーションのパーミッション、リソース情報にアクセスするためのインターフェース。

(参照:http://yuki312.blogspot.jp/2012/02/thisgetapplicationcontextactivityapplic.html)


うーん、なんだかわかったようなわからんような・・・

今回はとあるAPIを呼ぶ際にgetApplicationContextを使うとnullpoが返ってきて落ちるので、
どうしたもんかと思っていたが、ActivityのOnCreateに処理移動したら普通に動いた。

Bandleわたってこないとダメなのかなぁ?
不明。

2012年12月31日月曜日

activity_main.out.xml



そう、今日も奴の足音が聞こえる・・・・
プロジェクトをクリーンしてもクリーンしても・・・


activity_main.out.xml
activity_main.out.xml
activity_main.out.xml
activity_main.out.xml
activity_main.out.xml



バイオハザード3の追跡者かお前は。


ということで。
会社で使ってるLet's NoteにAndroidアプリの開発環境を入れました。
うわーいこれで暇なときにプログラム書けるぞー と思いきや、なんかビルドするといつの間にやらこんなんが毎回生成されてビルドできません。
2年ぐらい前に入れた開発環境だとまったくそんなことなかったのにな・・・

まず発生したときの対処法。
普通に削除しても消えないので。

・プロジェクトをクリーン
・出来てるxmlを憎しみと共に削除
・編集中のxmlを全部閉じる
・再ビルド


なんですが、たまに全xmlを閉じてても上記現象が発生します。
困ったなぁ。唯一、-cleanで起動した直後のビルドは発生しないんですが、毎回そんなこともしてられない。うーん


で、http://android96.blog.fc2.com/blog-entry-23.htmlを参考にパッケージエクスプローラ側でxmlソースを「選択(反転)」しないようにビルドすると・・・・おぉ、奴が生成されない。

ただ、今のとここれでなんとか行ってるんですが、それでもたまに現れます。
一応、

・ビルド時にエディタ側でxmlを開かない
・自動的にビルドオプションを外す
・パッケージエクスプローラ側のlayout階層を閉じておく

辺りを心がけたら頻度は下がった・・・かな?

それにしてもなんなのこれ・・・くそー




activity_main.out.xml
activity_main.out.xml
activity_main.out.xml
activity_main.out.xml
activity_main.out.xml

2012年7月9日月曜日

制作物。

今まで作ったものたち。
備忘録として書いてく。
なんか作ったら更新。

※Android

・バーチャファイター技表アプリケーション
→http://goo.gl/opCea

csvからデータを読んでDB化して、SQLでクエリ発行してデータ表示。
全キャラ分はとても大変だった・・・インストール数は延べ3000件。
初めて作って評価してもらって、とても嬉しかった。感慨深い。



が、韓国語のパクリアプリが出現。
→http://goo.gl/zR1oF
レイアウトが似てるというかCSVをハングル置換しただけじゃねーかぐらいの勢い。
ほんと嫌いあの国・・・



・バーチャファイター統合アプリケーション
→http://goo.gl/pJ0WJ

上記のアプリを全キャラ分統合して付加情報を加えたもの。
技術的にはフリック機能を追加したり。
200円で売り出して、60件程売れた。
とても嬉しい。


・バーチャファイター統合アプリケーション(English)
→http://goo.gl/awjt0

上記のアプリを英訳したもの。
技術的には特に変わらず。
こちらは250円で売り出して、売上20件程。



2012年6月6日水曜日

SQLからデータ読んだ際に改行文字が機能しない

うまくできないよー
えーんえぬ えーんえぬ  

なーんちゃって。


いや2日ぐらい詰まりました。
色々調べたところ、Javaの内部で使われている文字コードの問題と発覚。
参考:ttp://edywrite.blogspot.jp/2010/12/androidsqlite.html

内部の文字コード用のバイトデータを生成してあげて、それをUTF-8でマッチングさせるために
置換すればよいとのこと。
cursor使ってるんで


String = new String(("\n".getBytes("iso-8859-1")),"UTF-8")
cursor.getString(idx).replaceAll(String,"\n")

な感じ。
なるほどー。

2012年5月29日火曜日

開閉ListView

ListViewのオプションであんだろーと思いきや別ビューだった、残念

ということで使うのはExpandableListViewとやら。
親→子の概念を持ったリスト。
adapterセットに使う引数は驚きの9個!9個ですよ奥さん!

(ttp://dev.classmethod.jp/smartphone/basic-android-component-03-expandablelistview/)
を全面的に参考。

親と子の定義。



    ArrayList<HashMap<String, String>> parent
         = new ArrayList<HashMap<String,String>>();

    ArrayList<ArrayList<HashMap<String, String>>> child
         = new ArrayList<ArrayList<HashMap<String,String>>>();

親グループ定義。ここでは一個だけ。


    HashMap<String, String> group1 = new HashMap<String, String>();
    groupA.put("group", "成人病");


ぶち込み。

parent.add(group1)


子定義。


  ArrayList<HashMap<String, String>> childList = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> child1 = new HashMap<String, String>();
    child1.put("group", "成人病");
    child1.put("name", "肝硬変");
    HashMap<String, String> child2 = new HashMap<String, String>();
    child2.put("group", "成人病");
    child2.put("name", "糖尿");


子と親の結びつけはキーで結ぶ。ここで言うgroup。
ぶち込み。

childList.add(child1)
childList.add(child2)

listをぶち込み。

childData.add(childList)


adapter。


       SimpleExpandableListAdapter Exadapter1 = new SimpleExpandableListAdapter(
               getApplicationContext(),
               groupData,
               android.R.layout.simple_expandable_list_item_1,
               new String[] {"group"},
               new int[] { android.R.id.text1 },
               childData,
               R.layout.onedata,
               new String[] {"name"},
               new int[] { R.id.rowtext1});

親と子で使うレイアウト変えてるけどまぁこんな感じ。
コンテキストのあとはデータ、レイアウト、キー値、レイアウトのリソースIDの順。
子要素の数だけhashmapをnewする必要があるのでDB絡める実装はちょい考え中。
うーん。



2012年5月23日水曜日

csvからDB作成

ポイントは2つ。

・csvファイル保管場所

project/res/rawに保管。
読まれたくない場合はassetsに突っ込むがその場合普通にパス指定しただけでは読めないので注意。


・リソースID指定

読む際はR内に定義される先頭ポインタ?じゃないかもしれないけどID値を取得。
resouceid = r.raw.resource;
InputStream is = resource.OpenRawResource(ResourceID);

こんなん。


DBに詰めるのはInsertHelperを使った。

参照:ttp://d.hatena.ne.jp/ipreachable/20110129/1296326520

一個困ってるのが、csv内にエスケープシーケンス(\n)を書くと(\N)になってしまう点。
うーむ。

2012年5月17日木曜日

ListViewの罫線を変える

divider="色コード"
dividerHeight="サイズ"

で変更可。
サイズはピクセル指定可。

2012年5月6日日曜日

背景の透過

背景画像を指定

android:background="@drawable/oops.jpg"

で、「manifest」に移ってandroid:theme="@android:style/Theme.Translucent"を追加。


2012年4月29日日曜日

SDカードにコピー

AndroidアプリをSDカードにコピーするのは以下の設定。


1.AndroidManifestの、

・Install location→auto
・minSDKVersion→8以降(2.2以降の機能であるため)


2.マーケット側でコピー防止機能をオフ(これいらんかも)


2012年4月25日水曜日

listview色変え

苦戦した。

viewを新規作成する際は


tmp1 = text.getText().toString();
if(tmp1.equals("target")){
text.setTextColor(Color.CYAN);
data.get(position).setcfl(true);
VH.tv.setTextColor(Color.CYAN);
VH.cfl = true;
}else{
text.setTextColor(Color.RED);
data.get(position).setcfl(false);
VH.tv.setTextColor(Color.RED);
VH.cfl = false;
}

こんなんでいいんだけど、問題は再利用する際。
今回はviewholderを使用しているので、
view.getTagした後、data.get(position).gettextの値によって、
「holderのデータ(ここでは色情報)」を書き換えてやる必要がある。


やったー。

2012年4月23日月曜日

続き。

にっちもさっちもニッチ戦略もプッチモニも行かなくなったので、
とりあえず別解決手段を探した。

何の話かってーとListActivityにヘッダ付ける話。

解決してみると簡単な話でしたOTL


ListActivityも、通常Activityと同じようにまずsetContentView。
で、そのレイアウト内を、

Relative

Linear
ヘッダ
/Linear

Listview
/Listview

/Relative

と書いてあげればOK。
注意点はListActivity内のListIDを@id/android:list"とすること。
じゃないとRuntimeExeption食らう。
ListActivity側で、id.listを決めうちで呼んでるらしい。


あと覚えておくこととしては、Listactivity内のListは
this.getListViewで拾える。ListView周りをいじりたい時はこっちのがいいかも。

あー詰まった。
よしよし、でもすっきり。

2012年4月7日土曜日

バックキー長押しからのリストダイアログ表示からの酒飲みたい

既にオプションメニューに毛色の違うメニューを実装しているので、
違うインターフェースを模索してみた。

・画面長押しorダブルタップ
・ハードウェアキー長押し

あたりがぱっと浮かんだけど、リストビューを使ってるから前者難しそう。てことで後者。

オプションキーとホームキーは仕様上使えないぽい。
のでバックキーに割り当てよう。

まずバックキー長押し取得。
(参考:http://techbooster.jpn.org/andriod/device/4053/)
onKeyLongPressを実装する。
拾ったeventのキーコードを取得して定数と照らし合わせる。わぁ素敵。

public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        Toast.makeText(this, "バックキー長押し", Toast.LENGTH_SHORT ).show();
          return true;
    }

テストでトースト表示。
で、次。

イベントの目的はというと、画面レイアウトの変更をしたいので、リストダイアログを呼び出すことにする。


 AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("選択");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                }
            });
 AlertDialog alert = builder.create();
 alert.show();

こんな感じ。
itemsはstr[]。

長くなったんで次の記事へ。

2012年4月3日火曜日

androidアプリアップデート方法

こんなとこで詰まるのは自分くらいじゃないかと結構悲しくなったけどメモ。
デベロッパー画面内に明示的にアップデートボタンのようなものは無く、
manifest.xml内のVersionCode等、バージョンを表す数値を増やしたapkをアップすればよい。
証明書は同じもので。


いやーハマった。
ちなみに反映までは体感的に30分ほど。

1本出来るまで。

バーチャファイターという大分息の長いゲームをやってるんですが、
今回はゲーセンで見るための技表アプリを作りました。

アプリURL: http://t.co/JNynFpVh

 ひとまず形になるまでに超えた山を備忘録としてメモ。


1.リストビューのカスタマイズ

最初から実装されているリストビューではレイアウトが合わなかったのでひとまずこれをカスタマイズする手段を探した。

「リストビューをカスタマイズする」
http://techbooster.org/android/ui/1282/
を参考にカスタムビューを作成。


2.SQLとの連携

次に、ハードコーディング回避のためにDBとしてデータを持ちたかったのでSQL連携部分について実装。

「AndroidでSQLiteのDB操作をするための基礎知識」
http://www.atmarkit.co.jp/fsmart/articles/android06/android06_1.html
を参考にした。
ただ結局内部でexecqueryを行っているためにほぼハードコーディング状態w
何とかしたい・・・


とりあえず上記2つかな。


※未実装項目

・不利フレーム(数値)によって色分け
楽に出来るかと思いきやそうでもないことが判明。
色を変えたポジションの情報保持がうまくいかん。
四苦八苦中。

・ヘッダの固定
これも苦戦中。
xmlを連結させて動作させてるため、別レイアウトが必要なのかなーと思いつつ放置中。

・表示項目をユーザで任意設定
これはまだ取り掛かってないけどやってみたい。
インターフェースどうしよっかなぁ。

2012年4月1日日曜日

オプションメニュー表示

galaxy s使ってますが、ホームボタンの横の2つのボタン名称が分からず、イベント実装のための参考文献がなかなか探せなかったのでメモw

向かって左がメニューボタン、右がバックボタンっていうらしいよ・・・
勝手に便利ボタンと戻るボタンとか名づけてすいませんでした・・・

で、実装。
メニューつけたいActivity生成時に、

public boolean onCreateOptionsMenu(Menu menu) {
   boolean ret = super.onCreateOptionsMenu(menu);
   menu.add(0 , Menu.FIRST , Menu.NONE , “その1″);
   menu.add(0 , Menu.FIRST + 1 ,Menu.NONE , “その2″);
   return ret;
}


を実装する。
(参考:http://android.roof-balcony.com/activity/optionmenu/)
項目追加はmenu.addしてあげればよいだけ。シンプル。
引数はグループインデックス、アイテムインデックス、表示順序変更パラメータ、内容。
クリック時のイベントは、
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
で実装。
item.getitemidインターフェースでどれ選んだか判定。


2012年3月27日火曜日

view背景色変更

android:background"色コード16進数"

を追加。それだけ。

onCreateは(ある意味)勝手に呼ばれる

onCreate時にDBからデータを引っ張ってくるアクティビティの挙動がおかしかったのでメモ。
どうやら端末の向きが変わったりした時にも呼ばれるらしい。
AndroidManifest.xmlにandroid:screenOrientationと追加すると固定される模様。

参考:「Android : onCreate()」
http://elix-jp.sakura.ne.jp/wordpress/?p=125


【追記】
画面スクロール時にもSQLクエリ発行されてるっぽいので何だろうと調べてみた。
ていうかSQLどうこうの話じゃなかった。oops。

android内部でメモリ節約のためにデータを表示するviewを再利用してるとのこと。
よって、初めてview生成する時だけnewして、実体が既にあるviewが渡されたら情報を保存して、再利用に備えてやる必要がある。
nullが来たら同じデータ型を持つviewholderを実装してあげて、
    static class ViewHolder{
        TextView tv1;
        TextView tv2;
        TextView tv3;
    }

タグ情報付加。
convertView.setTag(VH);

実体あったら
VH = (ViewHolder)convertView.getTag();


ハマった。