这第一部分是在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();
}
答案 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.