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. eclipse导入web项目之后项目中出现小红叉解决办法

    项目中有小红叉我遇到的最常见的情况: 1.项目代码本身有问题.(这个就不说了,解决错误就OK) 2.项目中的jar包丢失.(有时候eclipse打开时会出现jar包丢失的情况,关闭eclipse重新打 ...

  2. IOS数据存储之FMDB数据库

    前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...

  3. mac下安装tomcat

    在window下面搭建tomcat环境很简单,那是因为我们不熟悉mac系统,当我们习惯了命令行的时候,也是so easy,只要通过以下几个步骤就可以解决,本人亲测可用,不会可以留言. 1.进入apch ...

  4. 1、NoSQL概述

    最近抽时间把Redis学了一下,所以就在网上找了一些资料.然后找到尚硅谷-周阳老师的视频教程,觉得里面的讲的挺好.所以就把他视频当中的资料教程整理出来. 单机MySQL的美好时代 在90年代,一个网站 ...

  5. 【CSS进阶】原生JS getComputedStyle等方法解析

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

  7. nodejs 代理 解决开发环境跨域问题

    前后端分离项目中,会遇到跨域问题.解决方法无非就是jsonp cors等. 本次项目前端不搭node服务,线上用nginx搭站点,nginx转发ajax请求server. 本地开发环境的跨域问题用no ...

  8. mysql转换类型

    今天遇到一个问题,那就是当时一个项目设计表的时候,把时间以20160101123596这样的形式,以varchar存到了数据库里. 今天要写一条sql,查询一个报表,条件就是要过滤这个时间,但是var ...

  9. 深入剖析tomcat之一个简单的web服务器

    这个简单的web服务器包含三个类 HttpServer Request Response 在应用程序的入口点,也就是静态main函数中,创建一个HttpServer实例,然后调用其await()方法. ...

  10. Asp.Net 上传图片并生成高清晰缩略图

    在asp.net中,上传图片功能或者是常用的,生成缩略图也是常用的.baidu或者google,c#的方法也是很多的,但是一用却发现缩略图不清晰啊,缩略图片太大之类的事情,下面是我在处理图片上的代码, ...