美文网首页
Android控件 笔记

Android控件 笔记

作者: Yasin27878 | 来源:发表于2018-12-14 14:09 被阅读3次

View的基础知识

  1. MotionEvent 对象我们可以得到点击事件发生的x和y坐标.为此,系统提供了两组方法:getX/getY和getRawX/getRawY.他们的区别很简单 getX/Y返回的是相对于当前View左上角的x/y的坐标,而getRawX/getRawY返回的是相当于手机屏幕左上角的x/y坐标.

  2. TouchSlop是系统所能识别的被认为滑动的最小距离.这个是常量和设备有关,不同设备值可能不同.

  3. TouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();

  4. VelocityTracker 速度跟踪 追踪滑动的速度

  5. VelocityTracker vt=VelocityTracker .obtain();

  6. vt.addMovement(event);

  7. vt.computeCurrentVelocity(1000);

  8. int x = (int) vt.getXVelocity();

  9. int y = (int) vt.getYVelocity();

  10. 在使用完以后回收内存 vt.clear(); vt.recycle();

  11. GestureDetector 手势监测 用于辅助检测用户的单击滑动长按双击等行为

View的滑动

  1. 实现滑动方式有三种:(1)通过自身的ScrollTo/ScrollBy实现滑动,(2)通过动画给View添加平移效果(3)通过改变VIew的LayoutParams 是的重新布局来实现滑动.

  2. ScrollTo/ScrollBy实现滑动

  3. public void scrollTo(int x,int y){} x: the x postion to scroll to; y: the y postion to scroll to

  4. public void scrollBy(int x ,int y ){ scrollTo(mScrollX+x,mScrollY + y );} x:the amount of pixels to scroll by horizontally; y : the amount of pixels to scroll by Vertically;

  5. 使用动画 包括 View动画和属性动画(动画并不能真正改变View的位置)

  6. View动画

  1. 属性动画

  2. ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();

  3. fillAfter flase: 动画完成View回到原来的位置 true: 动画完成View到达指定的位置

  4. 改变布局参数

  5. MarginLayoutParams params = (MarginLayoutParams) mButton1.getLayoutParams();

  6. params.width + =100;

  7. params.leftMargin +=100;

  8. mButton1.requestLayout();

  9. //或者 mButton1.setLayoutParams(params);

  10. 各种滑动方式的对比

  11. ScrollTo/ScrollBy: 操作简单.适合对View内容的滑动

  12. 动画: 操作简单主要适用于没有交互的View和复杂的动画效果

  13. 改变布局: 操作稍微复杂,适用于有交互的View

View的事件分发机制

  1. boolean dispatchTouchEvent(MotionEvent event);//是否消费了事件
  2. boolean onIntercepteTouchEvent(MotionEvent event)//是否拦截事件
  3. boolean onTouchEvent(MotionEvent ev);//事件处理
  4. 三者关系的伪代码
  • public boolean dispatchTouchEvent(MotionEvent ev){

  • boolean consume = false;

  • if(onIntercepteTouchEvent(ev)){

  • consume = onTouchEvent(ev);

  • } else {

  • consume = child.dispatchTouchEvent(ev);

  • }

  • return consume;

  • }

  1. 事件优先级 OnTouchListener(onTouch)>onTouchEvent>onClickListener(onClick);
  2. ViewGroup默认不拦截任何事件,默认返回false;
  3. View没有onInterceptTouchEvent方法,一旦有事件传给他,它会立即调用onTouchEvent
  4. View的onTouchEvent默认都会消费事件(返回true),除非他是不可点击的(clickable和longclickable同时为false) View的longClickable默认都是false Button的clickable为true,TextView的clickable默认为false.
  5. onClick发生的前提是View是可点击的&& 收到down和up的事件.

事件分析的源码解析

  1. decor view 它一般是当前界面的底层容器 Activity.getWindow.getDecorView();可以获得
  2. 事件传递的过程Activity->Window->dicorView>根View(ViewGroup)
  3. 顶级View(ViewGroup)的事件分发:调用dispatchTouchEvent如果ViewGroup拦截即onInterceptEvent返回true.则事件由Viewgroup处理,如果他的onTouchListener被设置则onTouch被调用否则onTouchEvent被调用.如果Viewgroup不拦截则被传到子View 然后调用dispatchTouchEvent.....如此循环

事件冲突的解决

  1. 解决方案一般有两种:外部拦截法和内部拦截法.

View的工作流程 measure->layout->draw

  1. measure:

  2. View的measure过程 :由一个measure方法完成(final类型不可重写),它会调用View的onMeasure方法

  3. layout 主要就是一个setFrame(int left,int top,int right,int bottom);即设置位置和setChildFrame(View childView,int left,int top,int right,int bottom);

  4. draw 分四步

  5. 绘制背景 background.draw(canvas)

  6. 绘制自己 onDraw

  7. 绘制子布局 dispatchDraw

  8. 绘制装饰 onDrawScrollBars

相关文章

网友评论

      本文标题:Android控件 笔记

      本文链接:https://www.haomeiwen.com/subject/szqghqtx.html