明けましておめでとうございます!!
新年早々携帯電話をガラケー(Softbankの001P)からiPhone5Sに機種変しました!
初めてなので色々苦戦したので、
ログを残そうと思います。
まず、Twitterアプリのインストール。
ガラケーではjig twiを使っていたのですがスマホということでJanetterをダウンロード。
と、その前にAppleIDの取得が必要。
ここでメールアドレスをIDに設定するのですが、注意事項が1つ。
設定したメール宛に確認メールが送信されます。
つまり、設定したメールアドレスを受信できる環境が手元にない場合はIDの設定が行えないわけです。
WEBメールが使える場合は問題ないですが、パソコンでしか確認できない場合は機種変の帰り道で設定できないです。
私は自宅メーラーの設定で自動ログインにしているのでパスワードが思い出せず、帰宅後設定することに・・・orz
もう一つはアドレス帳の移行。
調べたら専用のユーティリティーがあったのですが、パソコンと通信可能なケーブルが手元になかったので以下の方法で対応。
まずガラケーの設定でmSDへアドレス帳をバックアップします。
mSDに保存された*.vcfファイルをメールに添付してiPhoneに送信っと・・・
あれ?受信したメールに添付ファイルが無いぞ?
添付ファイルを開く設定も重要だが取り急ぎはアドレス帳の移行が先だな!
という訳でiPhoneでWEBメールにアクセスし、送信済みトレイからファイルをダウンロードしてインポートした。
一部の表示名がおかしいような気がするが・・・。
まあ、よしとするか。
Android アプリではSurfaceViewというのがあって、
そこで描画処理を行えばいいみたいだ。
しかもCanvasにBitmapをペタペタ貼り付けて、
一気に画面に展開できる。
つまり標準でオフスクリーンを持っているのだ。
だが、ちょっと詰まった。
SurfaceViewを生成したタイミングで
surfaceCreated()が呼ばれるハズなのに呼ばれない。
色々試したがどうにも呼ばれないし
getHolder()の戻り値がnullで先に進めなくなった。
コールバックが上手く設定できていないのか?
ウギギ・・・。
仕方がないので、プロジェクトを再作成して
SurfaceViewを実装してみるとちゃんと動いた。
なんでやねん。
ちゃんと動いたので、スレッドを立てるようにして、
その中で定期的に描画を行うようにした。
自分用にざっくりサンプルを残そう・・・。
ソースコピペ時のインデント直すのメンドイ・・・
◆アクティビティ
public class MainActivity extends Activity {
MySurfaceView mSfV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//画像処理
Paint paint = new Paint();
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.dice1);
mSfV = new MySurfaceView(this);
setContentView(mSfV);
mSfV.setOffScreenBmp(bmp);
mSfV.setRefreshFlg(true);
Bitmap bmp3 = Bitmap.createBitmap(480, 320, Bitmap.Config.ARGB_8888);
Bitmap bmp2 = BitmapFactory.decodeResource(getResources(), R.drawable.dice2);
Canvas ofs = new Canvas(bmp3);
ofs.drawBitmap(bmp2, 0, 0, paint);
ofs.drawBitmap(bmp, 100, 50, paint);
mSfV.setOffScreenBmp(bmp3);
mSfV.setRefreshFlg(true);
}
protected void onDestroy() {
super.onDestroy();
// Toast.makeText(this, "onDestory", Toast.LENGTH_SHORT).show();
//スレッドの停止
mSfV.StopThread();
}
}
◆SurfaceView
public class MySurfaceView extends SurfaceView implements Runnable,
SurfaceHolder.Callback {
private Thread thread;
SurfaceHolder holder;
private boolean refreshFlg;
private Bitmap bmp;
public MySurfaceView(Context context) {
super(context);
refreshFlg = false;
holder = getHolder();
getHolder().addCallback(this);
setFocusable(true);
requestFocus();
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// スレッドの作成と実行(run()の実行)
thread = new Thread(this);
thread.start();
}
// スレッドの削除
public void StopThread() {
thread = null;
}
@Override
public void run() {
// TODO 自動生成されたメソッド・スタブ
// TODO:DEBUG
Log.v("*TEST*", "MySurfaceView_RUN");
long loopCount = 0;
long waitTime = 0;
long startTime = System.currentTimeMillis();
while (thread != null) {
loopCount++;
try {
if (refreshFlg == true) {
draw();
//refreshFlg = false;
}
waitTime = (loopCount * FRAME_TIME)
- System.currentTimeMillis() - startTime;
if (waitTime > 0) {
Thread.sleep(waitTime);
}
} catch (Exception e) {
Log.v("*TEST*", "MySurfaceView_RUN_ERR");
}
}
}
// 描画処理
public void draw() {
Paint paint = new Paint();
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(bmp, 0, 0, paint);
holder.unlockCanvasAndPost(canvas);
}
//描画フラグ設定
public void setRefreshFlg(boolean flg){
refreshFlg = flg;
return;
}
public Bitmap getOffScreenBmp(){
return bmp;
}
public void setOffScreenBmp(Bitmap bitmap){
bmp = bitmap;
}
}
あかん、インデント直す気になれん・・・。
つーか、括弧の数あってるのか?
やってることは、
アクティビティでSurfaceViewを生成しスレッドを立てる。
これでsurfaceCreatedが呼ばれ、
スレッドが立てられることでrun()が実行される。
run()はスレッドが生きている間、
実際に描画を行うdraw()を日々出し続ける。
後は、アクティビティ側で
描画するビットマップをCanvasに貼りまくり、
定期的にMySurfaceView側のBitmapに渡せばいい。
ソースでは一度画面表示した後、
すぐに別の画像を作成して上書きを行っている。
速すぎて切り替わりを確認することはできないw
アクティビティ終了時にスレッドを削除するようにしている。
これをやらないとアプリ終了後もスレッドが
生き続けて気持ち悪かったので追加した。
放っておいても勝手に停止する・・・らしい?
コメントアウトしているけど、
refreshFlg で全てのアイテムを処理したか
判定して描画を制御する予定。
参考にさせて頂きました!(丸パク・・・)
http://android.keicode.com/basics/surfaceview-1.php
やっと4-3攻略しました!
とりあえず内部処理は最低限用意したのでネルー。
やっぱりレイアウトがムズイよ・・・。
そして明日は5時に起きていたい・・・。
無理ゲーだなぁ
Androidoの画面レイアウトってなんでこんなメンドイの?
折角GUIでオブジェクト配置できるのに、
なんかうまく配置できなくて
うぎぎ・・・ってなってる。
いいや、取り急ぎメイン処理だけ作りこもう!
あー叢雲かわいいw
連投だけど個人的なメモなので許してん~
グローバル変数についてのメモ。
グローバル変数を格納するためのクラスを1つ作成する。
Applicationをextendsしておく。
public class globalPalams extends Application {
//シングルトンパターンでインスタンス化
private static globalPalams instance = new globalPalams();
//コンストラクタ
private globalPalams(){};
public static globalPalams getInstance(){
return instance;
}
//変数の宣言
int count;
//せったー
public void setCount (int arg) {
count = arg;
return;
}
//げったー
public int getCount(){
return count;
}
}
一方呼び出し元のJAVAでは・・・
globalPalams gParam = globalPalams.getInstance();
gParam.setCount(125);
と、いうかんじ。
変数の役割に応じて作成するクラスを分けてもよさそうだ。
キス島が抜けられません・・・
単純に次のアクティビティを呼び出すだけの模様。
予めアクティビティを1つ作成しておく。
遷移元画面のボタンの処理などに以下を追加する。
//画面遷移
Intent intent = new Intent(自分のアクティビティ.this, 次画面のアクティビティ.class);
startActivity(intent);
と、いう感じ。
これで画面遷移する。
AndroidのOS(?)が標準で持っている戻るボタンで前画面に戻れるが、
都合が悪いこともあるので制御する必要がありそうだ。
ボタンの処理を追加した時のメモ
アクティビティにボタンを配置する。
ボタンのプロパティーの「on Click」にクリック時のメソッドを記述する。
xmlにのタグに以下を追加してもOK。
android:onClick="メソッド名"
んで、JAVAにメソッドを追加するっと。
追加する場所はonCreate()とかがある場所ね。
これって、画像なんかでも同じようにできるのかな?
試してみるか。
やった!レベル25で龍驤ちゃん改造できるようになった!
アクティビティの追加メモっと
src/パッケージ名にクラスを追加する。
名前は画面の名前にしておく。
スーパークラスはandroid.app.Activity
①作成したらクラスにonCreateを追加する。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//アクティビティのXMLと紐づける。
setContentView(R.layout.second_activity);
}
②layoutにアクティビティのXMLを追加する。
とりあえず、Androidプロジェクトを作成したときにできるファイルをコピーしてリネームした。
名前は作成したクラスに追加したsetContentView()の引数で指定した名前ね。
本当は逆なんだろうケド。
③AndroidManifest.xml編集
applicationタグの中に以下を追加。
サンプルのアクティビティの後に追加する感じで。
<activity
android:name=".secondDisp"
android:label="@string/app_name" >
大雑把にはこんな感じか?
追加したアクティビティを最初の画面にしたい場合は、
AndroidManifest.xmlに追加したトコロをこんな感じに・・・
<activity
android:name=".secondDisp"
android:label="@string/app_name" >
intent-filterタグをサンプルから「剥ぎ取って」移植してあげる。
と、いう感じ。
次は画面遷移と値の受け渡しorグローバル的な値の保持方法だな。
艦これのレベリングと並行作業だから進み悪いw
インストールできた。
結局、署名付きでapkを作成したら行けた。
まぁ、そりゃぁそうか。
本当はUSB接続でデバックしたかったんだけど、
USBドライバが見つからんかったのだ・・・。
やっぱりマイナー本体はアカンなw
作ったアプリはおろか、サンプルのHello Worldすら実機にインストールできない。
インストールを行うと「インストールされていません」と表示されてしまう・・・。
機種はRWCのRA-AT700MK。
ちょっと前にスペック的にどうよ?
と言われた初音ミクタブレットナビでAndroid4.0搭載機。
マニフェストはこんな感じ
android:minSdkVersion="8"
android:targetSdkVersion="11"
Android2.2.x、3.0.xにしたんだが・・・
うーん。