2013-05-09 3 views
9

я получаю 3 предупреждение для размещения объекта во время водоразбора/макетаРаспределение объектов при рисовании/макете?

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); 

Я получаю сообщение об ошибке на новом Rect(); и на обеих новых Paint();

Точная ошибка избежать выделения объекта во время операций дро/компоновки (prelocate и повторно использовать вместо)

+2

Какие ошибки вы получаете? –

+0

Точная ошибка заключается в том, чтобы избежать распределения объектов во время операций рисования/компоновки (вместо этого использовать prelocate и повторно использовать) – lramos15

ответ

18

Ну, ваша «ошибка» указывает на точную проблему. onDraw() метод вызывается ОС много раз, поэтому выделение чего-то внутри этой функции - крайне плохая идея. Вы должны выделить свой Rect и Paint заранее и просто использовать их в 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

Избегайте выделения объекта во время операций ничья/компоновки (prelocate и повторно использовать вместо)

Сообщение дает вам решение на тарелке, поэтому я не понимаю, каков ваш вопрос.

Вам нужно переместить создание новых объектов в метод onCreate, поэтому они создаются только один раз и используют их позже в методе onDraw.

0

Для меня, я получил эту ошибку в макете, особенно при использовании дисплея metrices.

Я использовал этот 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:

импорт статических com.steve.TabHomeActivity.displaymetrics;

Я решил эту проблему путем добавления статических DisplayMetrices в OnCreate() метод в деятельности.

TabHomeActivity.java:

public static DisplayMetrics displaymetrics; 

*inside onCreate()* 

displaymetrics = new DisplayMetrics(); 
Смежные вопросы