滑动不进行数据交互
我最后demo的时候,点击空方块旁边有图案的方块时,有图案的方块进行了滑动的动画,但是却没有和空方块进行交换,而是直接消失了,这就造成了我点击的有图的方块也变成空的,而之前空方块依旧是空方块。。是真的消失了,如果我把一列按顺序点下来,这一列就都消失了,后一列就自动补充到这一列来,请问这是什么原因造成的?我的代码和老师写的应该是一样的,检查了好几遍,都没有发现哪里错误。ps.我用的是AndroidStudio,不知道和这有没有关系。
我最后demo的时候,点击空方块旁边有图案的方块时,有图案的方块进行了滑动的动画,但是却没有和空方块进行交换,而是直接消失了,这就造成了我点击的有图的方块也变成空的,而之前空方块依旧是空方块。。是真的消失了,如果我把一列按顺序点下来,这一列就都消失了,后一列就自动补充到这一列来,请问这是什么原因造成的?我的代码和老师写的应该是一样的,检查了好几遍,都没有发现哪里错误。ps.我用的是AndroidStudio,不知道和这有没有关系。
2016-10-21
/**利用动画结束之后,交换两个方块的数据
* @param mImageView
* 点击的方块
* @param isAnim
* true:有动画,false:无动画
*/
public void changeDataByImageView(final ImageView mImageView,boolean isAnim){
if (!isAnim){
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);//设置当前点击的方块变为空方块
if (isGameStart){
isGameOver();//成功时,会弹出一个Toast
}
return;
}
//创建一个动画,设置的方向,以及移动的距离
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 onAnimationRepeat(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);//设置当前点击的方块变为空方块
if (isGameStart){
isGameOver();//成功时,会弹出一个Toast
}
}
});
//执行动画
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;
/*每个游戏小方块的图片的位置x*/
public int p_x = 0;
/*每个游戏小方块的图片的位置i*/
public int p_y = 0;
public GameData(int x,int y,Bitmap bm) {
super();
this.x = x;
this.y = y;
this.p_x = x;
this.p_y = y;
}
/*每个小方块的位置,是否是正确的*/
public boolean isTrue() {
if (x == p_x && y == p_y){
return true;
}
return false;
}
}
}
package imooc.a01_pintu;
public class MainActivity extends AppCompatActivity {
// 判断游戏是否开始
private boolean isGameStart = false;
// 利用二维数组创建若干个游戏小方块
private ImageView[][] iv_game_arr = new ImageView[3][5];
// 游戏主界面
private GridLayout gl_main_game;
// 当前空方块的实例的保存
private ImageView iv_null_ImageView;
/*当前手势*/
private GestureDetector mDetector;
@Override
public boolean onTouchEvent(MotionEvent event) {
mDetector.onTouchEvent(event);
return mDetector.onTouchEvent(event);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int type = getDirByGes(e1.getX(),e1.getY(),e2.getX(),e2.getY());
// Toast.makeText(MainActivity.this,""+type,Toast.LENGTH_SHORT).show();
changeByDir(type);
return false;
}
});
setContentView(R.layout.activity_main);
// 初始化游戏的若干个小方块
Bitmap bigBm = ((BitmapDrawable)getResources().getDrawable(R.drawable.kb)).getBitmap();//获取一张大图
int tuWandH = bigBm.getWidth() / 5;//每个游戏小方块的宽和高
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[2][4]);
//初始化随机打乱顺序方块
randowMove();
isGameStart = true;
}
/**根据手势的方向,获取空方块响应的相邻位置如果存在方块,那么进行数据交换
* type 1:上 2:下 3:左 4:右
*/
public void changeByDir(int type){
changeByDir(type,true);
}
/**根据手势的方向,获取空方块响应的相邻位置如果存在方块,那么进行数据交换
* @param type 1:上 2:下 3:左 4:右
* @param isAnim true:有动画,false:没有动画
*/
public void changeByDir(int type,boolean isAnim){
//获取当前空方块的位置
GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
//根据方向,设置响应的相邻的位置的坐标
int new_x = mNullGameData.x;
int new_y = mNullGameData.y;
if (type == 1){//要移动的方块在当前空方块的下边
new_x++;
}else if (type == 2){//要移动的方块在当前空方块的上边
new_x--;
}else if (type == 3){//要移动的方块在当前空方块的左边
new_y++;
}else if (type == 4){//要移动的方块在当前空方块的右边
new_y--;
}
//判断这个新坐标,是否存在
if (new_x >=0 && new_x < iv_game_arr.length&&new_y >= 0&&new_y < iv_game_arr[0].length){
//存在的话,开始移动。
if (isAnim){
changeDataByImageView(iv_game_arr[new_x][new_y]);
}else{
changeDataByImageView(iv_game_arr[new_x][new_y],isAnim);
}
}else{
//什么也不做
}
}
//判断游戏结束的方法
public void isGameOver(){
boolean isGameOver = false;
//要遍历每个游戏小方块
for (int i = 0; i < iv_game_arr.length; i++) {
for (int j = 0; j < iv_game_arr[0].length; j ++){
//为空的方块数据不判断跳过
if(iv_game_arr[i][j]==iv_null_ImageView){
continue;
}
GameData mGameData = (GameData) iv_game_arr[i][j].getTag();
if(!mGameData.isTrue()){
isGameOver = false;
break;
}
}
}
//根据一个开关变量决定游戏是否结束,结束时给提示
if (isGameOver){
Toast.makeText(this,"游戏结束",Toast.LENGTH_SHORT).show();
}
}
/**手势判断,是向左滑,还是向右滑
* @param start_x 手势的起始点x
* @param start_y 手势的起始点y
* @param end_x 手势的中止点x
* @param end_y 手势的中止点y
* @return 1:上 2:下 3:左 4:右
*/
public int getDirByGes(float start_x,float start_y,float end_x,float end_y) {
boolean isLeftOrRight = (Math.abs(start_x-end_x)>Math.abs(start_y-end_y)) ? true:false;//是否是左右
if(isLeftOrRight){//左右
boolean isLeft = start_x - end_x>0?true:false;
if (isLeft){
return 3;
}else {
return 4;
}
}else{//上下
boolean isUp = start_y - end_y>0?true:false;
if (isUp){
return 1;
}else {
return 2;
}
}
}
//随机打乱顺序
public void randowMove(){
//打乱的次数
for (int i = 0; i < 10 ; i++) {
//根据手势开始交换,无动画
int type = (int) (Math.random() * 4)+1;
changeByDir(type,false);
}
}
/**利用动画结束之后,交换两个方块的数据
* @param mImageView 点击的方块
*/
public void changeDataByImageView(final ImageView mImageView) {
changeDataByImageView(mImageView,true);
}
举报