2013-05-09 17 views
9

mam 3 ostrzeżenie dla alokacji obiektu podczas draw/układPrzydzielanie obiektów podczas rysowania/układu?

super.onDraw(canvas); 
canvas.drawColor(Color.WHITE); 
Paint textPaint = new Paint(); 
textPaint.setARGB(50,100,100,250); 
textPaint.setTextAlign(Align.CENTER); 
textPaint.setTextSize(50); 
textPaint.setTypeface(font); 
canvas.drawText("Logan is awesom",canvas.getWidth()/2,200,textPaint); 
canvas.drawBitmap(pBall, (canvas.getWidth()/2), changingY, null); 
if (changingY <canvas.getHeight()){ 
changingY += 10; 
}else{ 
changingY=0; 
} 
Rect middleRect = new Rect(); 
middleRect.set(0, 400, canvas.getWidth(), 550); 
Paint ourBlue = new Paint(); 
ourBlue.setColor(Color.BLUE); 
canvas.drawRect(middleRect, ourBlue); 

pojawia się błąd na nowym Rect(); i na obu nowych Paint();

Dokładny błędu uniknąć alokacji obiektów podczas operacji draw/Layout (prelocate i używać zamiast)

+2

Jakie błędy nie masz? –

+0

Dokładny błąd polega na unikaniu przydzielania obiektów podczas operacji rysowania/układania (prelocate i ponowne użycie) – lramos15

Odpowiedz

18

Cóż, twój "błąd" wskazuje na dokładny problem. onDraw() metoda jest wywoływana przez OS wiele razy wiele razy, więc przydzielenie czegoś w ramach tej funkcji jest bardzo złym pomysłem. trzeba przeznaczyć swój Rect i Paint wcześniej i po prostu użyć ich w onDraw

class YourClass extends View 
{ 
    Rect middleRect; 
    Paint ourBlue; 
    Paint textPaint; 

    public YourClass() 
    { 
     //constructor 
     init(); 
    } 

    private void init() 
    { 
     middleRect = new Rect(); 
     ourBlue; = new Paint(); 
     textPaint = new Paint(); 

     ourBlue.setColor(Color.BLUE); 
     textPaint.setARGB(50,100,100,250); 
     textPaint.setTextAlign(Align.CENTER); 
     textPaint.setTextSize(50); 
     textPaint.setTypeface(font); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawColor(Color.WHITE); 

     canvas.drawText("Logan is awesom",canvas.getWidth()/2,200,textPaint); 
     canvas.drawBitmap(pBall, (canvas.getWidth()/2), changingY, null); 
     if (changingY <canvas.getHeight()){ 
      changingY += 10; 
     }else{ 
      changingY=0; 
     } 

     //if canvas size doesn't change - this can be moved to init() as well 
     middleRect.set(0, 400, canvas.getWidth(), 550); 

     canvas.drawRect(middleRect, ourBlue); 
    } 
} 
-3

avoid alokacji obiektów podczas operacji draw/układ (prelocate i używać zamiast)

Wiadomość daje Ci rozwiązanie na tablicy, więc nie rozumiem, jakie jest Twoje pytanie.

Musisz przenieść tworzenie nowych obiektów do metody onCreate, więc są one tworzone tylko raz i używają ich później w metodzie onDraw.

0

Dla mnie, mam tego błędu w układzie zwłaszcza przy użyciu wyświetlacza metrices.

I była używana ImageView:

<com.steve.thirdparty.ScalableImageView 
     android:id="@+id/iv_posted_img_home" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitXY" 
     android:background="@drawable/golive_load_image" 
     android:layout_below="@+id/tv_user_posted_msg_post_items_home" 
     android:contentDescription="@string/cont_desc"/> 

ScalableImageView.java:

import statyczne com.steve.TabHomeActivity.displaymetrics;

Rozwiązałem ten problem, dodając statyczny DisplayMetrices w onCreate() metoda w Activity.

TabHomeActivity.java:

public static DisplayMetrics displaymetrics; 

*inside onCreate()* 

displaymetrics = new DisplayMetrics(); 
Powiązane problemy