【Androidアプリ作成】使える!逆引きAndoroidリファレンス

Android関係でアップしたコンテンツを分かりやすくINDEXにまとめてみました。
ブログ内の記事にリンクしていますのでご活用ください。
(記事を追加したらここも随時追加していきます^^)

基本
01.Androidプロジェクト作成手順

XMLを利用したレイアウト関連
01 android:layout_weightってなに?
02 android:layout_widthとandroid:widthは何が違うの?
03 英語と日本語で使い分けるには?
04 android:orientationプロパティのverticalとhorizontalの違い
05 wrap_contentとfill_parentの違い
06 ボタンのカスタマイズ
07 LinearLayoutを使ったボタンレイアウト
08 @stringで定数管理!
09 @drawableでデザイン管理!
10 @colorで色管理!
11 imageViewクラスで画面背景を設定する
12 ボタンをもっと角丸にするには?
13 解像度の違う端末に対応させるためには?
14 HorizontalScrollViewの使い方
15 TableLayoutの使い方
16 TableLayoutでborder(罫線)をつける方法
17 単純なコードでエラーがでるときに確認したいポイント
18 @stringをHTMLタグを使ってデコレーションする

HTML5関連
01 HTML5 Application cache を使ってみる
02
Android の WebViewのキャッシュについて

広告関連
01 広告表示にはViewGroup#addViewを使え
02 ネット収入に確定申告は必要か?

アニメーション関連
01 Canvas#setMatrixを使ったアニメーション

サウンド関連
01 SoundPoolを使う際の注意点

パフォーマンス関連
01
描画が遅い時はSurfaceViewを使って高速化
02 エミュレータの起動を高速化する方法

データベース関連
01 SQLiteを使うには?(前編)
02 SQLiteを使うには?(後編)

デバッグ関連
01 Androidのデバッグについて
02 InflateExceptionが出た場合の対処法
03 logcatを使って効率良くデバッグをしよう
04 シミュレータ画面を横表示に切り替える方法

機種関連
01 Android解像度別機種一覧表
02 解像度の低い端末をサポート対象外にする方法

アプリリリース情報
01 百マス計算
02 刹那の極意
03 計算ドリル
04 Touch the Elements
05 ブロック崩しdeトレハン!
06 百マス計算FAN
07 BLACK JACK
08 色コードブック

その他Android関係記事
01 fontの入れ替え
02 Androidの音声認識の罠
03 Androidの時計アプリを作ってみた
04 SIMフリー版GALAXY Sの日本語化に挑戦
05
デベロッパーになると詳細なインストール状況がわかる!

2011.10.26
神森 真昼
NECO

最終更新日
2013.5.9

検索ワード:逆引き 入門 辞典 ハンドブック 初心者 マニュアル

Androidアプリ鋭意製作中!

現在、Androidアプリを制作しています。

ブログで製作中に気付いたことやわかったことをまとめていき、訪問してくださった方々と情報が共有できたらと思います。(どちらかというと備忘録要素が強いですが^^;)

もし作ったアプリやその他コンテンツにご興味を持っていただけたのなら
下記も運営サイトになりますので、ご参照いただけたら幸いです。

[ DARK DRIVE ダークドライブ(Androidアプリと小説と波の世界)]
http://www.darkdrive.net/

タイトルそのままですが、Androidアプリ、小説、Web関係のことついて書いています。
コンテンツはまだ少ないですが、充実させていく予定です。

[ Flashゲーム ルカヤのクッキング ]
http://www.darkdrive.net/game/index.html

ゲームウォッチっていう昔任天堂が出していたシェフのゲームみたいなのを作りました。
ぜひ、ハイスコアとってランキングにぬりかえてください^^

今後ともどうぞよろしくお願い致します。

2011.6.3
神森 真昼 & NECO
(記事は二人で書いています。プロフィールはこちら>>http://www.darkdrive.net/android)

【Androidアプリ作成】android:layout_weightってなに?

表題そのままですが、この属性を聞いたとき、
layoutの重さだから、きっとレイヤーのことで、軽いと上位レイヤーで、重いと下位レイヤーに
なるんだ!と勝手に想像してみましたが、実際には全く異なります。

layout_weightはオブジェクトを配置するするときの占有比率を指定するときに使います。

つまり指定されたlayout内で、
「このAボタンは1番大きい、BボタンはAボタンの半分で、CボタンはBボタンの半分かな」みたいな
ものを指定したいときがあったとしたならこのlayout_weightが役に立ちます。

例1)

Aボタン
android:layout_weight="1"

Bボタン
android:layout_weight="0.5"

Cボタン
android:layout_weight="0.25"

こうすれば比率が変わります。
ちなみに1を指定すると100%を指定したことになります。
占有比率なので、割合で1は100%に相当しますからねw

ここで、じゃあこうしたらどうなるか・・・

例2)

Aボタン
android:layout_weight="0.5"

Bボタン
android:layout_weight="0.5"

Cボタン
android:layout_weight="0.5"

1ではなく0.5と全部指定。これで、先ほどの例1で指定したBボタンの大きさに
なるかというとなりません。
なぜなら全部同じだと差がないので、全て同じ大きさになります。

一番最初にはじめて組んでもなぜか下に出てこないというときは
このlayout_weightの重み付けがうまくいっていない可能性があります。
私はこれで最初つまづきました。だってHTMLだったら無条件で下に改行されて表示されるから
出てこないわけないという先入観があったからです:;

困ったらとりあえずlayout_weight="1"で指定してみてください。

2011.6.2
神森真昼

【Androidアプリ作成】android:layout_widthとandroid:widthは何が違うの?

すごく最初に気付いて、悩んだこと。
一つのタグにwidthが2種類設定できて、それがどういう区別をしていいのかわからないこと。
・・・というより、widthだけでなく、他のにもいろいろlayoutがつくかつかないかで変わるものが
たくさんあった。

要するにこういうことになるわけですが・・・

■android:width
「android:width」を記述したビューの中身に対して幅を指定する。

■android:layout_width
「android:layout_width」を記述したビューが、親要素に対して自分の幅を指定する。

言葉で説明するとどうもかたっくるしくて分かりづらい。
他の要素でも、layoutがつくかつかないかで親への指定か、子への指定かが変わるのです。

これはカンタンに作ってやってみるしかないです!
習うより慣れろって感じですが、ぜひやってみてください^^
(そして、いい覚え方を教えてください、すぐどっちがどっちか忘れてしまうので(笑)

2011.5.31
神森 真昼

【Androidアプリ作成】英語と日本語で使い分けるには?

もうすぐ6月ですね。。
初回リリースのアプリを6月上旬に公開しようと考えていますが、
間に合うか不安です。

私の作っているアプリも日本語と英語をサポートしています。
しかし、特別なプログラムを書いたり必要はAndroidに関しては全くありません。

Androidは自分のスマートフォンの地域(Locale)設定によって
英語のXMLを読むか、日本語のXMLを読むか決めることができるのです。

そのXMLファイルを保存するのがvaluesフォルダです。(resフォルダの下に入ってます)
ここに英語で表記したいものを指定を入れておきます。

日本語で表記したいのはvalues-jaフォルダに入れます。

ちなみにdrawableフォルダもdrawable-jaとつけることで振り分けが可能です。

プログラムとしては、日本語の指定がなかったら(values-jaに指定ファイルが入ってなかったら)
英語の方を読みに行くという感じです。

values > string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="game_name">GAME_TITLE</string>
<string name="game_genre">Shooting</string>
</resources>

values-ja > string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="game_name">ゲームタイトル</string>
<string name="game_genre">シューティング</string>
</resources>

呼び出し側のXML

<TextView
android:text="@string/game_name">
</TextView>

これだけで切り替えができます!
ぜひぜひ試してみてください^^

2011.5.28
神森 真昼

SoundPoolを使う際の注意点

Androidでサウンドを鳴らす際は、
BGM(曲)用途ならMediaPlayer、SE(効果音)用途ならSoundPoolを使うのが簡単。

今回、SEを鳴らすためにSoundPoolを使ったところ、
音声がループ回数を1回(=ループしない)でのみ再生する指定をしたにも関わらず、
2回ループしてしまう現象が発生した。

/res/rawに入れる音声データを、
WaveフォーマットからOgg Vorbisで変換することで
2回ループして再生されることはなくなった。ヾ(・∇`)ノ゙

wavに関しては、「16bitの44KHzのモノラル」でも、
「8bitの22KHzのモノラル」でも不具合が出たので
どのフォーマットでも発生しそうな気がする。
Galaxy S(GT-I9000)で発生したため、端末の問題な気もするけど、
アプリに組み込むリソースは初めからoggで用意したほうが
トラブルしなさそうだと思った。

・・・

ちなみに、Wave→Oggの変換には以下のツールが便利。

■oggdropXPd
http://rarewares.org/index.php
Downloads > Ogg Vorbis > oggdropXPd

ツールを起動してファイルをドロップすれば、
ドラッグ元に出力される。
複数ファイルもまとめて変換できる。
変換中の魚のアニメーションが可愛い・・・

2011.5.28
NECO

【Androidアプリ作成】android:orientationプロパティのverticalとhorizontalの違い

昨日はwrap_contentとfill_parentについて書きましたが、
これもまた基礎で今日は、android:orientationプロパティについて書きます。

つまり結論からいうと

■ 縦方向にレイアウトしたい場合:vertical
■ 横方向にレイアウトしたい場合:horizontal

という感じです、(^▽^)ノ

verticalとhorizontalどっちも聞きなれなくて、
アプリ作成はじめはどっちがどっちかわからなくて覚えれなかったけど、
Webコーディングをやったことある人は
「vertical-alignは縦方向の位置を設定するから・・・
vertical-align・・・vertical・・・お、これは縦方向だ!!」

これで覚えましょう!!!(>▽<)>ラジャ

ちなみに横方向(horizontal)で指定して、<Button>をたくさん作成して、
そのボタンがwrap_contentが指定されていた場合にどうなるか・・・
horizontalはあくまで横方向なので、ボタンが大きいと画面から切れてしまいます。
(つまり自動的に改行されるものではないので注意が必要です。
それは、verticalも同じですが・・・)

もし、ボタンで埋め尽くされた画面を作りたいと考えているのならば、

//大きな大きな箱です。(A)
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

//大きな箱です。(B)
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:layout_weight="1">

//横方向に欲しい数だけ<Button>要素を記述します。
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="1"></Button>

//<Button>要素書き終わったら(B)を閉じます。
</LinearLayout>

これ以降は縦方向に欲しい数だけ(B)の要素をコピペしてください。
そして(A)を閉じます。それだけなんです。
ボタンを作るのは意外にカンタンなんですよ♪

2011.5.27
神森 真昼

【Androidアプリ作成】wrap_contentとfill_parentの違い

Androidアプリを制作してみてまず最初はレイアウトから入ると思われますが、
wrap_contentとfillparentというのが設定できます。

この違いをしっかりとわかってないと大変です(@_@;)

wrap_contentは文字列長に大きさが変化します。
文字列が長ければ長いほど、それに従い大きくなるのです。

fill_parentは画面の大きさに合わせてぴったりあわせてきます。
もしも横の長さが300mmだとしたら300mmの長さのボタンが作成されます。
並列にボタンを3つ作成し、fill_parentとした場合は
100mmの長さのボタンが3つできるわけです。

つまり画面にぴったしのものを作ってくれるのですね。
わたしはそんな感じに解釈して適当に作っていますが・・・だめ??(:;)

2011.5.26
神森 真昼

【Androidアプリ作成】ボタンのカスタマイズ

<Button>タグを使ってbuttonを作っていってもよいが、
私はデザインにもこだわりたいので、定義ファイルを別で作成してみました。

定義ファイルを一つ作成しておくと、それを呼び出し定義すれば
ボタンのデザインのテンプレートが完成です(^ω^)ノ
ちなみにこれを使えばボタンを透過にすることもできちゃいます!
透過する場合は色指定を6桁ではなく、8桁で指定。
#40000FFみたいな。

ちなみに今回は今作成中のアプリのボタンデザインです。
3つの<item>タグはそれぞれプレス(押したとき)、フォーカス(hoverしたときだが、マウスなどのポインティングデバイスで操作しなければ実行動作がわからないという罠)、ノーマル(何にもないとき)の設定です。

■game_select_button_stateful.xml

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

//押したときの設定
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="5dip" />

//グラデーションの指定(gradient)
<gradient
android:angle="90"
android:endColor="#CBF1A2"
android:startColor="#9EE33B" />

//ボタンのパディング
<padding
android:top="10dip"
android:bottom="10dip"
android:left="0dip"
android:right="0dip" />

//ボタンの線
<stroke
android:width="3dip"
android:color="#80D580" />
</shape>
</item>

//クリックしたときの設定
<item android:state_focused="true">
<shape android:shape ="rectangle">
<corners android:radius="5dip" />
<gradient
android:angle="90"
android:endColor="#CBF1A2"
android:startColor="#9EE33B" />
<padding
android:top="10dip"
android:bottom="10dip"
android:left="0dip"
android:right="0dip" />

<stroke
android:width="3dip"
android:color="#80D580" />
</shape>
</item>

<item>
//何も条件がない通常の設定
<shape android:shape ="rectangle">
<corners android:radius="5dip" />
<gradient
android:angle="90"
android:endColor="#A9E665"
android:startColor="#80BF2B" />
<padding
android:top="10dip"
android:bottom="10dip"
android:left="0dip"
android:right="0dip" />
<stroke
android:width="3dip"
android:color="#339933" />
</shape>
</item>
</selector>

・・・とこんな感じの定義ファイルを作成しましたら、
あとは使いたいところで呼び出すだけです。

■呼び出したいところのXML

<Button
android:background="@drawable/game_select_button_stateful">
</Button>

2011.5.25
神森 真昼

Canvas#setMatrixを使ったアニメーション

画像を変形したり、図形を回転させたりする際には

Canvas#setMatrixを使ったほうが便利なことがある。

例えば、星型の図形を回転させるアニメーションを作りたいとする。

手順は以下のようになる。
(1) 事前に星の図形(Path)を作っておく。
(2) 回転角を求める。
(3) 回転行列を作成する。
(4) Canvas#setMatrixする。
(5) Canvas#drawPath

高度なことをするにはOpenGL ESを使う必要があるが、
簡単な図形であれば、手軽に変形できるので便利。

完成すると以下のような図形がくるくる回転する。

20110519_and

・・・そして下のが実際のコード。
■Activity
package net.darkdrive.android.sample.matrix;

import android.app.Activity;
import android.os.Bundle;

public class SampleMatrixActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleMatrixView(this, null));
}
}

■View
package net.darkdrive.android.sample.matrix;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.View;

public class SampleMatrixView extends View
{
// Paint
private final Paint paint;

// 星の図形
private final Path star;

public SampleMatrixView(Context context, AttributeSet attr) {
super(context, attr);

// 背景色は黒
setBackgroundColor(Color.BLACK);

// Paint
paint = new Paint();

// (1) 事前に星の図形(Path)を作っておく。
star = new Path();
star.moveTo(0.0f, -1.0f); // 大きさは半径1の円に収まる大きさにしておく
for ( int i = 1; i <= 10; i++ )
{
float rad = 2 * (float)Math.PI * i / 10;
float len = (i%2==0)?1.0f:0.5f;
star.lineTo(FloatMath.sin(rad)*len, -FloatMath.cos(rad)*len);
}

// 再描画タイマーを作成
Message msg = timerHandler.obtainMessage(INVALIDATE);
nextTime = SystemClock.uptimeMillis();
timerHandler.sendMessageAtTime(msg, nextTime);
}

private static final int INVALIDATE = 1;
private long nextTime;

private static final int INTERVAL = 1000/20; //20fps

private int frameCount = 0;

// タイマーイベント
private final Handler timerHandler = new Handler() {
@Override
public void handleMessage(Message msg){
if ( msg.what == INVALIDATE )
{
// (2) 回転角を求める。
frameCount++;

//画面を再描画
invalidate();

msg = obtainMessage( INVALIDATE );
long current = SystemClock.uptimeMillis();
if ( nextTime < current )
{
nextTime = current + INTERVAL;
}
sendMessageAtTime(msg,nextTime);

nextTime += INTERVAL;
}
}
};

/**
* 描画
*/
@Override
protected void onDraw(Canvas canvas)
{
Rect clip = canvas.getClipBounds();
int width = clip.right;
int height = clip.bottom;

Matrix project = new Matrix(); // 単位行列を生成

// (3) 回転行列を作成する。
project.postRotate(frameCount); // 回転
project.postScale(250.0f, 250.0f); // 縦横250倍に拡大
project.postTranslate(width/2.0f, height/2.0f); // 画面中央寄せ
project.postConcat(canvas.getMatrix()); // 元の描画位置を加算する

// (4) Canvas#setMatrixする。
canvas.setMatrix(project);

// (5) Canvas#drawPath
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.argb(255,255,255,0));
canvas.drawPath(star, paint);
}
}

・・・・投影用の行列を書き換えただけじゃん!と言われたら、ぐうの音も出ないですが。。。

2011.5.19
NECO