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