2013-07-20 18 views
5

W sprzętowej akceleracji zwyczaj View dodane ScrollView lub ListView zarówno z poniższych fragmentów kodu daje ten sam wynik: (proszę ignorować najlepszych praktyk na sekundę)Dziwne zachowanie `drawTextOnPath()` ze sprzętem accelration

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    // centering stuff 
    float centerX = getWidth()/2f; 
    float centerY = getHeight()/2f; 
    float size = 80; 
    float halfSize = size/2f; 
    float left = centerX - halfSize; 
    float top = centerY - halfSize; 

    RectF oval = new RectF(left, top, left + size, top + size); 

    Path path = new Path(); 
    path.addArc(oval, 160, 359); 

    Paint paint = new Paint(); 
    paint.setTextSize(30); 
    paint.setStyle(Style.STROKE); 

    canvas.drawTextOnPath("Hello world", path, 0, 0, paint); //<--- line A 
    canvas.drawCircle(centerX, centerY, 10, paint);   //<--- line B 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    // centering stuff 
    float centerX = getWidth()/2f; 
    float centerY = getHeight()/2f; 
    float size = 80; 
    float halfSize = size/2f; 
    float left = centerX - halfSize; 
    float top = centerY - halfSize; 

    RectF oval = new RectF(left, top, left + size, top + size); 

    Path path = new Path(); 
    path.addArc(oval, 160, 359); 

    Paint paint = new Paint(); 
    paint.setTextSize(30); 
    paint.setStyle(Style.STROKE); 

    canvas.drawCircle(centerX, centerY, 10, paint);   //<--- line B 
    canvas.drawTextOnPath("Hello world", path, 0, 0, paint); //<--- line A 
} 

sam wynik:

enter image description here


Ale z późniejszym fragmencie kodu, jak tylko przewijać ScrollView(mam niewidzialny manekin View poniżej więc mogę przewinąć) i helloworld dotyka ActionBar, coś bardzo interesujące dzieje i widać coś, co intelligent humankind used to see in old Windows OS.

enter image description here


enter image description here

wiem drawTextOnPath() nie jest obsługiwana w trybie accelration sprzętowej, ale dlaczego to działa, jeśli nazwać to po raz pierwszy?

Odpowiedz

2

drawTextOnPath() wspiera akceleracji sprzętowej po Androidzie 4.1 to wspomniano oficjalnie tutaj: https://code.google.com/p/android/issues/detail?id=37925 ale następny komentarz wydaje się wskazywać problemu w sposób, więc może błąd.

oczywiście dla pre 4.1 prostu nie uczynić go używać akceleracji sprzętowej - Ustaw typ warstwy oprogramowania na widoku poprzez wywołanie View.setLayerType(View.LAYER_TYPE_SOFTWARE, null) i starają się uzyskać kompromis w sprawie perf vs błędów