スマホアプリならアンドロック
スマホアプリ(アンドロイド)レビューやスマホ情報はアンドロック
今回はAndRockで開発した『ライブ壁紙「蝉」』を例に、アンドロイドアプリの開発情報を紹介します。
今回はどうやって蝉を動かしているのかを中心にソースコードの解説を行いたいと思います。
この壁紙は、仰向けでくたばっている蝉をタッチすると「ビビヴィヴィーー!!」と蝉が鳴きながら暴れる、という内容です。
内部の処理としては、大きく分けて以下の三点を行っています。
ライブ壁紙を使うためにWallpaperService呼び出します。これだけでライブ壁紙として機能します。
public class UtusemiWallPaper extends WallpaperService { private final Handler mHandler = new Handler(); @Override public void onCreate() {
蝉をタッチしたときに、一定の時間内に座標や傾きを変更し、蝉の再描画を繰り返します。
タッチした座標が、蝉を表示している座標内に収まっている場合だけループ処理を行っています。
ループ内では、座標の変更(move)と蝉の再描画(drawFrame)を行っています。
@Override public void onTouchEvent(MotionEvent event) { mTouchX = (int)event.getX(); mTouchY = (int)event.getY(); // タッチされた座標がアイコン内かどうか if (mPositionLeft < mTouchX && mTouchX < mPositionLeft + imageWidth && mPositionTop < mTouchY && mTouchY < mPositionTop + imageHeight ) { MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.se073); mp.start(); mLastTime = System.currentTimeMillis(); int timer = 1; long now; while (timer > 0) { now = System.currentTimeMillis(); if(now-mLastTime < MOVE_UNTIL){ move(); drawFrame(); }else if(now-mLastTime >= MOVE_UNTIL){ timer = 0; mp.stop(); mp.reset(); mp.release(); } } } super.onTouchEvent(event); }
蝉の座標と傾きはランダムで決めており、画面の外に飛び出しそうなときは反対方向に移動させています。
/* * 蝉アニメーション * */ public void move(){ int jump = (int)Math.floor(Math.random()*5); jump *= SEMI_JUMP; int rand = (int)Math.floor(Math.random()*jump); int rand2 = (int)Math.floor(Math.random()*jump); int r = (int)Math.floor(Math.random()*180); int direct = ((rand % 2) == 0)?1:-1; int direct2 = ((rand2 % 2) == 0)?1:-1; if(mPositionLeft+rand*direct<=0 || (mPositionLeft+imageWidth)+rand*direct>=displayWidth){ mPositionLeft = mPositionLeft+rand; }else{ mPositionLeft = mPositionLeft+rand*direct; } if(mPositionTop+rand2*direct<=0 || (mPositionTop+imageHeight)+rand*direct>=displayHeight){ mPositionTop = mPositionTop+rand2; }else{ mPositionTop = mPositionTop+rand2*direct2; } if(mPositionLeft <=0){ mPositionLeft = mSemiSize; }else if(mPositionLeft+mSemiSize >= displayWidth){ mPositionLeft = displayWidth-mSemiSize; } if(mPositionTop <=0){ mPositionTop = mSemiSize; }else if(mPositionTop+mSemiSize >= displayHeight){ mPositionTop = displayHeight-mSemiSize; } mPositionRotate = r; }
キャンバスを使って画像を描画させます。
処理はシンプルで、変更した座標を引数に渡して、ただ描画をするだけです。
void drawSemi(Canvas c) { c.save(); Rect src = new Rect(0, 0, mBGImage.getWidth(), mBGImage.getHeight()); Rect dst = new Rect(0, 0, displayWidth, displayHeight); c.drawBitmap(mBGImage, src, dst, null); c.rotate(mPositionRotate,mPositionLeft+imageWidth/2,mPositionTop+imageHeight/2); // 角度設定 c.drawBitmap(mImage, mPositionLeft, mPositionTop, mPaint); c.restore(); }
座標や傾きを変更した上で一定時間毎に描画を繰り返すことで、蝉が動いているように見えます。
蝉がぐるぐる回った時点で私が満足して作り込みを怠ったため、社内テストでは「(蝉が)画面から出てっちゃうんですけどー」との苦情が絶えませんでした。
「7年経ったらまた出てきます」と誤魔化したりもしましたが、修正したものを皆様にお届けできてよかったです。
蝉が動かないのに描画が繰り返されるのは無駄なので、タッチしてから一定時間だけ処理が行われるようにしています。
バッテリーの消費量に少なからず良い影響があるのではないかと期待しています。
蝉はデタラメに動いているだけですが、これはねーよという動きをしてくれました。動きを作るために必ずしも高度な技術が必要なわけではないと分かり、安心しました。
アンドロイド携帯向けアプリの人気ランキングページです。ビジネスに、遊びに、とてもお役立ちのアンドロイドアプリが勢ぞろい。どのアプリも人気のある「10個」です。厳選されたラインナップ。もしかしたらあなたの携帯ライフを劇的に変えるアプリも現れるかもしれません!日々変わるこのアプリのランキング動向を、ぜひチェックしてください。
2024年シリーズ1 セレクション第2弾の評価ランキングを紹介します! 第・・・
プロスピA(プロ野球スピリッツA)の攻略情報をまとめたページです。 基本・・・
2024年シリーズ1 セレクション第1弾の評価ランキングを紹介します! 最・・・
2024年シリーズ1 TS第3弾の評価ランキングを紹介します! 前回はイチロ・・・
現役の選手・監督・コーチが全盛期の能力になって登場するTS(タイムスリッ・・・
2024年シリーズ1 エキサイティングプレイヤー第2弾の評価ランキングを紹介・・・
この記事では、エキサイティングプレイヤーに続くシリーズ1の目玉スカウト「プ・・・