2016-01-26 50 views
-2

我試圖在運行時通過代碼在表格佈局中創建我的遊戲(一個圖像是一個遊戲點),並且一切正常,但只在onTouch事件中,它非常緩慢迴應時,當我觸摸它是需要約3秒的響應,並且我試圖通過放置一個可運行的循環是20毫秒,運行時似乎需要1秒循環。android應用程序速度很慢,有2,500個圖像查看

public boolean onTouch(View v, MotionEvent event) { 
    if (v.getId()==R.id.imgTouch) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       x1 = event.getX(); 
       y1 = event.getY(); 
       txtTest.setText("" + x1+"/"+img[10][10].getDrawable().toString()); 
       break; 
     case MotionEvent.ACTION_UP: 
      break; 
    } 
} 
    return true; 
} 

private void LoadScreen() { 
    int w = (int) (screenWidth/mCols-0.75); 
    ImageView view; 
    for (int i = 0; i < mRows; i++) { 
     TableRow tr = new TableRow(getApplicationContext()); 
     tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 
     for (int j = 0; j < mCols; j++) { 
      TableRow.LayoutParams lp = new TableRow.LayoutParams(w, w); 
      lp.setMargins(0,1, 1, 0); 
      view = new ImageView(getApplicationContext()); 
      view.setLayoutParams(lp); 

      if (j==mCols-1 || i==mRows-1 || j==0 ||i==0) 
       view.setBackgroundColor(Color.RED); 
      else 
       view.setBackgroundColor(Color.rgb(220,225,219)); 

      view.setImageResource(R.drawable.blank); 
      tr.addView(view); 
      img[i][j]=view; 
     } 
     tblScreen.addView(tr,new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT)); 
    } 
} 
+0

表中的所有圖像是否始終可見?或者它滾動到其位置時是否可見? – Ercan

+0

運行此遊戲時將會喜歡:https://www.flickr.com/photos/itismyaccount/24341123950/in/dateposted-public/,並且對於每個圖像視圖,背景顏色將從白色變爲黑色或其他。 –

回答

1

視圖是一些複雜的對象,包含大量的狀態並在關鍵時刻執行不重要的數量的代碼,主要是在UI線程上。當Android想要顯示你的UI時,它需要遍歷整個視圖層次結構,以便(a)測量,(b)佈局和(c)繪製這些視圖。對任何視圖的更改都可能導致Android重新運行任何或所有這些遍歷。此外,還有其他遍歷必須在各種情況下發生,例如傳播觸摸事件。

我想不出任何情況下,你應該有2500只ImageView在你的視圖層次結構(以及任何容器的觀點,你正在使用安排那些ImageView S)。很顯然,Android在處理這種層次結構的UI事件上花費的時間太長,導致對輸入事件的響應延遲以及跳過並行幀。

我不知道你的具體使用情況,但你應該做以下操作之一:

  • 如果只有你的「點」的一個子集都顯示在屏幕上,在任何給定的時間,用一些回收類型View,以便只有您需要顯示的視圖位於視圖層次結構中。這正是類似ListViewRecyclerView這樣的類適用於:它們包含足夠的視圖來顯示屏幕上適合的內容,並且它們將回收從屏幕滾動出來的視圖,因爲需要將新項目滾動到屏幕上。
  • 如果您的所有「點」都在屏幕上,請嘗試編寫View的子類以進行自定義繪圖。您不需要每個點保持其點的狀態的一個ImageView,您只需要知道如何繪製點的View。你可以保持你喜歡的任何有效的數據結構的所有點的狀態,並讓一個視圖畫出所有的點。

請考慮這兩個選項如何減少視圖層次的大小(以及深度),以及Android需要通過它時會產生什麼效果。

+0

感謝您的幫助,所以我認爲我使用畫布繪製2,500個背景顏色爲白色的矩形類型,並重新繪製背景顏色爲黑色的矩形以更改點的狀態。而且我也認爲一次加載2,500 imageview是不可行的。 –