CustomView 性能提示

不要在 onDraw 中分配新对象 ****

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint(); //Do not allocate here
}

而不是在画布中绘制 drawable …


``` placeholder
drawable.setBounds(boundsRect);

drawable.draw(canvas);
```

使用位图可以更快地绘制:

``` placeholder
canvas.drawBitmap(bitmap, srcRect, boundsRect, paint);
```

不要重绘整个视图以仅更新其中的一小部分。而是重绘视图的特定部分。

``` placeholder
invalidate(boundToBeRefreshed);
```

如果你的视图正在进行一些连续动画,例如显示每一秒的监视面,至少会停止活动的 `onStop()` 处的动画并将其重新启动到活动的 `onStart()` 上。

不要在视图的 `onDraw` 方法中进行任何计算,而应该在调用 `invalidate()` 之前完成绘图。通过使用此技术,你可以避免在视图中丢帧。

## 旋转

视图的基本操作是翻译,旋转等...当他们在自定义视图中使用位图或渐变时,几乎每个开发人员都遇到了这个问题。如果视图将显示旋转视图并且位图必须在该自定义视图中旋转,我们中的许多人会认为它会很昂贵。许多人认为旋转位图非常昂贵,因为要做到这一点,你需要翻译位图的像素矩阵。但事实是,它并不那么艰难! 而不是旋转位图,只需旋转画布本身!

``` placeholder
// Save the canvas state
int save = canvas.save();
// Rotate the canvas by providing the  center point as pivot and angle
canvas.rotate(pivotX, pivotY, angle);
// Draw whatever you want
// Basically whatever you draw here will be drawn as per the angle you rotated the canvas
canvas.drawBitmap(...);
// Now restore your your canvas to its original state
canvas.restore(save);
// Unless canvas is restored to its original state, further draw will also be rotated.
```