Android自定义View注意事项

1.注意wrapcontent,自己写wrapcontent

2.注意在ondraw中创建临时对象

3.如果含有动画或者线程,需要在onDespatchedfromwindow 中取消,防止内存泄漏

4.注意padding,让view支持padding,在onDraw方法中获取padding

5.注意滑动冲突,解决滑动冲突

6.尽量不要使用handler,因为里边已有post系列方法,不需要再用handler

继承View重写onDraw方法

主要用于实现不规则的效果,即这种效果不方便通过布局的组合方式来实现。相当于就是得自己“画”了。采用这种方式需要自己支持wrap_content,padding也需要自己处理

继承ViewGroup派生特殊的Layout

主要用于实现自定义的布局,看起来很像几种View组合在一起的时候,可以使用这种方式。这种方式需要合适地处理ViewGroup的测量和布局,并同时处理子元素的测量和布局过程。比如自定义一个自动换行的LinerLayout等。

继承特定的View,比如TextView

这种方法主要是用于扩展某种已有的View,增加一些特定的功能。这种方法比较简单,也不需要自己支持wrap_content和padding。

继承特定的ViewGroup,比如LinearLayout

这种方式也比较常见,和上面的第2种方法比较类似,第2种方法更佳接近View的底层。

自定义View有多种方式,需要根据实际需要选择一种简单低成本的方式来实现

自定义View需要注意的地方

让View支持wrap_content

直接继承View和ViewGroup的控件需要在onMeasure方法中处理wrap_content的方法。处理方法是在wrap_content的情况下设置一个固定的尺寸

//处理wrap_content的套路

@Override

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//处理WAP_CONTENT

int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(200,200);

}else if (widthSpecMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(200, heightSize);

}else if (heightSpecMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(widthSize, 200);

}

}

让View支持padding

直接继承View的控件需要在onDraw方法中处理padding,否则用户设置padding属性就不会起作用。直接继承ViewGroup的控件需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然将导致padding和子元素的margin失效。

@Override

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

//获取padding,然后根据实际情况处理就好

mPaddingLeft = getPaddingLeft();

mPaddingRight = getPaddingRight();

mPaddingTop = getPaddingTop();

mPaddingBottom = getPaddingBottom();

mWidth = getWidth() - mPaddingLeft - mPaddingRight;

mHeight = getHeight() - mPaddingTop - mPaddingBottom;

}

**尽量不要在View中使用Handler

View中已经提供了post系列方法,完全可以替代Handler的作用。**

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值