
Android勉強中。
とりあえず、簡単なドラッグ処理。
画面に映ってる白い玉はドラッグ出来ます。
以下、今回のソースです。
Main.javaのソース。
package jp.sakef;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
public class Main extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(new MainView(this));
}
}
MainView.javaのソース。
package jp.sakef;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainView extends SurfaceView implements SurfaceHolder.Callback, Runnable
{
private SurfaceHolder holder;
private Thread thread;
private int isDrag;
private Paint paint;
private ArrayList<Circle> container;
public MainView(Context context)
{
super(context);
holder = null;
thread = null;
isDrag = -1;
container = new ArrayList<Circle>();
getHolder().addCallback(this);
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
}
public void surfaceDestroyed(SurfaceHolder holder)
{
thread = null;
}
public void surfaceCreated(SurfaceHolder holder)
{
this.holder = holder;
thread = new Thread(this);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
for(int i=0 ; i<5 ; i++)
{
Circle c = new Circle(20f, (float)Math.random()*width, (float)Math.random()*height);
container.add(c);
}
if(thread != null) thread.start();
}
// 描画
public void run()
{
while (thread != null)
{
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
int size = container.size();
for(int i=0 ; i< size ; i++)
{
Circle c = container.get(i);
canvas.drawCircle(c.x, c.y, c.radius, paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
// クリック時のイベント
public boolean onTouchEvent(MotionEvent event)
{
float x = event.getX();
float y = event.getY();
// 画面のタッチ時
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
int size = container.size();
for(int i=0 ; i<size ; i++)
{
Circle c = container.get(i);
if((c.x-x)*(c.x-x) + (c.y-y)*(c.y-y) < c.radius*c.radius)
{
isDrag = i;
break;
}
}
}
// ドラッグ時
else if (event.getAction() == MotionEvent.ACTION_MOVE)
{
if(isDrag != -1)
{
Circle c = container.get(isDrag);
c.x = x;
c.y = y;
}
}
// 指を離したとき
else if(event.getAction() == MotionEvent.ACTION_UP)
{
isDrag = -1;
}
return true;
}
}
Circle.javaのソース。
package jp.sakef;
public class Circle
{
public float radius;
public float x;
public float y;
public Circle(float radius, float x, float y)
{
this.radius = radius;
this.x = x;
this.y = y;
}
}