安卓面试之=》自定义View

纯属个人笔记,学习笔记!!!!!


1:自定义属性的声明和获取
分析要需要的属性
在res/values/attrs.xml中进行定义声明,在使用自定义控件xml中使用
在自定义控件构造方法中获取
主要用context.obtainStyleAttributes 去获取,获取完记得要 a.recycle()释放资源
2:测量onMeasure ==> (可能会触发多次)
1:EXACTLY(设置明确的值) AT_MOST(至多不能超过某个值) UNSPECIFIED(没有限制) 测量模式
2:MeasureSpec ==》辅助类,获取测量模式+和大小
3:setMeasuredDimension==》测量完后记得要调这个方法把高度设置进去
4:requstLayout()
private int measureHeight(int heightMeasureSpec){
int result = 0;
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
if (mode==MeasureSpec.EXACTLY){
result = size;
}else {
result = getNeedHeight()+ getPaddingTop()+getPaddingBottom();//计算自身高度
if (mode == MeasureSpec.AT_MOST){
result = Math.min(result,size);
}
}
return result;
}
3:布局onLayout(一般是只有继承ViewGroup才用) 只会触发一次
1:决定子View的位置
2:尽可能将onMeasure中一些操作移动到此方法中
3:requestLayout()
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
final int chilCount = getChildCount();
for (int i = 0; i < chilCount; i++) {
final View child = getChildAt(i);
if (child.getVisibility()==GONE) {
continue;
}
left = caculateChildLeft();//计算子view layout左上角的坐标
top = caculateChildTop();//计算子View layout左上角y坐标
child.layout(left,top,left+cWidth,top+cWidth);
}
super.onLayout(changed, left, top, right, bottom);
}
4:绘制onDraw(一般是自定义view)
1:需要绘制的内容
2:触发 invalidate() 主线程 postInvalidate()子线程中
3:绘制 就是调用Canvas.DrawXXX (Canvas+Paint 一些api的使用)
4:加一些动画变化 记得在相关位置调用者两个方法onSaceInstanceState() onRestoreInstanceState() 保存相关数据信息
5:onTouchEvent
1:onInterceptTouchEven(事件拦截)
2:dispatchTouchEvent(事件分发机制)
如果是继承ViewGroup==可能需要重写该方法拦截事件或者事件分发
getParent().requestDisallowInterceptTouchEvent(true);可以通过这个方法来设置触摸时间是否需要被拦截还是要自己消费
ACTION(_DOWN UP MOVE (POINT_DOWN POINT_UP 多点触控))
如果要考虑滑动的速度检测 要初始化VelocityTracker 在时间中要 vt.addMovement(ev)
在ACTION_UP中去进行速度判断,然后做相应操作
考虑多点触控的时候可以参考ScrollView进行处理:
==》要考虑哪一个触点,是那个真正操作当前view
==》当某个触点抬起了,就要改变当前活跃触点,
比如当前有三个手指,第二个手指按下,第一个手指产生的触点就失去了控制权,第二个手指放开了第一个手指又获得控制权
7:其他
状态的保存 onSaveInstanceState onRestoreInstanceState ==>比如progressBar的进度
ViewConfiguration 去获取相关常量
ScaleGestureDetector 写一个缩放手势
ViewDragHelper强大ViewGroup辅助类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值