package com.imooc.xpuzzle.activity;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
import com.imooc.xpuzzle.R;
import com.imooc.xpuzzle.adapter.GridItemsAdapter;
import com.imooc.xpuzzle.bean.ItemBean;
import com.imooc.xpuzzle.util.GameUtil;
import com.imooc.xpuzzle.util.ImagesUtil;
import com.imooc.xpuzzle.util.ScreenUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* 拼图逻辑主界面:面板显示
*
* @author xys
*/
public class PuzzleMain extends Activity implements OnClickListener {
// 拼图完成时显示的最后一个图片
public static Bitmap mLastBitmap;
// 设置为N*N显示
public static int TYPE = 2;
// 步数显示
public static int COUNT_INDEX = 0;
// 计时显示
public static int TIMER_INDEX = 0;
/**
* UI更新Handler
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 更新计时器
TIMER_INDEX++;
mTvTimer.setText("" + TIMER_INDEX);
break;
default:
break;
}
}
};
// 选择的图片
private Bitmap mPicSelected;
// PuzzlePanel
private GridView mGvPuzzleMainDetail;
private int mResId;
private String mPicPath;
private ImageView mImageView;
// Button
private Button mBtnBack;
private Button mBtnImage;
private Button mBtnRestart;
// 显示步数
private TextView mTvPuzzleMainCounts;
// 计时器
private TextView mTvTimer;
// 切图后的图片
private List<Bitmap> mBitmapItemLists = new ArrayList<Bitmap>();
// GridView适配器
private GridItemsAdapter mAdapter;
// Flag 是否已显示原图
private boolean mIsShowImg;
// 计时器类
private Timer mTimer;
/**
* 计时器线程
*/
private TimerTask mTimerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xpuzzle_puzzle_detail_main);
// 获取选择的图片
Bitmap picSelectedTemp;
// 选择默认图片还是自定义图片
mResId = getIntent().getExtras().getInt("picSelectedID");
mPicPath = getIntent().getExtras().getString("mPicPath");
if (mResId != 0) {
picSelectedTemp = BitmapFactory.decodeResource(
getResources(), mResId);
} else {
picSelectedTemp = BitmapFactory.decodeFile(mPicPath);
}
TYPE = getIntent().getExtras().getInt("mType", 2);
// 对图片处理
handlerImage(picSelectedTemp);
// 初始化Views
initViews();
// 生成游戏数据
generateGame();
// GridView点击事件
mGvPuzzleMainDetail.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
// 判断是否可移动
if (GameUtil.isMoveable(position)) {
// 交换点击Item与空格的位置
GameUtil.swapItems(
GameUtil.mItemBeans.get(position),
GameUtil.mBlankItemBean);
// 重新获取图片
recreateData();
// 通知GridView更改UI
mAdapter.notifyDataSetChanged();
// 更新步数
COUNT_INDEX++;
mTvPuzzleMainCounts.setText("" + COUNT_INDEX);
// 判断是否成功
if (GameUtil.isSuccess()) {
// 将最后一张图显示完整
recreateData();
mBitmapItemLists.remove(TYPE * TYPE - 1);
mBitmapItemLists.add(mLastBitmap);
// 通知GridView更改UI
mAdapter.notifyDataSetChanged();
Toast.makeText(PuzzleMain.this, "拼图成功!",
Toast.LENGTH_LONG).show();
mGvPuzzleMainDetail.setEnabled(false);
mTimer.cancel();
mTimerTask.cancel();
}
}
}
});
// 返回按钮点击事件
mBtnBack.setOnClickListener(this);
// 显示原图按钮点击事件
mBtnImage.setOnClickListener(this);
// 重置按钮点击事件
mBtnRestart.setOnClickListener(this);
}
/**
* Button点击事件
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
// 返回按钮点击事件
case R.id.btn_puzzle_main_back:
PuzzleMain.this.finish();
break;
// 显示原图按钮点击事件
case R.id.btn_puzzle_main_img:
Animation animShow = AnimationUtils.loadAnimation(
PuzzleMain.this, R.anim.image_show_anim);
Animation animHide = AnimationUtils.loadAnimation(
PuzzleMain.this, R.anim.image_hide_anim);
if (mIsShowImg) {
mImageView.startAnimation(animHide);
mImageView.setVisibility(View.GONE);
mIsShowImg = false;
} else {
mImageView.startAnimation(animShow);
mImageView.setVisibility(View.VISIBLE);
mIsShowImg = true;
}
break;
// 重置按钮点击事件
case R.id.btn_puzzle_main_restart:
cleanConfig();
generateGame();
recreateData();
// 通知GridView更改UI
mTvPuzzleMainCounts.setText("" + COUNT_INDEX);
mAdapter.notifyDataSetChanged();
mGvPuzzleMainDetail.setEnabled(true);
break;
default:
break;
}
}
/**
* 生成游戏数据
*/
private void generateGame() {
// 切图 获取初始拼图数据 正常顺序
new ImagesUtil().createInitBitmaps(
TYPE, mPicSelected, PuzzleMain.this);
// 生成随机数据
GameUtil.getPuzzleGenerator();
// 获取Bitmap集合
for (ItemBean temp : GameUtil.mItemBeans) {
mBitmapItemLists.add(temp.getBitmap());
}
// 数据适配器
mAdapter = new GridItemsAdapter(this, mBitmapItemLists);
mGvPuzzleMainDetail.setAdapter(mAdapter);
// 启用计时器
mTimer = new Timer(true);
// 计时器线程
mTimerTask = new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
}
};
// 每1000ms执行 延迟0s
mTimer.schedule(mTimerTask, 0, 1000);
}
/**
* 添加显示原图的View
*/
private void addImgView() {
RelativeLayout relativeLayout = (RelativeLayout) findViewById(
R.id.rl_puzzle_main_main_layout);
mImageView = new ImageView(PuzzleMain.this);
mImageView.setImageBitmap(mPicSelected);
int x = (int) (mPicSelected.getWidth() * 0.9F);
int y = (int) (mPicSelected.getHeight() * 0.9F);
LayoutParams params = new LayoutParams(x, y);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
mImageView.setLayoutParams(params);
relativeLayout.addView(mImageView);
mImageView.setVisibility(View.GONE);
}
/**
* 返回时调用
*/
@Override
protected void onStop() {
super.onStop();
// 清空相关参数设置
cleanConfig();
this.finish();
}
/**
* 清空相关参数设置
*/
private void cleanConfig() {
// 清空相关参数设置
GameUtil.mItemBeans.clear();
// 停止计时器
mTimer.cancel();
mTimerTask.cancel();
COUNT_INDEX = 0;
TIMER_INDEX = 0;
// 清除拍摄的照片
if (mPicPath != null) {
// 删除照片
File file = new File(MainActivity.TEMP_IMAGE_PATH);
if (file.exists()) {
file.delete();
}
}
}
/**
* 重新获取图片
*/
private void recreateData() {
mBitmapItemLists.clear();
for (ItemBean temp : GameUtil.mItemBeans) {
mBitmapItemLists.add(temp.getBitmap());
}
}
/**
* 对图片处理 自适应大小
*
* @param bitmap bitmap
*/
private void handlerImage(Bitmap bitmap) {
// 将图片放大到固定尺寸
int screenWidth = ScreenUtil.getScreenSize(this).widthPixels;
int screenHeigt = ScreenUtil.getScreenSize(this).heightPixels;
mPicSelected = new ImagesUtil().resizeBitmap(
screenWidth * 0.8f, screenHeigt * 0.6f, bitmap);
}
/**
* 初始化Views
*/
private void initViews() {
// Button
mBtnBack = (Button) findViewById(R.id.btn_puzzle_main_back);
mBtnImage = (Button) findViewById(R.id.btn_puzzle_main_img);
mBtnRestart = (Button) findViewById(R.id.btn_puzzle_main_restart);
// Flag 是否已显示原图
mIsShowImg = false;
// GridView
mGvPuzzleMainDetail = (GridView) findViewById(
R.id.gv_puzzle_main_detail);
// 设置为N*N显示
mGvPuzzleMainDetail.setNumColumns(TYPE);
LayoutParams gridParams = new LayoutParams(
mPicSelected.getWidth(),
mPicSelected.getHeight());
// 水平居中
gridParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
// 其他格式属性
gridParams.addRule(
RelativeLayout.BELOW,
R.id.ll_puzzle_main_spinner);
// Grid显示
mGvPuzzleMainDetail.setLayoutParams(gridParams);
mGvPuzzleMainDetail.setHorizontalSpacing(0);
mGvPuzzleMainDetail.setVerticalSpacing(0);
// TV步数
mTvPuzzleMainCounts = (TextView) findViewById(
R.id.tv_puzzle_main_counts);
mTvPuzzleMainCounts.setText("" + COUNT_INDEX);
// TV计时器
mTvTimer = (TextView) findViewById(R.id.tv_puzzle_main_time);
mTvTimer.setText("0秒");
// 添加显示原图的View
addImgView();
}
}