2014-03-02 42 views
0

我編寫了一個基本的遊戲應用程序,它由可以通過滑動(類似於CandyCrush)交換的塊組成。我成功地識別了輕掃手勢,但是我的代碼改變了GridLayout中視圖(塊)的位置,只能在模擬器中使用,但不能在真實設備(Samsung Galaxy S3)上使用。GridLayout(Android)中兩個視圖的交換位置

另外我找不到一種方式爲兩個視圖的交換設置動畫。我已經將android:animateLayoutChanges="true"添加到GridLayout XML中,但它沒有改變任何內容。

這裏是我的交換代碼:

// change to blocks positions in grid layout 
GridLayout.LayoutParams sourceParams = (GridLayout.LayoutParams)this.imageView.getLayoutParams(); 
GridLayout.LayoutParams targetParams = (GridLayout.LayoutParams)otherBlock.imageView.getLayoutParams(); 

GridLayout.Spec sourceRowSpec = sourceParams.rowSpec; 
GridLayout.Spec sourceColumnSpec = sourceParams.columnSpec; 
sourceParams.rowSpec = targetParams.rowSpec; 
sourceParams.columnSpec = targetParams.columnSpec; 
targetParams.rowSpec = sourceRowSpec; 
targetParams.columnSpec = sourceColumnSpec; 

this.imageView.setLayoutParams(sourceParams); 
otherBlock.imageView.setLayoutParams(targetParams); 

gameGridLayout.requestLayout(); 

而這裏的應用程序的截圖:

enter image description here

回答

1

你必須有自己的佈局索引表,並在你的繪製方法運行通過這個索引來繪製每個塊。 就像是:

private int [][] index; 

void onDraw(Canvas canvas) { 
    for (int i = 0; i < MAX_BLOCK_HEIGHT; i++) { 
     for (int j = 0; j < MAX_BLOCK_WIDTH; j++) { 
      // Draw block index[i][j] 
     } 
    } 
} 

void swapBlock(int blockX, int blockY, int relativePos) { 
    int tmpBlock = index[blockY][blockX]; 
    if (relativePos == AT_LEFT) { 
     index[blockY][blockX] = index[blockY][blockX - 1]; 
     index[blockY][blockX - 1] = tmpBlock; 
    } 
    // And so on... 

} 

而這個指標可以幫助所有的時間,不僅是位塊。

+0

我已經有了一張可以繪製的索引表。我實際上畫了它,但我不想刪除所有視圖並重新繪製每個塊,只交換兩個塊。這會花費不必要的時間。難道只重繪這兩個?或者我誤解了你的建議? – CGee

+0

現代處理器可以處理大量視圖操作,不用擔心效率問題。 :) – Lovy

+0

我的意思是,看看殭屍海嘯,例如,大約100個意見畫的每一幀,加上rotozoom操作殭屍和硬幣 – Lovy