更改的对象不会重绘

时间:2014-09-08 05:46:00

标签: java android

没关系,我想通了。我只是非常糟糕

这第一部分是在onDraw方法中。它正确地存储数组中的所有内容并绘制它们。当我调用invalidate()时,当我更改数组中对象的值时,它仍然会绘制对象的原始值。

   protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            if(once==false)
            {
                once=!once;

                for (int i = 0 ; i < xGrid ; i++) {
                    for (int j = 0 ; j < yGrid ; j++) {
                        //a bunch of objects (same kind) added to a 
                        //multidimentional array called gridTiles
                    }
                }

            }

            for(int x=0;x<8;x++)
            {
                for(int y=0;y<8;y++)
                {
                    gridTiles[x][y].draw(canvas);
                }
            }

从onTouch方法调用此方法。基本上我试图做的只是切换数组内的对象

 public void moveBlockOnGrid()
        {
            int touchXGridStart,touchXGridEnd; //start is where you first press and end is where your finger is lifted
            int touchYGridStart,touchYGridEnd;

            if(touchYStart>intValue(ht / 3.5)&&touchYStart<intValue(ht / 3.5 + (patternW * 4)))
            {
                touchYGridStart=((touchYStart-intValue(ht / 3.5))/(patternW/2));
                touchXGridStart=touchXStart/(patternW/2);
                //touchYGridStart=((1150-intValue(1920 / 3.5))/(1080/4*4/8))+1;


                touchYGridEnd=((touchY-intValue(ht / 3.5))/(patternW/2));
                touchXGridEnd=touchX/(patternW/2);

                if((Math.abs(touchXGridStart-touchXGridEnd)==1)||(Math.abs(touchYGridStart-touchYGridEnd)==1))
                {
                    if((Math.abs(touchXGridStart-touchXGridEnd)==1)&&(Math.abs(touchYGridStart-touchYGridEnd)!=1))
                    {
                        if(touchXGridStart<touchXGridEnd)
                        {
                            Tile tempTile=gridTiles[touchXGridEnd][touchYGridEnd];
                            gridTiles[touchXGridEnd][touchYGridEnd]=gridTiles[touchXGridStart][touchYGridStart];
                            gridTiles[touchXGridStart][touchYGridStart]=tempTile;
                        }

                    }
                }
                invalidate();
            }

2 个答案:

答案 0 :(得分:0)

我没有正确理解moveBlockOnGrid()。 但是为了刷新视图,您可以使用postInvalidate()方法。

确保您的数据在moveBlockOnGrid()

中更新

答案 1 :(得分:0)

这并不能回答您的问题,但我发现一项更改可能会使moveBlockOnGrid()中的逻辑更具可读性。据我所知,你只能交换垂直或水平的块#34;邻居&#34;。假设您将触摸坐标正确转换为网格坐标,您可以进行以下比较:

if (x1 - x2 == 0 and abs(y1-y2) == 1) or (y1 - y2 == 0 and abs(x1-x2) = 1)

这只是说x或y坐标的差异必须为1,而相反方向的差异必须为0.