Android佈局優化策略

咱們要知道佈局是否合理,能夠經過Hierarchy Viewer這個工具。打開Hierarchy Viewer(定位到tools/目錄下,直接執行hierarchyviewer的命令,選定須要查看的Process,再點擊Load View Hierarchy會顯示出當前界面的佈局Tree。在每一個模塊的Traffic light上有三個燈,分別表明了Measure, Layout and Draw三個步驟的性能。若是有紅燈了,那麼就說明這裏有點問題,須要優化。canvas

 

若是你在佈局中在LinearLayout中使用了layout_weight。咱們須要仔細評估究竟是否須要使用那樣的佈局,儘可能避免使用layout_weight。由於這樣會計算兩次。ide

 

若是你想要觀察和解決過分繪製,又一個簡單實用的竅門是移除Window默認的Background,而後在佈局文件中進行添加背景。工具

 

canvas.clipRect()這個方法可讓你選擇你須要繪製的區域,這裏能夠是Rect也能夠是path,能夠方便簡單的解決自定義view過分繪製的問題。佈局

這個方法能夠指定一塊矩形區域,只有在這個區域內纔會被繪製,其餘的區域會被忽視。
除了clipRect方法以外,咱們還可使用canvas.quickreject()來判斷是否沒和某個矩形相交,從而跳過那些非矩形區域內的繪製操做。性能

例子:優化

若是一個自定義view是這樣繪製的ui

    private Paint mPaint;
    private Bitmap mBitmap;
    private int mPadding = 0;
    
    public CView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kale);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < 2; i++) {
            canvas.save();
            Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding);
           
            canvas.drawBitmap(mBitmap,mPadding,0,mPaint);
            canvas.restore();
            mPadding += 100;
        }
        canvas.drawBitmap(mBitmap, mPadding, 0, mPaint);
    }
}

那麼檢測到的狀況以下:spa

能夠很明顯的看到有重疊的部分,重疊的部分出現了嚴重的紅色。那麼當咱們用clipRect來指定view繪製的區域後會如何呢?rest

能夠很明顯的看見重疊的部分沒有了,緣由就是咱們在代碼中指定了只繪製可見的部分,重疊的不可見部分不會去繪製。code

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < 2; i++) {
            canvas.save();
            Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding);
            canvas.clipRect(rect);
            canvas.drawBitmap(mBitmap,mPadding,0,mPaint);
            canvas.restore();
            mPadding += 100;
        }
        canvas.drawBitmap(mBitmap, mPadding, 0, mPaint);
    }
相關文章
相關標籤/搜索