安卓显卡:性能低下



我正在制作一个自定义滑动控件。就像一个音量轮,所以有些值会根据旋转方向增加或减少。我对此有两个问题:

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

无需在每个帧上创建新的位图。事实上,你应该尽量避免在 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() 的调用。

很可能是位图/画布创建花费了很长时间并触发了 GC。您希望在onDraw()期间尽可能少地创建对象,并且onTouchEvent()也是如此。有什么理由不能将其移动到一个单独的方法,该方法被调用一次并在每一帧重用相同的位图?看起来您传递给createBitmap()的值是静态的,因此这应该不是问题。

相关内容

  • 没有找到相关文章

最新更新