さっそくソースです。


if (Locale.JAPAN.equals(Locale.getDefault())) {
setContentView(R.layout.main);
} else if(Locale.KOREA.equals(Locale.getDefault())) {
setContentView(R.layout.ko_main);
} else {
setContentView(R.layout.en_main);
}


Locale.getDefault()した結果とLocaleクラスが持ってる定数値をぶつけるだけです。

例ではLayoutを変えてます。






今回からSurfaceViewに入ります。

また画像表示してみます。



Activityのプログラムです。

public class MainActivity extends Activity
{

private SurfaceViewSample surfaceView;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.surfaceView = new SurfaceViewSample(this);
setContentView(surfaceView);
}
}


次にSurfaceViewのプログラム

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

private Bitmap bmp = null;
protected Thread thread;
protected SurfaceHolder holder;
protected long SLEEP_TIME;
protected int backColor;
private boolean stopFlg = false;


public void surfaceCreated(SurfaceHolder p1)
{

this.holder = p1;
this.thread.start();
}

public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4)
{
// TODO: Implement this method
}

public void surfaceDestroyed(SurfaceHolder p1)
{
// TODO: Implement this method
}

public void run()
{

Canvas canvas = null;
Paint paint = null;

while(!this.stopFlg){
canvas = this.holder.lockCanvas();
paint = new Paint();
canvas.drawColor(this.backColor);
canvas.drawBitmap(bmp, 100, 200, paint);
this.holder.unlockCanvasAndPost(canvas);
try{
this.thread.sleep(SLEEP_TIME);
}catch(Exception e){}
}
}

public SurfaceViewSample(Context context){

super(context);
this.thread = new Thread(this);
super.getHolder().addCallback(this);
this.SLEEP_TIME = 1000;
this.backColor = Color.BLACK;
this.bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
}

public void stopLoop(){

this.stopFlg = true;
}
}


コードが長いですね。
これで最低限の画像表示ができるところです。

親クラスはSurfaceViewです。
インターフェースに SurfaceHolder.Callback, Runnableを指定します。


コンストラクタで重要なのは
this.thread = new Thread(this);
super.getHolder().addCallback(this);
この2行です。
が、やってることは見たままです。

次が
public void surfaceCreated(SurfaceHolder p1)
{

this.holder = p1;
this.thread.start();
}
holderとやらをクラス変数に保持して、
threadを開始します。

最後に表示処理です。(runの中)
canvas = this.holder.lockCanvas();
canvasを取得しています。

paint = new Paint();
canvas.drawColor(this.backColor);
毎ループ毎に画面をリセットします。

canvas.drawBitmap(bmp, 100, 200, paint);
Viewと同じ画像描画です。

this.holder.unlockCanvasAndPost(canvas);
画面に表示します。


解説に出てこなかったものはいったんオマジナイです。





今回も引き続きViewについて記載します。

画像を動かせるようになったので、
そろそろお待ちかねのタッチイベントです。

まずはソースです。

public class ViewSample extends View
{

private Bitmap bmp = BitmapFactory.decodeResource(super.getResources(), R.drawable.ic_launcher);
private float left = 0;
private float top = 0;

public ViewSample(Context context){

super(context);
}

@Override
public void onDraw(Canvas canvas){

Paint paint = new Paint();

canvas.drawBitmap(bmp, left, top, paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

this.left = event.getX();
this.top = event.getY();

if(event.getAction() == MotionEvent.ACTION_DOWN){

invalidate();
}
return false;
}
}


onTouchEventをオーバーライドしています。
ついでにinvalidateをonDrawで呼ばなくしています。

見ての通りですが、画面をタッチするとonTouchEventが呼ばれます。
*タッチ状態で指を移動とかタッチをやめたでも呼ばれます。

今回はタッチされた場所に画像を表示したかったので、
ACTION_DOWNでのみ処理をするようにしています。

と、見せかけてソースが悪いです。
タッチ位置取得のgetXとgetYもifの中に入れるべきですね。


サンプルソースのままだと
・タップされた時
・指を離された時
・タップしながら指が動いた時
などで位置を取得

タップされた場合は画面を更新(描画)って作りです。

実際にタップした時の画像は以下





もういい感じのゲームが作れそうですね。