Рисование пазлов, нужен совет
Код:
public class GameWindow extends Activity{
private GraphicsView myView;
private int selDot = -1;
private int imgInd;
private class GraphicsView extends View{
//Класс, реализущий перетаскиваемую точку
private class Dot {
float dotX, dotY;
Paint dotPaint;
}
private Dot[] arrDots;
private final int dflColor = Color.YELLOW;
private int Rad = 20;
private float initialX, initialY,
offsetX, offsetY;
public GraphicsView(Context context) {
super(context);
//Рисуем пять точек с произвольными координатами
Random rnd = new Random();
int i;
arrDots = new Dot[5];
for (i=0; i<5; i++){
arrDots[i] = new Dot();
arrDots[i].dotX = rnd.nextInt(400);
arrDots[i].dotY = rnd.nextInt(400);
arrDots[i].dotPaint = new Paint();
arrDots[i].dotPaint.setColor(dflColor);
}
//Собственно обработчик перетаскивания точки
setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
float posX = event.getX();
float posY = event.getY();
for (int i = 0; i < 5; i++){
if (posX > (arrDots[i].dotX - Rad) &&
posX < (arrDots[i].dotX + Rad) &&
posY > (arrDots[i].dotY - Rad) &&
posY < (arrDots[i].dotY + Rad)){
initialX = arrDots[i].dotX;
initialY = arrDots[i].dotY;
offsetX = posX;
offsetY = posY;
arrDots[i].dotPaint.setColor(Color.CYAN);
selDot = i;
}
else
arrDots[i].dotPaint.setColor(dflColor);
}
break;
case MotionEvent.ACTION_MOVE:
if (selDot >= 0){
arrDots[selDot].dotX = event.getX() +
initialX - offsetX;
arrDots[selDot].dotY = event.getY() +
initialY - offsetY;
}
break;
case MotionEvent.ACTION_UP:
for (int i = 0; i < 5; i++)
arrDots[i].dotPaint.setColor(dflColor);
selDot = -1;
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
});
}
//Перерисовываем точки на канве
@Override
public void onDraw(Canvas canvas){
for (int i = 0; i < 5; i++)
canvas.drawCircle(arrDots[i].dotX, arrDots[i].dotY, Rad,
arrDots[i].dotPaint);
invalidate();
}
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myView = new GraphicsView(this);
myView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
ll.addView(myView);
setContentView(ll);
}
}
private GraphicsView myView;
private int selDot = -1;
private int imgInd;
private class GraphicsView extends View{
//Класс, реализущий перетаскиваемую точку
private class Dot {
float dotX, dotY;
Paint dotPaint;
}
private Dot[] arrDots;
private final int dflColor = Color.YELLOW;
private int Rad = 20;
private float initialX, initialY,
offsetX, offsetY;
public GraphicsView(Context context) {
super(context);
//Рисуем пять точек с произвольными координатами
Random rnd = new Random();
int i;
arrDots = new Dot[5];
for (i=0; i<5; i++){
arrDots[i] = new Dot();
arrDots[i].dotX = rnd.nextInt(400);
arrDots[i].dotY = rnd.nextInt(400);
arrDots[i].dotPaint = new Paint();
arrDots[i].dotPaint.setColor(dflColor);
}
//Собственно обработчик перетаскивания точки
setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
float posX = event.getX();
float posY = event.getY();
for (int i = 0; i < 5; i++){
if (posX > (arrDots[i].dotX - Rad) &&
posX < (arrDots[i].dotX + Rad) &&
posY > (arrDots[i].dotY - Rad) &&
posY < (arrDots[i].dotY + Rad)){
initialX = arrDots[i].dotX;
initialY = arrDots[i].dotY;
offsetX = posX;
offsetY = posY;
arrDots[i].dotPaint.setColor(Color.CYAN);
selDot = i;
}
else
arrDots[i].dotPaint.setColor(dflColor);
}
break;
case MotionEvent.ACTION_MOVE:
if (selDot >= 0){
arrDots[selDot].dotX = event.getX() +
initialX - offsetX;
arrDots[selDot].dotY = event.getY() +
initialY - offsetY;
}
break;
case MotionEvent.ACTION_UP:
for (int i = 0; i < 5; i++)
arrDots[i].dotPaint.setColor(dflColor);
selDot = -1;
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
});
}
//Перерисовываем точки на канве
@Override
public void onDraw(Canvas canvas){
for (int i = 0; i < 5; i++)
canvas.drawCircle(arrDots[i].dotX, arrDots[i].dotY, Rad,
arrDots[i].dotPaint);
invalidate();
}
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myView = new GraphicsView(this);
myView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
ll.addView(myView);
setContentView(ll);
}
}
По всему этому имею несколько вопросов, просьба откликнуться действительно разбирающихся людей ))) Интересует даже не столько пример, сколько общий принцип реализации, т.е. в каком направлении копать.
1. Как вырезать из Bitmap-а кусок произвольной формы и реализовать их склеивание при соприкосновении? Я думаю делать это с помощью класса Path, но в гугле ничего конкретного не нашел, может плохо гуглил.
2. Никогда не работал с OpenGL, может быть с помощью нее можно сделать все проще?