1 布局文件 activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拼图游戏"
android:textSize="35sp"
android:layout_gravity="center"
android:padding="10dp"/>
<GridLayout
android:id="@+id/gridLayout"
android:layout_width="match_parent"
android:layout_height="360dp"
android:columnCount="3"
android:rowCount="3"
>
<ImageView
android:id="@+id/m00"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerInside"
android:layout_row="0"
android:layout_column="0"
/>
<ImageView
android:id="@+id/m01"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="0"
android:layout_column="1"
/>
<ImageView
android:id="@+id/m02"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="0"
android:layout_column="2"
/>
<ImageView
android:id="@+id/m10"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="0"
android:padding="2dp" />
<ImageView
android:id="@+id/m11"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="1"
android:padding="2dp" />
<ImageView
android:id="@+id/m12"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="2"
android:padding="2dp" />
<ImageView
android:id="@+id/m20"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp" />
<ImageView
android:id="@+id/m21"
android:scaleType="centerInside"
android:layout_columnWeight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp" />
<ImageView
android:id="@+id/m22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:padding="2dp"
android:scaleType="centerInside" />
</GridLayout>
<Button
android:id="@+id/refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重新打乱"
android:textColor="@color/white"
android:background="@color/design_default_color_secondary"
android:textSize="20sp"
android:layout_gravity="center"/>
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="一共走了0步"
android:layout_columnSpan="3"
android:textStyle="bold"
android:textSize="20sp"
android:layout_gravity="center" />
</LinearLayout>
2 控制文件 MainActivity
package com.example.game;
import static java.lang.Math.abs;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.camera2.params.LensShadingMap;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
ImageView [] imgs=new ImageView[9];
// 九份图片的数组
Bitmap[] bitmaps = new Bitmap[9];
Bitmap bitmap = Bitmap.createBitmap(1000, 800, Bitmap.Config.ARGB_8888);
Canvas canvas =new Canvas(bitmap);
Button refresh;
TextView txt;
float old_x=0,old_y=0;
int m=3,n=3;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgs[0]=findViewById(R.id.m00);
imgs[1]=findViewById(R.id.m01);
imgs[2]=findViewById(R.id.m02);
imgs[3]=findViewById(R.id.m10);
imgs[4]=findViewById(R.id.m11);
imgs[5]=findViewById(R.id.m12);
imgs[6]=findViewById(R.id.m20);
imgs[7]=findViewById(R.id.m21);
imgs[8]=findViewById(R.id.m22);
refresh=findViewById(R.id.refresh);
txt=findViewById(R.id.txt);
//设置响应点击
for(int i=0;i<9;i++){
imgs[i].setOnTouchListener(new myTouch());
}
refresh.setOnClickListener(new refreshClick());
// 想绘制的图片
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
// 源区域,表示整个图片
Rect srcRect = new Rect(0, 0, srcBitmap.getWidth(), srcBitmap.getHeight());
// 目标区域,表示画布的大小
RectF dstRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight());
// 绘制图片
canvas.drawBitmap(srcBitmap, srcRect, dstRectF, null);
this.refresh();
}
private void refresh() {
// 九份图片的宽度和高度
int w = bitmap.getWidth() / 3;
int h = bitmap.getHeight() / 3;
// 随机数生成器
Random random = new Random();
// 用于记录已经截取过的位置
Set<Integer> set = new HashSet<>();
// 循环九次
for (int i = 0; i < 9; i++) {
// 随机生成一个位置,保证不重复
int index;
do {
index = random.nextInt(9);
} while (set.contains(index));
set.add(index);
// 计算该位置对应的左上角坐标
int x = (index % 3) * w;
int y = (index / 3) * h;
// 截取该位置的图片,并存入数组
bitmaps[i] = Bitmap.createBitmap(bitmap, x, y, w, h);
imgs[i].setImageBitmap(bitmaps[i]);
}
txt.setText("一共走了0步");
}
private class refreshClick implements View.OnClickListener {
@Override
public void onClick(View v) {
refresh();
}
}
private class myTouch implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
//计算组件位置
GridLayout gridLayout=findViewById(R.id.gridLayout);
int position=gridLayout.indexOfChild(v);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
old_x=event.getX()-v.getLeft();
old_y=event.getY()-v.getTop();
break;
case MotionEvent.ACTION_MOVE:
old_x=event.getX()-v.getLeft();
old_y=event.getY()-v.getTop();
break;
case MotionEvent.ACTION_UP:
float new_x,new_y;
new_x=event.getX()-v.getLeft();
new_y=event.getY()-v.getTop();
judge(new_x-old_x,new_y-old_y,position);
break;
}
//true表示能识别抬起
return true;
}
}
private void judge(float x,float y,int position){
if(abs(x)>=abs(y)){ //水平方向移动
if(x>0){ //向右移
move(position,position-1);
}else{//向左移
move(position,position+1);
}
}else{//垂直方向移动
if(y>0){ //向下移
move(position,position-n);
}else{ //向上移动
move(position,position+n);
}
}
}
private void move(int old_position,int new_position){ //上下左右 0123
if(new_position>=0&&new_position<n*m) {
Bitmap bitmapold=((BitmapDrawable) imgs[old_position].getDrawable()).getBitmap();
Bitmap bitmapnew=((BitmapDrawable) imgs[new_position].getDrawable()).getBitmap();
imgs[old_position].setImageBitmap(bitmapnew);
imgs[new_position].setImageBitmap(bitmapold);
count++;
txt.setText("一共走了"+count+"步");
}
}
}
3 图片资源
