美文网首页
ViewGroup.TouchTarget

ViewGroup.TouchTarget

作者: 御坂灬美琴 | 来源:发表于2020-01-03 15:37 被阅读0次

    作为一个菜鸟,从今天开始记录2020年的源码阅读,希望能慢慢进步

    TouchTarget是ViewGroup中的一个静态内部类,本次记录基于android-28的源码。

    从注释看,应该是记录触碰的视图的一系列事件

    源码如下

        private static final class TouchTarget {
            //链表最大长度
            private static final int MAX_RECYCLED = 32;
            //锁
            private static final Object sRecycleLock = new Object[0];
            private static TouchTarget sRecycleBin;
            private static int sRecycledCount;
    
            public static final int ALL_POINTER_IDS = -1; // all ones
    
            // The touched child view.
            public View child;
    
            // The combined bit mask of pointer ids for all pointers captured by the target.
            public int pointerIdBits;
    
            // The next target in the target list.
            public TouchTarget next;
    
            private TouchTarget() {
            }
    
           //获取链表头的TouchTarget
            public static TouchTarget obtain(@NonNull View child, int pointerIdBits) {
                if (child == null) {
                    throw new IllegalArgumentException("child must be non-null");
                }
    
                final TouchTarget target;
                synchronized (sRecycleLock) {
                 //没有链表头,则new一个TouchTarget返回
                    if (sRecycleBin == null) {
                        target = new TouchTarget();
                    } else {//否则 返回链表头
                        target = sRecycleBin;
                        //链表头指向下一个
                        sRecycleBin = target.next;
                       //长度-1
                         sRecycledCount--;
                        target.next = null;
                    }
                }
                target.child = child;
                target.pointerIdBits = pointerIdBits;
                return target;
            }
           //通过头插法将该节点作为表头,原来的表头作为后继
    
            public void recycle() {
                if (child == null) {
                    throw new IllegalStateException("already recycled once");
                }
    
                synchronized (sRecycleLock) {
                    if (sRecycledCount < MAX_RECYCLED) {
                        next = sRecycleBin;
                        sRecycleBin = this;
                        sRecycledCount += 1;
                    } else {
                        next = null;
                    }
                    child = null;
                }
            }
        }
    
    
    1578036856(1).jpg

    如图,obtain方法就是获取sRecycleBin指向的TouchTarget(next置为null),sRecycleBin指向next的对象(sRecycleBin不为null时)

    recycle则是将当前的TouchTarget作为sRecycleBin插到头部

    相关文章

      网友评论

          本文标题:ViewGroup.TouchTarget

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