view
一、view滑动方式:
1. scrollBY scrollto
优点:view提供的原生方法,专门用于view的滑动,且不影响内部元素的点击事件
缺点:只能移动view的内容,不能滑动view本身,适合对view本身的滑动
2. 使用动画
view动画:不会改变view本身的属性,事件仍会在老位置
属性动画(Android3.0以上)
优点:复杂的效果必须通过动画实现,主要适用于没有交互的view
3,改变布局参数
margin等
优点:适用于有交互的view
弹性滑动:
1.使用scroller
mScroller.startScroll(int startX,int startY,int dx,int dy,int duration);
computeSroller();
invalidate(); 会重绘view,在view的draw方法中会调用computeSroller()方法
2.通过动画:
3.使用延时策略
使用handler或view的postDelayed方法,使用线程的sleep方法
二、事件分发机制:
dispathTounchEvent():事件的分发
onInterceptTounchEvent():是否拦截
onTouchEvent():处理事件
onTouchListener中onTouch方法优先级高于onTouchEvent(action_down会被重置,所以优先级高)
只要一个事件被拦截,其余的事件都会交给该view
onTouch方法返回值,返回true,onTouchEvent不处理,返回false,onTouchEvent继续处理
view的onTouchEvent默认会消耗事件,除非是不可点击的,
事件点击传递顺序:Activity-----window-----view
viewgroup extends view
三、滑动冲突
1. 三种场景:
1 viewpager+fragment
外部上下,内部左右
处理机制:
根据滑动方向是水平还是竖直判断谁来拦截事件
根据起点与终点间水平方向与竖直方向上滑动的距离差,哪个大,判断为滑动的那个方向
2 内外同一方向滑动
业务逻辑
3 场景1和2 的嵌套
如slidingmenu 内部有viewpager ,viewpager里有listview
2. 外部拦截法
父容器拦截事件,重写父容器的onInterceptTouchEvent方法
父容器的onIntercept方法
MotinEvent.ACTIN_MOVE:父容器需要拦截返回true,否则返回false
3.内部拦截法
自容器的dispatchEvent方法
ACTION_DOWN:parent.requestDisallowInterceptTouchEvent(true)
ACTION_MOVE:parent.requestDisallowInterceptTouchEvent(false)
父容器的ACTION_DOMN return false
四、View的工作原理及自定义view
1. measure 测量view的宽和高 view树的遍历 MeasureSpec 计算view的实际大小 viewgroup遍历各个子view测量大小
layout 确定view在父容器中的放置位置
draw 将view绘制在屏幕上
Activity----window-----decorview(继承自framelayout)-----viewgroup(setContentView方法)Titleview、contentview
-----decorview为phoneWindow的实现类
绘制从viewroot的performTraversals方法,从上向下遍历整个视图树
view绘制自己,viewgroup负责子view绘制
ViewRoot ViewRootImpl,连接windowManager和Decorview的纽带
2.MeasureSpec
32位int值,前两位 SpecMode(测量模式),后30位SpecSize(规格大小)
测量模式:
UNSPECIFIED:不指定测量 模式,父视图不限制子视图的大小,通常用于系统内部
EXACTLY:match_parent或具体值 精确测量模式
AT_MOST: wrap_content 最大值模式,由窗口的尺寸和layoutparams共同决定
3.自定义view
继承view重写onDraw
继承viewgroup派生特殊的layout
继承特定的view
继承特定的viewgroup(如 linearlayout)
五、view的绘制流程
padding及margin处理
view 的padding 在onDraw方法中
viewgroup
onMeasure方法中处理ViewGroup的layout_width和layout_height为wrap_content的情况。
本例模拟的是类似LinearLayout垂直布局的情景,因此在宽度方面,选择子View中宽度最大的那一个再加上padding值作为ViewGroup预设的宽度;
在高度方面,算上所有子View的高度再加上padding值作为ViewGroup预设的高度,
最后将预设值与剩余空间进行比较,选择值最小的作为ViewGroup测量之后的值。
2. 在onLayout中处理padding,只需要在布置子View的时候加上padding的值即可。
一、view滑动方式:
1. scrollBY scrollto
优点:view提供的原生方法,专门用于view的滑动,且不影响内部元素的点击事件
缺点:只能移动view的内容,不能滑动view本身,适合对view本身的滑动
2. 使用动画
view动画:不会改变view本身的属性,事件仍会在老位置
属性动画(Android3.0以上)
优点:复杂的效果必须通过动画实现,主要适用于没有交互的view
3,改变布局参数
margin等
优点:适用于有交互的view
弹性滑动:
1.使用scroller
mScroller.startScroll(int startX,int startY,int dx,int dy,int duration);
computeSroller();
invalidate(); 会重绘view,在view的draw方法中会调用computeSroller()方法
2.通过动画:
3.使用延时策略
使用handler或view的postDelayed方法,使用线程的sleep方法
二、事件分发机制:
dispathTounchEvent():事件的分发
onInterceptTounchEvent():是否拦截
onTouchEvent():处理事件
onTouchListener中onTouch方法优先级高于onTouchEvent(action_down会被重置,所以优先级高)
只要一个事件被拦截,其余的事件都会交给该view
onTouch方法返回值,返回true,onTouchEvent不处理,返回false,onTouchEvent继续处理
view的onTouchEvent默认会消耗事件,除非是不可点击的,
事件点击传递顺序:Activity-----window-----view
viewgroup extends view
三、滑动冲突
1. 三种场景:
1 viewpager+fragment
外部上下,内部左右
处理机制:
根据滑动方向是水平还是竖直判断谁来拦截事件
根据起点与终点间水平方向与竖直方向上滑动的距离差,哪个大,判断为滑动的那个方向
2 内外同一方向滑动
业务逻辑
3 场景1和2 的嵌套
如slidingmenu 内部有viewpager ,viewpager里有listview
2. 外部拦截法
父容器拦截事件,重写父容器的onInterceptTouchEvent方法
父容器的onIntercept方法
MotinEvent.ACTIN_MOVE:父容器需要拦截返回true,否则返回false
3.内部拦截法
自容器的dispatchEvent方法
ACTION_DOWN:parent.requestDisallowInterceptTouchEvent(true)
ACTION_MOVE:parent.requestDisallowInterceptTouchEvent(false)
父容器的ACTION_DOMN return false
四、View的工作原理及自定义view
1. measure 测量view的宽和高 view树的遍历 MeasureSpec 计算view的实际大小 viewgroup遍历各个子view测量大小
layout 确定view在父容器中的放置位置
draw 将view绘制在屏幕上
Activity----window-----decorview(继承自framelayout)-----viewgroup(setContentView方法)Titleview、contentview
-----decorview为phoneWindow的实现类
绘制从viewroot的performTraversals方法,从上向下遍历整个视图树
view绘制自己,viewgroup负责子view绘制
ViewRoot ViewRootImpl,连接windowManager和Decorview的纽带
2.MeasureSpec
32位int值,前两位 SpecMode(测量模式),后30位SpecSize(规格大小)
测量模式:
UNSPECIFIED:不指定测量 模式,父视图不限制子视图的大小,通常用于系统内部
EXACTLY:match_parent或具体值 精确测量模式
AT_MOST: wrap_content 最大值模式,由窗口的尺寸和layoutparams共同决定
3.自定义view
继承view重写onDraw
继承viewgroup派生特殊的layout
继承特定的view
继承特定的viewgroup(如 linearlayout)
五、view的绘制流程
padding及margin处理
view 的padding 在onDraw方法中
viewgroup
onMeasure方法中处理ViewGroup的layout_width和layout_height为wrap_content的情况。
本例模拟的是类似LinearLayout垂直布局的情景,因此在宽度方面,选择子View中宽度最大的那一个再加上padding值作为ViewGroup预设的宽度;
在高度方面,算上所有子View的高度再加上padding值作为ViewGroup预设的高度,
最后将预设值与剩余空间进行比较,选择值最小的作为ViewGroup测量之后的值。
2. 在onLayout中处理padding,只需要在布置子View的时候加上padding的值即可。