2009年5月29日金曜日

Android - 再描画 -

onDraw() メソッド以外の場所で描画関数を呼び出してはならない。
その代わり、
invalidate()  メソッド
を呼び出して、再描画が必要な領域にマークを付ける。
将来のある時点で、ウィンドウマネージャがすべての
再描画が必要な領域を統合して、 onDraw() を呼び出す。

2009年5月28日木曜日

Android - Input -

キーボード、Dパッド、タッチスクリーン、トラックボールなど
さまざまな入力形式の可能性がある

KeyCode of DPAD

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
select(selX, selY - 1);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
select(selX, selY + 1);
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
select(selX - 1, selY);
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
select(selX + 1, selY);
break;
default:
return super.onKeyDown(keyCode, event);
}
return true;
}


タッチパネル

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN)
return super.onTouchEvent(event);

select((int) (event.getX()) / width), (int) (event.getY() / height));
game.showKeypadOrError(selX, selY);
return true;
}



More...

Android - Text -


@Override
protected void onDraw(Canvas canvas) {
Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG);
// フォントの高さ
foreground.setTextSize(height * 0.75f);
// アスペクト比
foreground.setTextScaleX(width / height);
foreground.setTextAlign(Paint.Align.CENTER);

FontMetrics fm = foreground.getFontMetrics();
float x = width / 2;
float y = height / 2 - (fm.ascent + fm.descent) / 2;

canvas.drawText("Hello!", 100, 100, foreground);
}


public float getFontMetrics (Paint.FontMetrics metrics)
Return the font's recommended interline spacing, given the Paint's settings for typeface, textSize, etc. If metrics is not null, return the fontmetric values in it.

public float ascent
The recommended distance above the baseline for singled spaced text.
public float descent
The recommended distance below the baseline for singled spaced text.


More...

Android - 2D graphics -

2D グラフィックスライブラリは android.graphics

Color クラス
Paint クラス
Canvas クラス
View クラス
Path クラス
etc..

More...

Color

アルファ、赤、緑、青 (ARGB) の4つの値で色を表現する。
アルファは透明度で、
アルファ = 0 : 透明
アルファ = 255 : 不透明

・色の指定方法
Colorクラスの静的定数

int color = Color.BLUE; // 青
int color = Color.argb(127, 255, 0, 255); // 半透明の紫


XML リソースファイルで定義



#7fff00ff



・色の参照

XML ファイルで付けた名前で参照

android:background="@color/color1";


Java コードで取得

int color = getResources().getColor(R.color.color1);


getResources() : 現在の Activity に対応する ResourceManager クラスを返す
getColor() : Resource ID に対応する色を Manager に問い合わせる



Paint

グラフィックスの描画で必要なスタイル、色、その他の情報を管理

・描画色を設定

Paint cPaint = new Paint();
cPaint.setColor(Color.LTGRAY); // light gray


Canvas

描画対象のキャンバスを表現

・キャンバスに描画する
View.onDraw() メソッドをオーバーライドする

static public class GraphicsView extends View {
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// Drawing commands
}
}



Path

直線、曲線、矩形などのベクター描画コマンドを持つ

・円形パスを定義

@Override
protected void onDraw(Canvas canvas) {
Path circle = new Path();
circle.addCircle(150, 150, 100, Path.Direction.CW);
Paint cPaint = new Paint();
Paint tPaint = new Paint();
cPaint.setStyle(Paint.Style.STROKE);
cPaint.setColor(Color.YELLOW);
tPaint.setColor(Color.WHITE);
canvas.drawPath(circle, cPaint);

final String ss = "Happy Birthday To You !!! Happy Birthday To You !!! Happy Birthday To You !!! Happy Birthday To You !!!";
canvas.drawTextOnPath(ss, circle, 0, 20, tPaint);
}


Direction.CW : right hand




// 色設定
paint.setColor(Color.argb(255,255,0,0));
// アンチエイリアス
paint.setAntiAlias(true);
// 塗りつぶし
paint.setStyle(Paint.Style.FILL);
// 塗りつぶしなし
paint.setStyle(Paint.Style.STROKE);
// 枠線の幅
paint.setStrokeWidth(2);
// 直線
canvas.drawLine(25,5,25,5+40,paint);
// パス
Path path = new Path();
path.moveTo(55+ 0,5+ 0);
path.lineTo(55+30,5+ 5);
path.lineTo(55+10,5+20);
path.lineTo(55+40,5+25);
path.lineTo(55+ 0,5+40);
canvas.drawPath(path, paint);
// 四角
canvas.drawRect(new Rect(0, 0, 40, 40), paint);
canvas.drawRect(0, 0, 40, 40, paint);
// 角丸四角
canvas.drawRoundRect(new RectF(0, 0, 40, 40), 10, 10, paint);
canvas.drawRoundRect(0, 0, 40, 40, 10, 10, paint);
// 円
canvas.drawCircle(100, 100, 150, paint);


PathEffect クラスを使うと面白い効果が作れる

2009年5月27日水曜日

Android - リストからの選択 -

android.util.Log クラスは、Android のシステムログに
メッセージを出力するメソッドを持っている

・Log.e():エラー
・Log.w():警告
・Log.i():情報
・Log.d():デバッグ
・Log.v():冗長

Eclipse でこのログをみるには
[Window] -> [Show View] -> [Other...] -> [Android] -> [LogCat]




More...

Sudoku/res/values/strings.xml



Sudoku
Android Sudoku
Continue
New Game
About
About Android Sudoku
\
Sudoku is a logic-based number placement puzzle.
Starting with a partially completed 9x9 grid, the
objective is to fill the grid so that each row,
each column, and each of the 3x3 boxes
(also called blocks) contains the digits
1 to 9 exactly once.

Exit
Settings...
Sudoku settings
s
Music
Play background music
Hints
Show hints during play
Difficulty
Easy
Medium
Hard



リストの形式を記述

Sudoku/res/values/arrays.xml




@string/easy_label
@string/medium_label
@string/hard_label




Sudoku/src/org/example/sudoku/Sudoku.java

package org.example.sudoku;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;

public class Sudoku extends Activity implements OnClickListener{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View continueButton = this.findViewById(R.id.continue_button);
continueButton.setOnClickListener(this);
View newButton = this.findViewById(R.id.new_button);
newButton.setOnClickListener(this);
View aboutButton = this.findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
View exitButton = this.findViewById(R.id.exit_button);
exitButton.setOnClickListener(this);
}

public void onClick(View v) {
switch(v.getId()){
case R.id.about_button:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.new_button:
openNewGameDialog();
break;
case R.id.exit_button:
finish();
break;
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.settings:
startActivity(new Intent(this, Settings.class));
return true;
}
return false;
}

private void openNewGameDialog() {
new AlertDialog.Builder(this)
.setTitle(R.string.new_game_title)
.setItems(R.array.difficulty,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
startGame(i);
}
})
.show();
}

private static final String TAG = "Sudoku";

private void startGame(int i) {
Log.d(TAG, "clicked on " + i);
// start game here
}
}


Exit ボタンを押したとき、Activity を破棄するために
finish()
を呼び出す



New Game をクリックすると難易度の選択ポップアップが表示される



Android Menu action

MENU ボタンを押したときの動作を追加する

Sudoku/res/value/strings.xml



Sudoku
Android Sudoku
Continue
New Game
About
About Android Sudoku
\
Sudoku is a logic-based number placement puzzle.
Starting with a partially completed 9x9 grid, the
objective is to fill the grid so that each row,
each column, and each of the 3x3 boxes
(also called blocks) contains the digits
1 to 9 exactly once.

Exit
Settings...
Sudoku settings
s
Music
Play background music
Hints
Show hints during play




Sudoku/res/menu/menu.xml


<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/settings"
android:title="@string/settings_label"
android:alphabeticShortcut="@string/settings_shortcut"
/>
</menu>


Sudoku/src/org/example/sudoku/Sudoku.java

package org.example.sudoku;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class Sudoku extends Activity implements OnClickListener{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View continueButton = this.findViewById(R.id.continue_button);
continueButton.setOnClickListener(this);
View newButton = this.findViewById(R.id.new_button);
newButton.setOnClickListener(this);
View aboutButton = this.findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
View exitButton = this.findViewById(R.id.exit_button);
exitButton.setOnClickListener(this);
}

public void onClick(View v) {
switch(v.getId()){
case R.id.about_button:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.settings:
startActivity(new Intent(this, Settings.class));
return true;
}
return false;
}
}


Sudoku/res/xml/settings.xml



android:key="music"
android:title="@string/music_title"
android:summary="@string/music_summary"
android:defaultValue="true" />
android:key="hints"
android:title="@string/hints_title"
android:summary="@string/hints_summary"
android:defaultValue="true" />



Sudoku/src/org/example/sudoku/Settings.java

package org.example.sudoku;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Settings extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}


Sudoku/AndroidManifest.xml


xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.sudoku"
android:versionCode="1"
android:versionName="1.0">
android:icon="@drawable/icon"
android:label="@string/app_name">
android:name=".Sudoku"
android:label="@string/app_name">





android:name=".About"
android:label="@string/about_title"
android:theme="@android:style/Theme.Dialog">

android:name=".Settings"
android:label="@string/settings_title">






MENU ボタンを押すと、Settings... が表示されるようになった



Settings... をクリックすると、設定項目が表示される




 

Android - テーマを使う -

Android には、名前で参照できる複数のテーマがあらかじめパッケージング
されている

http://developer.android.com/reference/android/R.style.html

android:theme="@android:style/Theme.Dialog"

AndroidManifest.xml
に追加

Sudoku/AndroidManifest.xml



xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.sudoku"
android:versionCode="1"
android:versionName="1.0">
android:icon="@drawable/icon"
android:label="@string/app_name">
android:name=".Sudoku"
android:label="@string/app_name">





android:name=".About"
android:label="@string/about_title"
android:theme="@android:style/Theme.Dialog">








サブクラス化して、デフォルト値をオーバーライドすることもできる。
また、
カスタムテーマは res/values/styles.xml で定義できる

Android で数独 - onClick -

新しい Activity を定義して起動する。

レイアウトを設定
Sudoku/res/layout/about.xml



xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip"
>
android:id="@+id/about_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/about_text"
/>



More...

Sudoku/res/values/strings.xml




Sudoku
Android Sudoku
Continue
New Game
About
About Android Sudoku
\
Sudoku is a logic-based number placement puzzle.
Starting with a partially completed 9x9 grid, the
objective is to fill the grid so that each row,
each column, and each of the 3x3 boxes
(also called blocks) contains the digits
1 to 9 exactly once.

Exit



Sudoku/src/org/example/sudoku/About.java


package org.example.sudoku;

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

public class About extends Activity{
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.about);
}
}


Sudoku/src/org/example/sudoku/Sudoku.java


package org.example.sudoku;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;

public class Sudoku extends Activity implements OnClickListener{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View continueButton = this.findViewById(R.id.continue_button);
continueButton.setOnClickListener(this);
View newButton = this.findViewById(R.id.new_button);
newButton.setOnClickListener(this);
View aboutButton = this.findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
View exitButton = this.findViewById(R.id.exit_button);
exitButton.setOnClickListener(this);
}

public void onClick(View v) {
switch(v.getId()){
case R.id.about_button:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
}
}

}


Sudoku/AndroidManifest.xml



xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.sudoku"
android:versionCode="1"
android:versionName="1.0">
android:icon="@drawable/icon"
android:label="@string/app_name">
android:name=".Sudoku"
android:label="@string/app_name">





android:name=".About"
android:label="@string/about_title">






About ボタンをクリックするとこんな感じ



2009年5月26日火曜日

Android で数独 - ユーザインタフェースのレイアウト -

Android で数独を作ってみる。

Project name : Sudoku
Package name : org.example.sudoku
Activity : Sudoku
Application name : Sudoku



More...

XML でユーザインタフェースを設定しているのが
res/layout/main.xml
これを書き換えれば OK

Sudoku/res/layout/main.xml




xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/main_title"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/continue_label"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_label"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/about_label"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/exit_label"
/>







もう少しカスタマイズ

Sudoku/res/layout/main.xml



xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@color/background"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="30dip"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_title"
android:layout_gravity="center"
android:layout_marginBottom="25dip"
android:textSize="24.5sp"
/>
android:id="@+id/continue_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/continue_label"
/>
android:id="@+id/new_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_label"
/>
android:id="@+id/about_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/about_label"
/>
android:id="@+id/exit_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/exit_label"
/>




Sudoku/res/values/colors.xml




#3500ffff





横長モードだとはみ出してしまう
ちなみにエミュレータで横長モードにするには Ctrl + F11



ので、横長用のレイアウトを作る

Sudoku/res/layout-land/main.xml



xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@color/background"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:padding="15dip"
android:orientation="horizontal"
>
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_gravity="center"
android:paddingLeft="20dip"
android:paddingRight="20dip"
>
android:text="@string/main_title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="20dip"
android:textSize="24.5sp"
/>
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:stretchColumns="*"
>

android:id="@+id/continue_button"
android:text="@string/continue_label"
/>
android:id="@+id/new_button"
android:text="@string/new_game_label"
/>


android:id="@+id/about_button"
android:text="@string/about_label"
/>
android:id="@+id/exit_button"
android:text="@string/exit_label"
/>







直った



1Q84

村上春樹の新刊

予約が殺到しているらしい。
ほとぼりが冷めたら読んでみたいな。

Android Project の作成

Eclipse を起動

[File] -> [New] -> [Project] -> [Android Project]
を選択して Next をクリック



More...

Project name : Hello
Contents : Create new project in workspace
Use default location
Build Target : Android 1.5
Properties : Hello, Android
Package name : org.example.hello
Create Activity : Hello
Min SDK Version : 3



エラーがでる!
Eclipse3.4 と JDK1.6 の組み合わせではエラーがでるらしい。
Compiler compliance level を JDK1.5にする。



[Window] -> [Preferences] -> [Java] -> [Compiler]
JDK Compliance の Compiler compliance level を 1.5 にする



エミュレータ上で実行

Project で右クリック -> [Run As] -> [Android Application]



AVD (Android Virtual Devices) が無いので追加しますか?と聞かれる
Yes をクリック



Name : my_android1.5
Target : Android 1.5 - 1.5
Skin : Default (HVGA)

Create AVD をクリック



追加された my_android1.5 を選択して Finish をクリック



Launch a new Android Virtual Devices

my_android1.5 をチェックして OK をクリック



エミュレータが起動










2009年5月25日月曜日

Eclipse で Android

Eclipse を入れるところから
Eclipse Downloads
で Eclipse IDE for Java EE Developers の Windows 版をダウンロード
展開して
C:\eclipse\eclipse.exe
を起動して

[Help] -> [Software Updates...]



More...

[Add Site...] をクリック
Location : http://dl-ssl.google.com/android/eclipse
を入力して OK



追加された android のサイトをチェックして Install... をクリック



Next をクリック



Review Licenses に同意して Finish をクリック



Install 中



終わったら再起動



[Window] -> [Preference] -> [Andorid] を選択
Android SDK のディレクトリを指定していないのでエラーがでる。




Android SDK のディレクトリを指定して OK をクリック



ちなみに、Windows に Android SDK を入れるには

Download
Installing
System Requirements

Windows 版をdownload して C:\Google に展開

[コントロールパネル] -> [システム] -> [詳細設定] -> [環境変数]
Path に
C:\Google\android-sdk-windows-1.5_r2\tools
を追加





2009年5月24日日曜日

NetBeans 6.5 で Android

[Tools] -> [Plugins] -> [Setting]



More...

Add ボタンをクリックして
Name : Android
URL : http://kenai.com/downloads/nbandroid/updates.xml



OK を押すと追加される



Available Plugins に Android が追加されている



チェックして Install をクリック



License Agreement に同意して Install をクリック



署名が無いといわれるけど Continue



Finish をクリック



Android SDK をインストール

Download
Installing
System Requirements

Windows 版をdownload して C:\Google に展開

[コントロールパネル] -> [システム] -> [詳細設定] -> [環境変数]
Path に
C:\Google\android-sdk-windows-1.5_r2\tools
を追加



NetBeans を再起動

[Tools] -> [Java Platforms] -> [Add Platform...]
Google Android Open Handheld Platform
を選択して Next



ファイル名に
C:\Google\android-sdk-windows-1.5_r2



...としたけど認識されない。うーん残念。
しょうがないから Eclipse で再チャレンジ!

2009年5月22日金曜日

筆箱に家出されまして

月曜日の講義の教室には無し。
教務科の落し物にも無し。

やっぱ立教大学かなー。
きびしー。

まぁ家出したくなるときもあるよね。

2009年5月21日木曜日

14時に30分間昼寝しました。

MITSuME の再解析の1月25日と1月26日が終了。
このへんは R band のカメラが壊れてるから、
ちょっとフレームの選択が面倒。

Fermi は GRBanalysis framework に挑戦して
みようと試みるも、前任者の wiki の情報が
足りなくてどこに何があるのかサッパリ。。。
前途多難です。

そろそろ帰ろうかな。

2009年5月20日水曜日

はてしなき解析

MITSuME の再解析は 09/01/28 と 09/01/27 が終了。
岡山のデータが 10/30 からなぜか g' band だけ
fits が反転しているという わけわからない状態に。
ちょっとパイプラインを変更して。。。手間取ってしまった。
まだまだ終わらないなぁ。
Fermi の解析もなかなか進まない。
いや、きっと前進しているはず ! たぶん

2009年5月19日火曜日

Fermi

ついに、Fermi に手を出すことに。。。
あーあ。
とりあえず Brazarでも解析してみますか。
それにしてもなんで SLAC の wiki は
こんなに情報が散乱しているのか。
キャッチアップが大変じゃないですか。
今日もバーストはおこらなそうなので、平和な BA も 後8分!

裁判所には行きたくないね

裁判員制度って5月21日から開始だったんだ
知らなかった
もうすぐですな

2009年5月8日金曜日

あたりまえと思っていたことがそうじゃない

最近、『日本人が知らない 県民地図』という本を読みました。
いやー面白いです。県によって本当にいろいろな文化があるんだなぁと。
北海道では当たり前(私は道産子です)だったことも、こっちでは
当てはまらなかったり、それはないだろと思うことが他の県では
当たり前だったり。
道民は実は寒がりってのが載ってて、そうなんだよーと1人ツッコミをいれたり。
そうそう北海道は1世帯あたりのアイス消費額が1番なんだって。
確かに実家の冷蔵庫にはいつもアイスが入ってたなぁ。
でも、研究室の先輩や後輩に本に載ってる方言を聞いても、知らないって
言われてしまった。実はマイナー?
なにはともあれ、秘密のケンミンショーは好きな番組です。