1

通过参考http://developer.android.com/training/custom-views/optimizing-view.html#accelerate,我知道我可以onDraw通过使用setLayerType(View.LAYER_TYPE_HARDWARE, null);.

我在 Android 4 上进行了测试,方法是执行 home -> restore -> home。我意识到onDraw只会被调用一次,如上述 android 文档中所述。

但是,如何在 Android 2.3 中实现类似的优化?由于 Android 2.3 不支持硬件优化。

public class PieChart extends View {

    @SuppressLint("NewApi")
    public PieChart(Context context) {
        super(context);

        mPiePaint = new Paint();
        mPiePaint.setAntiAlias(true);
        mPiePaint.setStyle(Paint.Style.FILL);
        mPiePaint.setColor(0x88FF0000);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
            if (!isInEditMode()) {
                setLayerType(View.LAYER_TYPE_HARDWARE, null);
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Log.i("CHEOK", "Busy onDraw is called");

        canvas.drawArc(mBounds,
                0,
                200,
                true, mPiePaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mBounds = new RectF(0, 0, w, h);
    }

    private RectF mBounds;    
    private Paint mPiePaint;
}
4

1 回答 1

0

你应该尝试的是这个类的 2 个版本。

第一个将仅由硬件加速设备使用,并将使用谷歌文档中解释的优化

对于不支持此类优化的设备,您将使用“PieView”的第二个版本,其中 onDraw 方法首先在透明缓冲区位图上绘制其内容,然后再将此位图复制到画布上。这种代价高昂的绘制只会发生一次,并且未更改的位图将在后续调用中重复使用。当然,如果必须对此缓存图像进行任何更改(例如,如果调用 onSizeChanged),则必须重新计算。

于 2013-05-13T22:21:59.463 回答