021.關於自定義View

1.讓View支持wrap_content 
    這是因爲直接繼承View或者ViewGroup的控件,如果不在onMeasure中對wrap_content做特殊處理。那麼當外界在佈局中使用wrap_content時就無法達到預期的結果。

2.如果有必要,讓自定義的View支持padding,充分考慮margin和padding對ViewGroup的影響
    這是因爲直接繼承View的控件,如果不在draw方法中處理padding,那麼padding屬性是無法起作用的。另外,直接繼承自ViewGroup的控件需要在onMeasure和onLayout中考慮padding和子元素的margin對它造成的影響,不然會導致padding和子元素的margin不起作用。

3.沒必要在View中使用handler
    這裏不是說不能使用handler,而是,基本上沒有必要在View中去創建一個新的handler對象,因爲View本身有post方法。不過,我們對用handler實現回調也不反對的。

4.View中如果有線程或者動畫,需要及時停止,參考下View#onDetachedFromWindow
   在這邊介紹一下onDetachedFromWindow 這個方法,onDetachedFromWindow onAttachedToWindow 是對應的,onDetachedFromWindow  在View在destroy view的時候調用,所以可以加入取消廣播註冊等的操作。下面是View的onDetachedFromWindow方法:
   
 /**
     * This is called when the view is detached from a window.  At this point it
     * no longer has a surface for drawing.
     *
     * @see #onAttachedToWindow()
     */
    protected void onDetachedFromWindow() {
        //已經從窗口
        mPrivateFlags &= ~PFLAG_CANCEL_NEXT_UP_EVENT;
        mPrivateFlags3 &= ~PFLAG3_IS_LAID_OUT;

        removeUnsetPressCallback();
        removeLongPressCallback();
        removePerformClickCallback();
        removeSendViewScrolledAccessibilityEventCallback();

        destroyDrawingCache();
        destroyLayer(false);

        cleanupDraw();

        mCurrentAnimation = null;
    }

    所以,在這個方法中,我們需要把線程、動畫停止,同時釋放一些資源,如果不及時處理,是有可能造成內存泄露的。比如,我們的View有對象引用,但是那個View已經從窗體分離了,那個Activity已經消失了,這時候,還是有可能因爲View在其他Activity有引用,導致這個View的對象沒有被回收,造成內存泄露。

    
5.View帶有滑動嵌套情形時候,需要處理好滑動衝突。
    如果有滑動衝突,我們需要合適地去處理滑動衝突,否則會導致View不能正常處理滑動事件,導致我們想要的效果達成不了。
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章