micasa
2017-02-06 23:30
在判断图片是否与空图片相邻这,为什么我点击任何方块都显示false?
package com.micasa.test3;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.GridLayout;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Toast;import static android.R.attr.x;import static android.R.attr.y;public class MainActivity extends AppCompatActivity { private ImageView[] [] game_arr = new ImageView[5][5]; private GridLayout rl_gl_game; private ImageView blankImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Bitmap bigBm = ((BitmapDrawable)getResources().getDrawable(R.drawable.zhi)).getBitmap(); int bmwandh = bigBm.getWidth()/5; int arrwandh = getWindowManager().getDefaultDisplay().getWidth()/5; for (int i = 0; i <game_arr.length ; i++) { for (int j = 0; j <game_arr[i].length ; j++) { Bitmap bm = Bitmap.createBitmap(bigBm,j*bmwandh,i*bmwandh,bmwandh,bmwandh); game_arr[i] [j] = new ImageView(this); game_arr[i] [j].setLayoutParams(new RelativeLayout.LayoutParams(arrwandh,arrwandh)); game_arr[i] [j].setImageBitmap(bm); game_arr[i] [j].setPadding(1,1,1,1); game_arr[i] [j].setTag(new GameData(x,y,bm)); game_arr[i] [j].setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean flag = isbyNullImageView((ImageView)v); Toast.makeText(MainActivity.this, ""+flag, Toast.LENGTH_SHORT).show(); } }); } } rl_gl_game = (GridLayout) findViewById(R.id.rl_gl_game); for (int i = 0; i <game_arr.length ; i++) { for (int j = 0; j <game_arr[i].length ; j++) { rl_gl_game.addView(game_arr[i] [j]); } } setNullImageView(game_arr[4] [4]); } public void setNullImageView(ImageView fillImageView){ fillImageView.setImageBitmap(null); blankImageView = fillImageView; } public boolean isbyNullImageView(ImageView fillImageView){ GameData blankGameData = (GameData) blankImageView.getTag(); GameData fillGameData = (GameData) fillImageView.getTag(); if (blankGameData.y==fillGameData.y&&blankGameData.x+1==fillGameData.x) { return true; }else if(blankGameData.y==fillGameData.y&&blankGameData.x-1==fillGameData.x){ return true; }else if(blankGameData.x==fillGameData.x&&blankGameData.y+1==fillGameData.y) { return true; }else if(blankGameData.x==fillGameData.x&&blankGameData.y-1==fillGameData.y){ return true; } return false; } class GameData{ public int x = 0; public int y = 0; public Bitmap bm; public int p_x = 0; public int p_y = 0; public GameData(int x, int y, Bitmap bm) { super(); this.x = x; this.y = y; this.bm = bm; this.p_x = x; this.p_y = y; } } }
我这个没有写完,只执行了点击可以移到空白的地方,你那个太乱了看着头疼,如果结构分开可以给你看看错误
你这个太乱了
复制我这个就行
package com.textone.pintu;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
/*利用二维数组创建若干个游戏小方块*/
private ImageView[][] iv_game_arr = new ImageView[4][4];
/*游戏主界面*/
private GridLayout gl_main_game;
/*当前空方块的的实例保存*/
private ImageView iv_null_ImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*初始化游戏的若干个小方块*/
Bitmap bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.bg)).getBitmap();//获取一张大图
int tuWandH = bigBm.getWidth() / 4;//每个游戏小方块的宽和高
for (int i = 0; i < iv_game_arr.length; i++) {
for (int j = 0; j < iv_game_arr[0].length; j++) {
Bitmap bm = Bitmap.createBitmap(bigBm, j * tuWandH, i * tuWandH, tuWandH, tuWandH);//根据行和列切成若干个游戏小图片;
iv_game_arr[i][j] = new ImageView(this);
iv_game_arr[i][j].setImageBitmap(bm);//设置每一个游戏小方块的图案
iv_game_arr[i][j].setPadding(2, 2, 2, 2);//设置方块之间的间距
iv_game_arr[i][j].setTag(new GameData(i, j, bm));//绑定自定义的数据
iv_game_arr[i][j].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean flag = isHasByNullImageView((ImageView) v);
Toast.makeText(MainActivity.this,"位置关系是否存在:"+flag,Toast.LENGTH_SHORT).show();
if(flag){
changeDataByImageView((ImageView) v);
}
}
});
}
}
/*初始化游戏主界面,并添加若干个小方块*/
gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
for (int i = 0; i < iv_game_arr.length; i++) {
for (int j = 0; j < iv_game_arr[0].length; j++) {
gl_main_game.addView(iv_game_arr[i][j]);
}
}
/*设置第一行最后一个方块是空的*/
setNullImageView(iv_game_arr[0][3]);
}
/*利用动画结束之后,交换两个方块的数据
*
* @param mImageView
* 点击的方块
*/
public void changeDataByImageView(final ImageView mImageView){
//创建一个动画,设置好方向,移动的距离
TranslateAnimation translateAnimation = null;
if (mImageView.getX() > iv_null_ImageView.getX()){//当前点击方块在空方块下边
//往上移动
translateAnimation = new TranslateAnimation(0.1f, -mImageView.getWidth(), 0.1f, 0.1f);
}else if(mImageView.getX() < iv_null_ImageView.getX()){
//往下移动
translateAnimation = new TranslateAnimation(0.1f, mImageView.getWidth(), 0.1f, 0.1f);
}else if(mImageView.getY() > iv_null_ImageView.getY()){
//往左移动
translateAnimation = new TranslateAnimation(0.1f, 0.1f, 0.1f, -mImageView.getWidth());
}else if(mImageView.getY() < iv_null_ImageView.getY()){
//往右移动
translateAnimation = new TranslateAnimation(0.1f, 0.1f, 0.1f, mImageView.getWidth());
}
//设置动画的时长
translateAnimation.setDuration(70);
//设置动画结束之后是否停留
translateAnimation.setFillAfter(true);
//设置动画结束之后要真正的把数据交换了
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mImageView.clearAnimation();
GameData mGameData = (GameData) mImageView.getTag();
iv_null_ImageView.setImageBitmap(mGameData.bm);
GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
mNullGameData.bm = mGameData.bm;
mNullGameData.p_x = mGameData.p_x;
mNullGameData.p_y = mGameData.p_y;
setNullImageView(mImageView);//设置当前点击的是空方块
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
//执行动画
mImageView.startAnimation(translateAnimation);
}
/*
* 设置某个方块为空方块
* @param mImageView 当前要设置为空的方块的实例
*/
public void setNullImageView(ImageView mImageView) {
mImageView.setImageBitmap(null);
iv_null_ImageView = mImageView;
}
/*
* 判断当前点击的方块,是否与空方块的位置关系是相邻关系
* @param mImageView 所点击的方块
* @return true:相邻,false:不相邻
*/
public boolean isHasByNullImageView(ImageView mImageView) {
//分别获取当前空方块的位置,通过x,y两边都差1的方式判断
GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
GameData mGameData = (GameData)mImageView.getTag();
if (mNullGameData.y == mGameData.y&&mGameData.x+1 == mNullGameData.x){//当前点击方块在空方块的上边
return true;
}else if(mNullGameData.y == mGameData.y&&mGameData.x-1 == mNullGameData.x){//当前点击的方块在空方块的下边
return true;
}else if(mNullGameData.y == mGameData.y+1&&mGameData.x == mNullGameData.x){//当前点击的方块在空方块的左边
return true;
}else if(mNullGameData.y == mGameData.y-1&&mGameData.x == mNullGameData.x){//当前点击的方块在空方块的右边
return true;
}
return false;
}
/*每个游戏小方块上要绑定数据*/
class GameData{
/*每个小方块的实际位置x*/
public int x = 0;
/*每个小方块的实际位置y*/
public int y = 0;
/*每个小方块的图片*/
public Bitmap bm;
/*每个小方块的图片的位置*/
public int p_x = 0;
/*每个小方块的图片的位置*/
public int p_y = 0;
public GameData(int x, int y, Bitmap bm){
super();
this.x = x;
this.y = y;
this.bm = bm;
this.p_x = x;
this.p_y = y;
}
}
}
快速实现不一样的移动拼图
15576 学习 · 67 问题
相似问题