2013-04-10 9 views
0

Я попытался создать лабиринт с движущимся шаром и отверстием с помощью датчика акселерометра. С помощью следующего кода мяч попадает в отверстие, но производительность очень плохая, я устанавливаю Accelerometer Frequency на самую быструю, но это все, кроме гладкого. Я сделал второй холст, потому что я мог сделать дыру.Гладкое растровое движение в холсте (android)

public RenderView(Context context, int width, int height) { 
    super(context); 
    playGround = new Rect(40, 40, width - 40, height - 40); 
    holes.addElement(new PointF(500f, 500f)); 

    // Set background 
    this.setBackgroundResource(R.drawable.bottom); 

    // Set bitmap 
    woodGround= wood.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    bitmapCanvas = new Canvas(); 
    bitmapCanvas.setBitmap(woodGround); 

    // Set eraser paint properties 
    eraserPaint.setAlpha(0); 
    eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    eraserPaint.setAntiAlias(true); 
} 

protected void onDraw(Canvas canvas) { 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG 
      | Paint.FILTER_BITMAP_FLAG); 
    paint.setStyle(Style.FILL_AND_STROKE); 
    paint.setAntiAlias(true); 

    if (ballInHole) 
     canvas.drawBitmap(ball, b.x, b.y, paint); 

    bitmapCanvas.drawBitmap(wall, 0, 0, paint); 
    bitmapCanvas.drawBitmap(wood, playGround, playGround, paint); 

    canvas.drawBitmap(bitmap, 0, 0, paint); 

    for (PointF h : holes) { 
     bitmapCanvas.drawCircle(h.x + radius, h.y + radius, radius, 
       eraserPaint); 
    } 
    if (!ballInHole) 
     canvas.drawBitmap(ball, b.x, b.y, paint); 
    invalidate(); 
} 

Это решается очень некрасиво, потому что я просто рисовать мяч ниже других растровых изображений, когда он попадает в отверстие. Есть ли другой способ сделать это?

Производительность также очень плохая, я установил Accelerometer-Sensor-Delay на самый быстрый, но мяч не работает ровно. Когда я удаляю линию canvas.drawBitmap(bitmap, 0, 0, paint);, тогда мяч становится более плавным, но тогда деревянный фон прочь.

ответ

0

Проблема заключается в том, что вы делаете много рисунков все время, и на это требуется время, и производительность становится очень низкой.

вот несколько советов о том, как вы должны подходить к нему.

Возможно, вам лучше иметь один вид со статическим материалом (фоновое изображение и отверстия), а на вашем макете есть второй вид сверху, просто рисуя шар.

на фоновом изображении, не вызывайте invalidate. Таким образом вы будете рисовать фон только один раз.

и верхнее изображение (только мяч) вы можете аннулировать, чтобы он мог перерисовываться на новом месте.

Я не уверен в этой последней части: но вам может потребоваться позвонить invalidate(rect);, пройдя область, где был мяч в предыдущее время, чтобы сделать фон только повторным рисованием этой маленькой области (вместо всего экрана)

счастливы кодирования.

+0

Это сработало, я разделил его на разные взгляды, спасибо! Теперь это намного более гладко. – theyanu

 Смежные вопросы

  • Нет связанных вопросов^_^