2012-09-24 4 views
0

맞춤 슬라이드 컨트롤을 만들고 있습니다. 볼륨 휠과 같기 때문에 회전 방향에 따라 일부 값이 증가하거나 감소합니다. 나는이 두 가지 문제가 있습니다Android 그래픽 : 저 성능

  1. 성능은
  2. 가비지 컬렉터 정말 낮은 트리거, 많은 여러 번이다.

글쎄, 내가 틀린 일을하고 있다고 확신하기 때문에 나에게 빛을주십시오.

2.1 (eclaire) SDK의 Android 그래픽 작업 중입니다.

public class DrawingView extends View { 

private Paint p; 
Bitmap bitmap; 
Context mContext; 
Canvas canvas; 
private float sweepAngle; 
private int _height; 
private int _width; 
private float lastAngle; 
private int percent; 

public DrawingView(Context context) { 
    super(context); 
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    this.set_Width(display.getWidth()); 
    this.set_Height(display.getHeight()); 
    this.setSweepAngle(10); 
    mContext = context; 
    p = new Paint(); 
    p.setAntiAlias(true); 

} 

protected int getAngleFromLocation(Point location){ 
    int finalAngle = (int) (Math.atan2(location.y - 200, location.x - 200) * (180/Math.PI)); 
    return finalAngle; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),Bitmap.Config.ARGB_8888); 
    this.canvas = new Canvas(bitmap); 
    RectF rectF = new RectF(); 
    rectF.set(20, 20, this.get_Widtt() - this.get_Widtt()/10, this.get_Widtt() - this.get_Widtt()/10); 
    canvas.drawArc(rectF, 180, this.getSweepAngle(), true, p); 
    //invalidate(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    double increment = 3.6; 
    Point touchLocation = new Point(); 
    touchLocation.x = (int)event.getX(); 
    touchLocation.y = (int)event.getY(); 
    canvas.drawBitmap(bitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.ARGB_8888),event.getX(), event.getY(),null); 
    switch (event.getAction()) 
    { 
     case MotionEvent.ACTION_DOWN: 
      lastAngle = this.getAngleFromLocation(touchLocation); 
      System.out.println("ACTION_DOWN"); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      System.out.println("ACTION_MOVE"); 
      int currentAngle = this.getAngleFromLocation(touchLocation); 
      System.out.println("CURRENT ANGLE: " + currentAngle); 
      if (currentAngle > lastAngle || (currentAngle == 1 && lastAngle == 359)) { 
       percent += increment; 
      } else if (currentAngle < lastAngle) { 
       percent -= increment; 
      } 
      if (percent > 360) { 
       percent = 360; 
      } else if (percent < 0) { 
       percent = 0; 
      } 
      lastAngle = currentAngle; 
      this.setSweepAngle(percent); 
      //Write the label 
      //int realPercent = percent*100/360; 
      System.out.println("PERCENT: "+percent); 
      break; 

     case MotionEvent.ACTION_UP: 
      break; 
    } 
    return true; 
} 
} 

답변

3

모든 프레임에 새로운 비트 맵을 만들 필요가 없습니다 :

내 활동에서 호출 오전 뷰의 코드입니다. 실제로 onDraw()에서 어떤 객체도 할당하지 않도록해야합니다.

이 시도 :

private RectF mRectF = new RectF(); 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.BLACK); 
    mRectF.set(20, 20, this.get_Widtt() - this.get_Widtt()/10, this.get_Widtt() - this.get_Widtt()/10); 
    canvas.drawArc(rectF, 180, this.getSweepAngle(), true, p); 
} 

도 onTouchEvent에서 canvas.drawBitmap 호출()를 제거합니다.

+0

이제 더 부드럽게 보입니다. 고마워요! –

0

너무 오래 걸리고 GC를 너무 많이 유발하는 비트 맵/캔버스 제작 일 가능성이 큽니다. 특히 onDraw() 중에 가능한 한 작은 개체 생성을 수행하고 싶습니다. onTouchEvent()도 마찬가지입니다. 한 번 호출되고 각 프레임마다 동일한 비트 맵을 다시 사용하는 별도의 메소드로 이동할 수없는 이유가 있습니까? createBitmap()에 전달하는 값이 고정되어있어 문제가되지 않아야합니다.