package com.example.administrator.pintu;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast; import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* Created by Zyh on 2016/11/22.
*/
public class GamePinTuLayout extends RelativeLayout implements View.OnClickListener {
//拼图layout的宽度,游戏面板的宽度
private int mWidth;
//面板内边距
private int mPadding;
//piece图片的间距
private int mMargin; public GamePinTuLayout(Context context) {
this(context, null);
} public GamePinTuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// //设置背景图片
// setBackgroundResource(R.mipmap.chazhuo);
mPadding = min(getPaddingLeft(), getPaddingRight(), getPaddingTop(), getPaddingBottom());
//安卓里面的单位:dip、dp、px、sp
mMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics());
} private boolean once = true; @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//设置面板的宽度
mWidth = Math.min(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
//切图乱序,调试间距,将乱序后的imagepiece集合加入面板
if (once) {
initBitmap();
initItem();
}
setMeasuredDimension(mWidth, mWidth);
}
private int mItemWidth;
/**
* 1.重新规定imageView的宽高
* 2.位置需要手动规定
*/
private ImageView[] mGamePinTuItems;
private void initItem() {
// //容器我们可以直接使用addView方法将一个view加入容器中
// ImageView item=new ImageView(getContext());
// item.setImageBitmap(mItemBitmap.get(0).bitmap);
// addView(item);
/**
* mWidth游戏面板宽度,面板宽度mPadding,内容边距mMargin
* RelativeLayout.LayoutParams--规定加入控件的宽高和位置属性(addRule);
*
*/
RelativeLayout.LayoutParams lp;
mItemWidth=(mWidth-mPadding*2-mMargin*(mPiece-1))/mPiece;
mGamePinTuItems=new ImageView[mPiece*mPiece];
ImagePiece imagePiece;
//当前布局是相对布局
for (int i=0;i<mItemBitmap.size();i++){
imagePiece=mItemBitmap.get(i);
ImageView item=new ImageView(getContext());
item.setImageBitmap(imagePiece.bitmap);
item.setOnClickListener(this);
mGamePinTuItems[i]=item;
//设置一个tag标签,在做切换的时候拿到bitmap
//i是为了方便,我们位置交换的时候拿到bitmap,imagePiece.index是为了判断游戏是否结束
item.setTag(i+"_"+imagePiece.index);
//设置imageView的id,为设置位置做准备
item.setId(i+1);
//规定宽高
lp=new RelativeLayout.LayoutParams(mItemWidth,mItemWidth);
//定位,
//首先不是第一列的判断,全部都要写在谁的右边
if (i%mPiece!=0){
lp.addRule(RelativeLayout.RIGHT_OF,mGamePinTuItems[i-1].getId());
lp.leftMargin=mMargin;
}
//不是第一行的判断,全部需要写在谁的下边
if (i>=mPiece){
lp.addRule(RelativeLayout.BELOW,mGamePinTuItems[i-mPiece].getId());
lp.topMargin=mMargin;
}
addView(item,lp);
}
}
List<ImagePiece> mItemBitmap;
//游戏的图片
private Bitmap mBitmap;
private int mPiece=3;
private void initBitmap() {
if (mBitmap==null){
//从资源文件中取出图片并且转成bitmap图片
mBitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.chazhuo);
}
//分割图片
mItemBitmap=ImageSplitterUtils.splitImage(mBitmap,mPiece);
//通过Collections可以帮助我们完成乱序,sort进行,它里面有两个参数,排序集合排序规则
Collections.sort(mItemBitmap, new Comparator<ImagePiece>() {
@Override
public int compare(ImagePiece imagePiece, ImagePiece t1) {
//随机返回1或者-1,达到乱序的效果,
return Math.random()>0.5?1:-1;
// Math.random();--生成随机数,返回值是double,范围是0.0-1.0
}
});
} /**
* 可变参数的写法:int...params
* 那么params他就是一个参数数组,这里规定他的类型就是一个int型的
*
* @return
*/
private int min(int... params) {
int min = params[0];
for (int param : params) {
if (min > param) {
min = param;
}
}
return min;
}
private ImageView mFirstIv;
private ImageView mSecondIv;
@Override
public void onClick(View view) {
//点击事件
// Toast.makeText(getContext(), "----"+view.getId(), Toast.LENGTH_SHORT).show();
if (mFirstIv==null){
mFirstIv= (ImageView) view;
//color.red getColor方法获取资源文件color 十六进制的写法 Color.parseColor("#0000000")
mFirstIv.setColorFilter(Color.parseColor("#55ff0000"));
}else if (mFirstIv==view){
mFirstIv.setColorFilter(null);
mFirstIv=null;
}else {
//发生交换
mSecondIv= (ImageView) view;
exchangeView();
} }
private Bitmap mFirstBitmap,mSecondBitmap;
/**
* 作交换,做动画
*/
private void exchangeView() {
mFirstIv.setColorFilter(null);
String firstTag=mFirstIv.getTag().toString();
String secondTag=mSecondIv.getTag().toString();
mFirstBitmap=mItemBitmap.get(getImageIdByTag(mFirstIv.getTag().toString())).bitmap;
mSecondBitmap=mItemBitmap.get(getImageIdByTag(mSecondIv.getTag().toString())).bitmap;
//交换bitmap,并且交换tag
mFirstIv.setImageBitmap(mSecondBitmap);
mSecondIv.setImageBitmap(mFirstBitmap);
mFirstIv.setTag(secondTag);
mSecondIv.setTag(firstTag);
mFirstIv=mSecondIv=null;
checkGameOver();
} private void checkGameOver() {
boolean isOver=true;
for (int i=0;i<mGamePinTuItems.length;i++){
ImageView iv=mGamePinTuItems[i];
//拿到当前位置的index,判断游戏结束
int index=getImageIndexByTag(iv.getTag().toString());
if (index!=i){
//表示游戏继续进行
isOver=false;
break;
}
if (isOver){
String msg="game over,you win!";
Toast.makeText(getContext(), "game over,you win!", Toast.LENGTH_SHORT).show();
} }
} /**
* 根据tag,获取
*/
public int getImageIdByTag(String tag){
//字符串分割split
String[] mStrs=tag.split("_");
return Integer.parseInt(mStrs[0]);
}
public int getImageIndexByTag(String tag){
//字符串分割split
String[] mStrs=tag.split("_");
return Integer.parseInt(mStrs[1]); }
}
package com.example.administrator.pintu;

import android.graphics.Bitmap;

import java.util.ArrayList;
import java.util.List; /**
* 分割图片,并且将图片放在
* Created by Zyh on 2016/11/22.
*/
public class ImageSplitterUtils {
/**
* 将目标图片进行分割,成piece块,然后存入集合当中返回出去
* @param bitmap
* @param piece
* @return
*/
public static List<ImagePiece> splitImage(Bitmap bitmap,int piece){
List<ImagePiece> mList=new ArrayList<>();
//拿到图片的宽度和高度
int width=bitmap.getWidth();
int height=bitmap.getHeight();
width=Math.min(width,height);
//计算出每一个piece的宽度
int pieceWith=width/piece;
ImagePiece temImagePiece;
for (int i=0;i<piece;i++){
for (int j = 0; j <piece ; j++) {
temImagePiece=new ImagePiece();
//每一次分割的起始坐标
int x=pieceWith*j;
int y=pieceWith*i;
//createBitmap--这个方法可以对图片进行切割,位置是(x,y),大小为后面两个参数
Bitmap mBitmap=Bitmap.createBitmap(bitmap,x,y,pieceWith,pieceWith);
temImagePiece.bitmap=mBitmap;
temImagePiece.index=j+i*piece;
mList.add(temImagePiece);
}
}
return mList;
}
}
package com.example.administrator.pintu;

import android.graphics.Bitmap;

/**
* Created by Zyh on 2016/11/22.
*/
public class ImagePiece {
//存放图片和分割的序号
public int index;
public Bitmap bitmap; public ImagePiece() {
} public ImagePiece(int index, Bitmap bitmap) { this.index = index;
this.bitmap = bitmap;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.administrator.pintu.GamePinTuLayout
android:padding="3dp"
android:id="@+id/pintu"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.example.administrator.pintu.GamePinTuLayout>
<TextView
android:layout_marginLeft="10dp"
android:layout_marginBottom="10dp"
android:textStyle="italic"
android:textSize="20sp"
android:gravity="center"
android:background="@drawable/textbg"
android:layout_alignLeft="@id/pintu"
android:layout_above="@id/pintu"
android:id="@+id/time"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="123"/>
<TextView
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:textStyle="italic"
android:background="@drawable/textbg"
android:textSize="20sp"
android:gravity="center"
android:layout_above="@id/pintu"
android:layout_alignRight="@id/pintu"
android:id="@+id/cishu"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="1"/>
</RelativeLayout>

GamePinTu的更多相关文章

  1. Android拼图游戏

    效果如下 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准 ...

  2. Android 实战美女拼图游戏 你能坚持到第几关

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40595385,本文出自:[张鸿洋的博客] 1.概述 继2048之后,今天给大家带 ...

随机推荐

  1. .Net 转战 Android 4.4 日常笔记(3)--目录结构分析

    看了创建项目后,出现的文件夹很多确实有点晕,不过经过简单的了解还是跟我们asp.net的目录有点相识滴. 下面这张图,概括了主要的文件用途.其实也只需要了解这几个就差不多了,知道在那里设计界面,那里写 ...

  2. Android重写菜单增加系统自带返回键

    条件:当前项目导入了ActionBarSherlock这个jar包,这个jar包的作用为了程序的兼容性,考虑低版本的问题. 学习ActionBarSherlock参考博客链接:http://blog. ...

  3. 【重磅开源】Hawk-数据抓取工具:简明教程

    Hawk-数据抓取工具:简明教程 标签(空格分隔): Hawk Hawk: Advanced Crawler& ETL tool written in C#/WPF 1.软件介绍 HAWK是一 ...

  4. 如何利用脚本实现MySQL的快速部署以及一机多实例的部署

    MySQL有三个版本:二进制,源码包,RPM. 下面讲讲二进制包的安装过程 下载地址: http://dev.mysql.com/downloads/mysql/ 选择Linux-Generic 我这 ...

  5. DDD 领域驱动设计-三个问题思考实体和值对象

    消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...

  6. 将Excel文件转换为Html

    将Excel文件转换为HTML 背景 我的工作有时会涉及到财务数据的处理.我们大家都知道,Excel文件在处理数据中很流行并且被广泛使用.Excel让我们可以将存储在里面的数据进行数学计算.我在工作中 ...

  7. CocoaPods 安装 使用

    1.开启 terminal 2.移除现有 Ruby 默认源 $ gem sources --remove https://rubygems.org/ 3.使用新的源 $ gem sources -a ...

  8. flex布局示例

    来自:授权地址 作者:水牛01248 几个横排元素在竖直方向上居中 display: flex; flex-direction: row;//横向排列 align-items: center;//垂直 ...

  9. Kooboo CMS 无聊随笔 (1)

    因为公司的框架不开源,但是自己一直都有研究框架的兴趣,所以拿了一个开源的框架过来,而这个开源的框架就是Kooboo CMS.首先我无法用言语来形容我对这个CMS的赞美之词了,总之大家知道一点,这个CM ...

  10. Lucene.net初探

    引言 在分析同事开发的客户端搜索项目时注意到,搜索的关键是索引,而提到索引就不得不提Lucene.net,思路就是将需要搜索内容写入索引,客户端自己或局域网其他机器搜索时直接搜索索引,从而查看到你共享 ...