android View

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的值即可。



































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值