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不能正常处理滑动事件,导致我们想要的效果达成不了。
    

猜你喜欢

转载自blog.csdn.net/savelove911/article/details/52459445
今日推荐