美文网首页
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