LinkedList에 들은 position을 각각 저장을 해두었다가 2개가 모이면 서로의 위치를 바꿔주면 될 것 같습니다.
바꾼 다음에 화면을 다시 표시해 주면 되겠지요.
update
public class CustomImageView extends AppCompatImageView implements View.OnTouchListener {
private String TAG = getClass().getSimpleName();
public CustomImageView(Context context) {
super(context);
setOnTouchListener(this);
}
public CustomImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setOnTouchListener(this);
}
public CustomImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnTouchListener(this);
}
private ArrayList<Rect> positionList = new ArrayList<>();
private ArrayList<Bitmap> imageList = new ArrayList<>();
public void setImage(Bitmap image){
int w = getResources().getDisplayMetrics().widthPixels;
int h = getResources().getDisplayMetrics().heightPixels;
int offset = Math.abs(image.getWidth() - w);
image = Bitmap.createScaledBitmap(image, image.getWidth() - offset, image.getHeight() - offset, false);
int sliceW= image.getWidth() / 4;
int sliceH = image.getHeight()/3;
for (int i = 0; i < 3; i++) {
int y = sliceH * i;
for (int i2 = 0; i2 < 4; i2++) {
int x = sliceW * i2;
Rect position = new Rect(x, y, x + sliceW, y + sliceH);
positionList.add(position);
imageList.add(Bitmap.createBitmap(image, x, y, sliceW, sliceH));
}
}
invalidate();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
for(int i = 0; i < imageList.size(); i++){
Rect dst = positionList.get(i);
Bitmap image = imageList.get(i);
canvas.drawBitmap(image, new Rect(0, 0, dst.width(), dst.height()), dst, null);
}
}
int position1 = -1;
int position2 = -1;
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
for(int i = 0; i < imageList.size(); i++){
if(positionList.get(i).contains((int)event.getX(),(int)event.getY())){
if (position1 == -1){
position1 = i;
} else if (position2 == -1) {
position2 = i;
}
break;
}
}
if (position1 > -1 && position2 > -1) {
Collections.swap(imageList, position1, position2); //위치를 바꾸는 코드
position1 = -1;
position2 = -1;
invalidate();
}
return true;
}
return false;
}
}
말로 설명이 어려워 대충 코드를 짜봤습니다. 잘 해결되면 좋겠네요.