为了账号安全,请及时绑定邮箱和手机立即绑定

滑动不进行数据交互

我最后demo的时候,点击空方块旁边有图案的方块时,有图案的方块进行了滑动的动画,但是却没有和空方块进行交换,而是直接消失了,这就造成了我点击的有图的方块也变成空的,而之前空方块依旧是空方块。。是真的消失了,如果我把一列按顺序点下来,这一列就都消失了,后一列就自动补充到这一列来,请问这是什么原因造成的?我的代码和老师写的应该是一样的,检查了好几遍,都没有发现哪里错误。ps.我用的是AndroidStudio,不知道和这有没有关系。

正在回答

5 回答

找到原因了,少了一句话。所以动画结束后要交换图片的时候,打印发现绑定的bm都是空的因此设置显示的图片也都是空白的。

this.bm = bm;

http://img1.sycdn.imooc.com//580eb06a0001779c06770531.jpg

1 回复 有任何疑惑可以回复我~
#1

慕粉4140763 提问者

谢谢老师
2016-10-25 回复 有任何疑惑可以回复我~
#2

慕粉4140763 提问者

老师,我修改过后发现游戏结束时,我的Toast也没有弹出来,麻烦您再帮我看一下是哪里的问题,谢谢。
2016-10-25 回复 有任何疑惑可以回复我~

是判断结束的方法,默认应该是true,逻辑是默认认为就是游戏结束了,当遍历所有方块发现有一个位置不对的时候都再改为false(这种方法叫开关变量方法,比如求一个数是不是素数就用了这种方法)

boolean isGameOver = true;

http://img1.sycdn.imooc.com//580ec14200014b7406250350.jpg

1 回复 有任何疑惑可以回复我~
#1

慕粉4140763 提问者

噢,明白啦,谢谢老师!
2016-10-25 回复 有任何疑惑可以回复我~

和AndroidStudio没关系,把整个Activity代码贴上来,我帮你找原因

0 回复 有任何疑惑可以回复我~
#1

慕粉4140763 提问者

老师,我贴好了,麻烦您看一下
2016-10-24 回复 有任何疑惑可以回复我~


       /**利用动画结束之后,交换两个方块的数据
        * @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;
       }
   }
}

0 回复 有任何疑惑可以回复我~

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);
   }

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

滑动不进行数据交互

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信