Android(Java)を始める – ドラッグ作業

Filed under Android, Java

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;
	}
}

Post a Comment

Your email is never published nor shared.