美文网首页
自定义ViewGroup的探究

自定义ViewGroup的探究

作者: wintersweett | 来源:发表于2018-11-30 10:08 被阅读0次

    先说现象吧,如下是一个比较简单的没有任何功能的一个ViewGroup,写此demo的意图就是了解自定义ViewGroup情况下,内部代码走向

    public class HViewGroup extends ViewGroup {

    int xFirst;int yFirst;

    int mLastX;

    int mLastY;

    int RawX;

    int RawY;

    int x;

    int y;

    boolean intercepted=false;

    publicHViewGroup(Context context) {

    super(context);

    Log.i("zhm","1");

    }

    publicHViewGroup(Context context, AttributeSet attrs) {

    super(context, attrs);Log.i("zhm","2");

    }

    publicHViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {

    super(context, attrs, defStyleAttr);Log.i("zhm","3");

    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

    publicHViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

    super(context, attrs, defStyleAttr, defStyleRes);Log.i("zhm","4");

    }

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

    case MotionEvent.ACTION_DOWN:

    Log.i("zhm","onIntercept中down");

    xFirst= (int) ev.getX();

    yFirst= (int) ev.getY();

    Log.i("zhm","down中xFirst=="+xFirst+"==yFirst=="+yFirst);

    intercepted=false;

    break;

    case MotionEvent.ACTION_MOVE:

    Log.i("zhm","onIntercept中move");

    x= (int) ev.getX();

    y= (int) ev.getY();

    mLastX=x;

    mLastY=y;

    Log.i("zhm","move中mLastX=="+mLastX+"==mLastY=="+mLastY);

    if (parentMove(ev)) {

    intercepted = true;

    } else {

    intercepted=false;

    }

    break;

    case MotionEvent.ACTION_UP:

    Log.i("zhm","onIntercept中up");

    x= (int) ev.getX();

    y= (int) ev.getY();

    RawX=(int)ev.getRawX();

    RawY=(int)ev.getRawY();

    mLastX=x;

    mLastY=y;

    Log.i("zhm","up中mLastX=="+mLastX+"==mLastY=="+mLastY);

    intercepted=false;

    break;

    }

    //        mLastX=x;

    //        mLastY=y;

            return intercepted;

    }

    @Override

    public boolean dispatchTouchEvent(MotionEvent ev) {

    Log.i("zhm","dispatchTouchEvent");

    return super.dispatchTouchEvent(ev);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {

    case MotionEvent.ACTION_DOWN:

    Log.i("zhm","onTouch中down");

    Log.i("zhm","Touchdown中xFirst=="+event.getX()+"==yFirst=="+event.getY());

    break;

    case MotionEvent.ACTION_UP:

    Log.i("zhm","onTouch中up");

    break;

    case MotionEvent.ACTION_MOVE:

    Log.i("zhm","onTouch中move");

    x= (int) event.getX();

    y= (int) event.getY();

    mLastX=x;

    mLastY=y;

    Log.i("zhm","touch move中mLastX=="+mLastX+"==mLastY=="+mLastY);

    if (parentMove(event)) {

    intercepted = true;

    } else {

    intercepted=false;

    }

    break;

    }

    //        if (onInterceptTouchEvent(event)) {

    //            Log.i("zhm","onTouchevent true====");

    //        } else {

    //            Log.i("zhm","onTouchevent false====");

    //        }

            return true;

    }

    //父容器是否move

        private boolean parentMove(MotionEvent event) {

    int X= (int) Math.abs(event.getX()-xFirst);

    int Y= (int) Math.abs(event.getY()-yFirst);

    Log.i("zhm","parentMove中xFirst=="+xFirst+"==yFirst=="+yFirst);

    Log.i("zhm","parentMove中X=="+X+"==Y=="+Y);

    if (X > Y) {

    return true;

    } else {

    return false;

    }

    }

    }

    接下来看Logcat:

    11-30 09:57:53.112 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.112 21881-21881/com.example.user.myapplication I/zhm: onIntercept中down

    11-30 09:57:53.112 21881-21881/com.example.user.myapplication I/zhm: down中xFirst==144==yFirst==539

    11-30 09:57:53.112 21881-21881/com.example.user.myapplication I/zhm: onTouch中down

    11-30 09:57:53.112 21881-21881/com.example.user.myapplication I/zhm: Touchdown中xFirst==144.82146==yFirst==539.5908

    11-30 09:57:53.418 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.418 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.418 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==155==mLastY==536

    11-30 09:57:53.418 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.418 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==11==Y==2

    11-30 09:57:53.435 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.435 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.435 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==160==mLastY==535

    11-30 09:57:53.435 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.435 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==16==Y==3

    11-30 09:57:53.452 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.452 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.452 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==164==mLastY==535

    11-30 09:57:53.452 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.452 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==20==Y==3

    11-30 09:57:53.468 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.469 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.469 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==167==mLastY==535

    11-30 09:57:53.469 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.469 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==23==Y==3

    11-30 09:57:53.485 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.485 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.485 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==170==mLastY==534

    11-30 09:57:53.485 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.486 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==26==Y==4

    11-30 09:57:53.502 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.502 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.502 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==172==mLastY==534

    11-30 09:57:53.502 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.502 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==28==Y==4

    11-30 09:57:53.519 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.519 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.519 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==174==mLastY==533

    11-30 09:57:53.519 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.519 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==30==Y==5

    11-30 09:57:53.536 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.536 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.536 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==177==mLastY==533

    11-30 09:57:53.536 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.536 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==33==Y==5

    11-30 09:57:53.552 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.553 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.553 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==179==mLastY==533

    11-30 09:57:53.553 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.553 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==35==Y==5

    11-30 09:57:53.569 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.569 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.569 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==181==mLastY==533

    11-30 09:57:53.570 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.570 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==37==Y==5

    11-30 09:57:53.586 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.586 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.586 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==183==mLastY==532

    11-30 09:57:53.586 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.586 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==39==Y==6

    11-30 09:57:53.603 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.603 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.603 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==184==mLastY==532

    11-30 09:57:53.603 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.603 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==40==Y==6

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: onTouch中move

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: touch move中mLastX==184==mLastY==532

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: parentMove中xFirst==144==yFirst==539

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: parentMove中X==40==Y==6

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: dispatchTouchEvent

    11-30 09:57:53.700 21881-21881/com.example.user.myapplication I/zhm: onTouch中up

    总结规律:代码运行起来,即走了2,所以必须publicHViewGroup(Context context, AttributeSet attrs) {

    super(context, attrs);Log.i("zhm","2");

    }

    当手指触摸或者滑动都会开始触发dispatchTouchEvent方法,只走了一遍onInterceptTouchEvent方法中ACTION_DOWN的情况,--->onTouchEvent中ACTION_DOWN情况----->dispatchTouchEvent方法--->onToucheEvent中ACTION_MOVE------>dispatchTouchEvent方法------>onTouchEvent中ACTION_MOVE......----->dispatchTouchEvent方法------>onTouchEvent中 ACTION_UP

    断点跟踪

    此处进入ViewGroup,会后续走Activity、View、ViewRootImpl、InputEventReceiver、MotionEvent类

    相关文章

      网友评论

          本文标题:自定义ViewGroup的探究

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