暇人プログラマの日記
フリーランサーに憧れる暇人プログラマの日記

ホーム 管理画面 ファイルアップ 新規記事
--2011-10-- « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 »

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

自作スレッド

Androidで自作スレッドを使用する場合はこんな感じに記述すれば
出来るみたいです。

Handler handler = new Handler();
Runnable runnable;
//…省略
new Thread() {
public void run() {
handler.post(runnable);
}
}.start();

runnable = new Runnable(){
public void run(){
//適当な処理
}
};



threadはthrow Lifeさんのサイトがめちゃくちゃ詳しいです。

自分も多少歪でもいいからサンプルコード書こうと思ったけど上手くいかないんで諦めたよ

つーかなんかC#の案件があるかもなんて話が出てるんで
Androidは一旦止めてC#勉強しとこうかな

  1. 2009/11/18(水) 21:29:08|
  2. Android
  3.  | トラックバック:0
  4.  | コメント:0

神経衰弱作ってみました

神経衰弱作ってみました。
といっても対戦相手もいないし、クリア時のランキング登録機能も用意してない(それ以前にクリアしても何もない)本当に簡易的な神経衰弱です。

使用する画像は「reverse.png」と「t1.png」〜「t13.png」の14枚です。
reverse.png

t1.png

画像のzipファイルはこちらです

実行画面
trump.jpg

Trump.java

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

public class Trump extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TrumpView(this));
}
}



TrumpView.java

import java.util.Random;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class TrumpView extends SurfaceView
implements SurfaceHolder.Callback,Runnable {

SurfaceHolder holder;
Thread thread;
Card[] card = new Card[52];
int preClick = -1;

public TrumpView(Context context) {
super(context);
Resources r = context.getResources();
int[] num = new int[52];

for(int i = 0;i < 52;i++){
num[i] = i % 13 + 1;
}
num = shuffle(num);

int x = 0;
int y = 0;
//カード格納ループ
for(int i = 0;i < 52;i++){
switch(num[i]){
case 1:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t1),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 2:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t2),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 3:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t3),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 4:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t4),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 5:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t5),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 6:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t6),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 7:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t7),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 8:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t8),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 9:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t9),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 10:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t10),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 11:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t11),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 12:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t12),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
case 13:
card[i] = new Card(
BitmapFactory.decodeResource(r, R.drawable.t13),
BitmapFactory.decodeResource(r, R.drawable.reverse),num[i],x,y);
break;
default:
break;
}
x = card[i].getEndX();
if((i + 1) % 8 == 0){
x = 0;
y = card[i].getEndY();
}
}

holder = getHolder();
holder.addCallback(this);
holder.setFixedSize(getWidth(), getHeight());
}

@Override
public boolean onTouchEvent(MotionEvent motion){
if(motion.getAction() != MotionEvent.ACTION_DOWN){return true;}
int x = (int)motion.getX();
int y = (int)motion.getY();

for(int i = 0;i < card.length;i++){
//タッチされた場所に画像が存在していた場合
if(card[i].getStartX() <= x && card[i].getEndX() >= x &&
card[i].getStartY() <= y && card[i].getEndY() >= y){
//カードが開いていなかった場合
if(!card[i].isClick()){
card[i].onClick();
//カードを2枚開いていない場合
if(preClick == -1){
preClick = i;
}else if(preClick != i){
try{
Thread.sleep(1000);
}catch(Exception e){}

//開いた2枚のカードの値が一致しなかった場合
if(card[i].getNumber() != card[preClick].getNumber()){
card[i].onClick();
card[preClick].onClick();
}
preClick = -1;
}
}
break;
}
}
return true;
}

public int[] shuffle(int[] num){
Random rand = new Random();
int rnum;
int temp;
for(int i = 52 - 1;i > 0;i--){
rnum = rand.nextInt(i);
temp = num[i];
num[i] = num[rnum];
num[rnum] = temp;
}
return num;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}

@Override
public void surfaceCreated(SurfaceHolder holder) {
thread = new Thread(this);
thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
thread = null;
}

@Override
public void run() {
Canvas canvas;

while(thread != null){
canvas = holder.lockCanvas();
for(Card c : card){
canvas.drawBitmap(c.getImage(),c.getStartX(),c.getStartY(),null);
}
holder.unlockCanvasAndPost(canvas);
}
}
}



Card.java


import android.graphics.Bitmap;

public class Card {
private final Bitmap frontCard;
private final Bitmap reverseCard;
private final int number;

private int x;
private int y;
private boolean flag;

public Card(Bitmap frontCard,Bitmap reverseCard,int number){
this.frontCard = frontCard;
this.reverseCard = reverseCard;
this.number = number;
}

public Card(Bitmap frontCard,Bitmap reverseCard,int number,int x,int y){
this.frontCard = frontCard;
this.reverseCard = reverseCard;
this.number = number;
this.x = x;
this.y = y;
}

public void setStartX(int x){
this.x = x;
}

public void setStartY(int y){
this.y = y;
}

public int getStartX(){
return x;
}

public int getStartY(){
return y;
}

public int getEndX(){
return x + frontCard.getWidth();
}

public int getEndY(){
return y + frontCard.getHeight();
}

public Bitmap getImage(){
if(flag) return frontCard;
else return reverseCard;
}
public int getNumber(){
return number;
}

public void onClick(){
flag = !flag;
}

public boolean isClick(){
return flag;
}
}




今回描画にSurfaceViewクラスを用いました。
SurfaceHolder.Callbackを実装すると
・surfaceChanged()メソッド
・surfaceCreated()メソッド
・surfaceDestroyed()メソッド
・run()メソッド
を実装しなければいけません。

またsurfaceCreated()メソッドを呼ぶときは

SurfaceHolder holder;

holder = getHolder();
holder.addCallback(this);
holder.setFixedSize(getWidth(), getHeight());


と書く事でsurfaceCreated()メソッドが実行されます。

SurfaceView使うとすげー重くなるから、実際はスレッドをもっと制御
してあげたほうがいいんだろうな

  1. 2009/11/14(土) 10:55:14|
  2. Android
  3.  | トラックバック:1
  4.  | コメント:0

タッチイベント2

前回に続き今回もタッチイベントをやります。
今回はAndroidの画面がタッチされたら、タッチされた場所の座標を取得し、
取得された座標に画像が存在していたら、画像の色を赤に変えるようにします。

今回のプログラムに使う画像は「map.png」です。
map.png

ImageTouchTest.java

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

public class ImageTouchTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ImageTouchView(this));
}
}



ImageTouchView.java

import android.content.Context;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.View;

public class ImageTouchView extends View{
private FieldImage[] image = new FieldImage[4];

public ImageTouchView(Context context){
super(context);
Resources r = context.getResources();
image[0] = new FieldImage(BitmapFactory.decodeResource(r, R.drawable.map),0,0);
image[1] = new FieldImage(BitmapFactory.decodeResource(r, R.drawable.map),40,0);
image[2] = new FieldImage(BitmapFactory.decodeResource(r, R.drawable.map),80,0);
image[3] = new FieldImage(BitmapFactory.decodeResource(r, R.drawable.map),0,40);
}

@SuppressWarnings("static-access")
@Override
public boolean onTouchEvent(MotionEvent motion){

if(motion.getAction() != motion.ACTION_DOWN){return true;}
int x = (int)motion.getX();
int y = (int)motion.getY();

for(int i = 0;i < image.length;i++){
//タッチされた場所に画像が存在していた場合
if(image[i].getStartX() <= x && image[i].getEndX() >= x &&
image[i].getStartY() <= y && image[i].getEndY() >= y){
try{
image[i].changeAllColor(Color.RED);
//再描画
invalidate();
break;
}catch(Exception e){}
}
}
return true;
}

//テスト用の画像を描画する
protected void onDraw(Canvas canvas){
for(FieldImage i : image){
canvas.drawBitmap(i.image,i.getStartX(),i.getStartY(),null);
}
}
}



FieldImage.java

import android.graphics.Bitmap;

public class FieldImage {
Bitmap image;
private int x;
private int y;

public FieldImage(Bitmap image){
this.image = image;
}

public FieldImage(Bitmap image,int x,int y){
this.image = image;
this.x = x;
this.y = y;
}

public void setStartX(int x){
this.x = x;
}

public void setStartY(int y){
this.y = y;
}

public int getStartX(){
return x;
}

public int getStartY(){
return y;
}

public int getEndX(){
return x + image.getWidth();
}

public int getEndY(){
return y + image.getHeight();
}

public void changeAllColor(int color){
int[] pixel = new int[image.getWidth() * image.getHeight()];
for(int i = 0;i < image.getWidth() * image.getHeight();i++){
pixel[i] = color;
}
Bitmap imageCopy = image.copy(Bitmap.Config.ARGB_8888, true);
imageCopy.setPixels(pixel, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
image = imageCopy;
}
}



画像の描画開始地点がうまく取得できなかったから、画像配置用のクラスを作る事に・・・
もっとうまいやり方がありそうなものだけど今の俺には分からなかったです

  1. 2009/11/10(火) 21:07:32|
  2. Android
  3.  | トラックバック:0
  4.  | コメント:0

タッチイベント

次は画面のタッチイベントについて学習してみます。
画面をクリックしたらダイアログが出て、クリックした座標を表示するようにします。

TouchTest.java


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

public class TouchTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TouchView(this));
}
}



TouchView.java


import android.app.AlertDialog;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;

public class TouchView extends View{

public TouchView(Context context){
super(context);
}

@SuppressWarnings("static-access")
@Override
public boolean onTouchEvent(MotionEvent motion){
if(motion.getAction() == motion.ACTION_DOWN){
AlertDialog.Builder alert = new AlertDialog.Builder(this.getContext());
alert.setMessage("X = " + motion.getX() + " Y = " + motion.getY());
alert.setPositiveButton("OK", null);
alert.create();
alert.show();
}
return true;
}
}



getAction()メソッドで画面が押された場合に、ダイアログの表示処理を行うようにします。
getX()メソッドでX座標を取得、getY()メソッドでY座標を取得しています。

結果画面
touch.jpg


また画像を用いている場合で、押下された場所のピクセル情報を取得したい場合は、
BitmapクラスのgetPixel()メソッドで取得する事が出来ます。
getPixel()には第一引数にgetX()メソッド、第二引数にgetY()メソッドを与えます。
またgetX()とgetY()の戻り値はfloat型なのでint型にキャストします。

実際にgetPixel()メソッドを使ってみたけど、どういった形式(RGBとか)で
返却されているかがいまいち分からない。
まあ一応取得できてるみたいだからいいか・・・

  1. 2009/11/07(土) 17:03:30|
  2. Android
  3.  | トラックバック:0
  4.  | コメント:0

BGMを鳴らす

絵を表示したら次はBGMを鳴らすのに挑戦してみようと思います。

BGMはTAM Music Factory様のMP3素材「日光浴」(ファイル名:tam-n09.mp3)を
用いていこうと思います。

まず「res」フォルダに「raw」と言うフォルダを作成します。
この時「raw」フォルダではなく、適当な名前で作成すると
「invalid resource directory name」との
エラーが出るので必ず「raw」フォルダにしてください。

先ほど作成したフォルダに「tam-n09.mp3」を格納するのですが、
その時ファイル名の「-」を削ってください。「-」を削らないで格納すると
「Invalid file name: must contain only [a-z0-9_.]」と言うエラーが発生します。

ではBGMを鳴らすコードを書いていきます。
初めはXMLで設定してJavaで呼ぶことも出来るのかなと思って調べてみたけど
良く分からなかったから今回は断念です・・・

MusicTest.java

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

public class MusicTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MusicView(this));
}
}



MusicView.java

import android.content.Context;
import android.media.MediaPlayer;
import android.view.View;

public class MusicView extends View{
private MediaPlayer player;

public MusicView(Context context){
super(context);
try{
player = MediaPlayer.create(context, R.raw.tamn09);
//player.prepare();
player.setLooping(true);
player.seekTo(0);
player.start();
}catch(Exception e){}
}
}



setLooping(true)でBGMがループするようになります。

prepare()は再生準備の為に呼ぶメソッドらしいですが、
この処理を追加すると「IllegalStateException」が発生しました。
何故と思って調べてみたら自分の用いているバージョン(SDK1.5)は
create()メソッドの内部でprepare()メソッドを呼んでいるので
prepare()メソッドを記述してはいけないそうです。

取り合えずこれでBGMを鳴らす事に成功しました。
次はタッチイベントに挑戦しようと思います。

  1. 2009/11/06(金) 20:44:59|
  2. Android
  3.  | トラックバック:0
  4.  | コメント:0
<< 前のページ  次のページ >>

プロフィール

Author:orz=3
最近フリーランサーに憧れている
暇人の日記です。

実務ではJava、Oracleをメインで
使用しているへっぽこプログラマです

用のある方は下記アドレスに連絡下さい

hogehoge0604☆gmail.com

2011/10/01から長期間お休みに入るので
お仕事の相談もお待ちしております

検索

カレンダー

09 | 2011/10 | 11
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

最新記事

カテゴリ

アクセスカウンタ

月別アーカイブ

広告

広告(Android)


初めてのAndroid

広告(Android)


Android Hacks ―プロが教えるテクニック & ツール