2016-07-07 36 views
2

我知道我必須在主線程中進行很多工作,但我正在尋找解決方法。Android - 應用程序可能會在其主線程上做很多工作

這裏是我的應用程序的結構:

目前,我有我的主要活動,其中有6個可點擊imageviews(打開新的活動),當活動的一個被打開的問題發生。在這個活動中,我使用帶有3個選項卡的SlidingTabLayout。

這就是我想實現:

我創建一個鋼琴可繪製出的(形狀)

例如,這是黑鍵:

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
<stroke 
    android:width="1dp" 
    android:color="#FF000000" /> 

    <solid 
     android:color="#FF000000"/> 
</shape> 

然後我在我的佈局中將這個可繪製對象創建爲鋼琴:

<ImageView 
    android:layout_width="8dp" 
    android:layout_height="37dp" 
    android:layout_marginLeft="40dp" 
    android:layout_marginStart="10.5dp" 
    android:src="@drawable/key_black" /> 

我在顯示7圖像爲黑鍵和10個Imageviews提供白鋼琴PER琴,並且我有11個PER鋼琴選項卡。這就是每個標籤187 Imageview。

所以我明白這會對我的CPU造成嚴重的影響。我正在尋找一種方法來做到這一點我的主線程?在後臺做到這一點?要做到這一點沒有經歷滯後?

+0

你能提供一個它應該看起來像什麼樣的圖像,並解釋你想要什麼/應該做什麼?顯然你想要用戶與鋼琴的鍵進行交互?但是187個可以互動的項目在一個屏幕上看起來有點不可思議 – AljoSt

+0

我只想顯示鋼琴,我不希望用戶與它互動。 –

+0

[該應用程序可能在其主線程上做了太多工作]的可能重複(http://stackoverflow.com/questions/14678593/the-application-may-be-doing-too-much-work-on-its -main-thread) –

回答

0

所以如上所述,我會爲鋼琴創建一個基礎圖像,並根據當前按下的按鍵進行調整。下面的代碼顯示了一般的想法:從R.drawable加載基本圖像,使用按鍵的索引,以及創建圖像的大小Paths,繪製路徑,返回圖像。如果你需要清理,請告訴我。

public Bitmap getPianoImage(Context context, int[] pressedKeyIndices){ 
    Bitmap pianoImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.pianoBase); 
    Canvas canvas = new Canvas(pianoImage); 
    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 
    paint.setStyle(Paint.Style.FILL); 

    for(int pressedKeyIndex : pressedKeyIndices){ 
     Path path = getPathForKeyIndex(pressedKeyIndex, pianoImage.getWidth(), pianoImage.getHeight()); 
     canvas.drawPath(path, paint); 
    } 

    return pianoImage; 
} 

private Path getPathForKeyIndex(int idx, int w, int h){ 

    Path path = new Path(); 

    switch(idx){ 
     case 0: 
      path.moveTo(0f*w, 0f*h); // used for first point 
      path.lineTo(0f*w, 1f*h); 
      path.lineTo(0.1f*w, 1f*h); 
      path.lineTo(0.1f*w, 0.5f*h); 
      path.lineTo(0.08f*w, 0.5f*h); 
      path.lineTo(0.08f*w, 0f*h); 
      path.lineTo(0f*w, 0f*h); 
      break; 
     case 1: ... 
    } 

    return path; 
} 
+0

你能說清楚我應該在我的xml中做什麼嗎? –

+0

您不需要任何xml文件。將鋼琴的基本圖像(只有黑色和白色)放在'R​​.drawable'文件夾( - >'R.drawable.pianoBase')中。然後使用上面的代碼(需要完成)創建一個位圖。位圖獲取基礎圖像,並將與您傳入的ne indecies相對應的區域作爲函數的參數着色。 – AljoSt

+0

我把圖片放在了R.drawable中,我粘貼了你的代碼但沒有任何反應,看不到圖片..我明白你在說什麼,但我不能看到圖像 –

相關問題