<div id="container">
        <div id="header">
    <div class="header">
        <div id="blog_title">
            <h2>
                <a href="http://blog.csdn.net/guolin_blog">郭霖的专栏</a></h2>
            <h3>每当你在感叹,如果有这样一个东西就好了的时候,请注意,其实这是你的机会</h3>
            <div class="clear">
            </div>
        </div>
        <div class="clear">
        </div>
        
     
    </div>
</div>
<div id="navigator">
    <div class="navigator_bg">
    </div>
    <div class="navigator">
        <ul>           
                <li id="btnContents"><a href="http://blog.csdn.net/guolin_blog?viewmode=contents"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_mulu'])">
                    <img src="http://static.blog.csdn.net/images/ico_list.gif">目录视图</span></a></li>
                <li id="btnView"><a href="http://blog.csdn.net/guolin_blog?viewmode=list"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_zhaiyao'])">
                    <img src="http://static.blog.csdn.net/images/ico_summary.gif">摘要视图</span></a></li>
                <li id="btnRss"><a href="http://blog.csdn.net/guolin_blog/rss/list"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_RSS'])">
                    <img src="http://static.blog.csdn.net/images/ico_rss.gif">订阅</span></a></li>

</ul>
    </div>
</div>
<script type="text/javascript">
    var username = "sinyu890807";
    var _blogger = username;
    var blog_address = "http://blog.csdn.net/guolin_blog";
    var static_host = "http://static.blog.csdn.net";
    var currentUserName = "";  
</script>

<div id="body">
            <div id="main">
                <div class="main">
                        <div class="ad_class">
<div class="notice tracking-ad" data-mod="popu_3">

<a href="http://blog.csdn.net/blogdevteam/article/details/75116901" target="_blank">
<font color="red"><strong>从创业到再就业,浅述对程序员职业生涯的看法</strong></font></a>

&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://blog.csdn.net/blogdevteam/article/details/74550215" target="_blank">
<font color="blue"><strong>征文 | 你会为 AI 转型么?</strong></font></a>
&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://blog.csdn.net/epubit17/article/details/74279903" target="_blank">
<font color="red"><strong>赠书:7月大咖新书机器学习/Android/python</strong></font></a>

</div>                        </div>

<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>

<script type="text/ecmascript">
      window.quickReplyflag = true;
      var isBole = false;
      var fasrc="http://my.csdn.net/my/favorite/miniadd?t=Android%e4%ba%8b%e4%bb%b6%e5%88%86%e5%8f%91%e6%9c%ba%e5%88%b6%e5%ae%8c%e5%85%a8%e8%a7%a3%e6%9e%90%ef%bc%8c%e5%b8%a6%e4%bd%a0%e4%bb%8e%e6%ba%90%e7%a0%81%e7%9a%84%e8%a7%92%e5%ba%a6%e5%bd%bb%e5%ba%95%e7%90%86%e8%a7%a3(%e4%b8%8a)&u=http://blog.csdn.net/guolin_blog/article/details/9097463/"
    </script>
<div id="article_details" class="details">
    <div class="article_title">   
         <span class="ico ico_type_Original"></span>

<h1>
        <span class="link_title"><a href="/guolin_blog/article/details/9097463">
        Android事件分发机制完全解析,带你从源码的角度彻底理解(上)        
           
        </a>
        </span>

</h1>
</div>

<div class="article_manage clearfix">
        <div class="article_l">
            <span class="link_categories">
            标签:
              <a href="http://www.csdn.net/tag/Android" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Android</a><a href="http://www.csdn.net/tag/%e4%ba%8b%e4%bb%b6%e5%88%86%e5%8f%91" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">事件分发</a><a href="http://www.csdn.net/tag/onTouch" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">onTouch</a><a href="http://www.csdn.net/tag/dispatchTouchEvent" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">dispatchTouchEvent</a><a href="http://www.csdn.net/tag/onTouchEvent" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">onTouchEvent</a>
            </span>
        </div>
        <div class="article_r">
            <span class="link_postdate">2013-06-20 08:30</span>
            <span class="link_view" title="阅读次数">283654人阅读</span>
            <span class="link_comments" title="评论次数"> <a href="#comments" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(305)</span>
            <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" οnclick="javascript:collectArticle('Android%e4%ba%8b%e4%bb%b6%e5%88%86%e5%8f%91%e6%9c%ba%e5%88%b6%e5%ae%8c%e5%85%a8%e8%a7%a3%e6%9e%90%ef%bc%8c%e5%b8%a6%e4%bd%a0%e4%bb%8e%e6%ba%90%e7%a0%81%e7%9a%84%e8%a7%92%e5%ba%a6%e5%bd%bb%e5%ba%95%e7%90%86%e8%a7%a3(%e4%b8%8a)','9097463');return false;" title="收藏" target="_blank">收藏</a></span>
             <span class="link_report"> <a href="#report" οnclick="javascript:report(9097463,2);return false;" title="举报">举报</a></span>

</div>
    </div>    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                width:30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
            
        });
    </script>
      <div class="category clearfix">
        <div class="category_l">
           <img src="http://static.blog.csdn.net/images/category_icon.jpg">
            <span>分类:</span>
        </div>
        <div class="category_r">
                    <label οnclick="GetCategoryArticles('1399638','sinyu890807','top','9097463');">
                        <span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Android疑难解析<em>(39)</em></span>
                      <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                      <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                        <div class="subItem">
                            <div class="subItem_t"><a href="http://blog.csdn.net/sinyu890807/article/category/1399638" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                            <ul class="subItem_l" id="top_1399638">                            
                            </ul>
                        </div>
                    </label>                    
        </div>
    </div>
        <div class="bog_copyright">         
            <p class="copyright_p">版权声明:本文出自郭霖的博客,转载必须注明出处。</p>
        </div>

<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<p>转载请注明出处:<a target="_blank" href="http://blog.csdn.net/sinyu890807/article/details/8986285"></a><a target="_blank" href="http://blog.csdn.net/sinyu890807/article/details/9097463"></a><a target="_blank" href="http://blog.csdn.net/guolin_blog/article/details/9097463">http://blog.csdn.net/guolin_blog/article/details/9097463</a><br></p><p><br></p><p>其实我一直准备写一篇关于<a href="http://lib.csdn.net/base/android" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">Android</a>事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了<a href="http://lib.csdn.net/base/android" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">android</a>事件分发的知识。也有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?等等……对于这些问题,我并没有给出非常详细的回答,因为我知道如果想要彻底搞明白这些问题,掌握Android事件分发机制是必不可少的,而Android事件分发机制绝对不是三言两语就能说得清的。</p><p><br></p><p>在我经过较长时间的筹备之后,终于决定开始写这样一篇文章了。目前虽然网上相关的文章也不少,但我觉得没有哪篇写得特别详细的(也许我还没有找到),多数文章只是讲了讲理论,然后配合demo运行了一下结果。而我准备带着大家从源码的角度进行分析,相信大家可以更加深刻地理解Android事件分发机制。<br></p><p><br></p><p>阅读源码讲究由浅入深,循序渐进,因此我们也从简单的开始,本篇先带大家探究View的事件分发,下篇再去探究难度更高的ViewGroup的事件分发。<br></p><p><br></p><p>那我们现在就开始吧!比如说你当前有一个非常简单的项目,只有一个Activity,并且Activity中只有一个按钮。你可能已经知道,如果想要给这个按钮注册一个点击事件,只需要调用:</p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 1020px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>button.setOnClickListener(</span><span class="keyword">new</span><span>&nbsp;OnClickListener()&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;onClick(View&nbsp;v)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(<span class="string">"TAG"</span><span>,&nbsp;</span><span class="string">"onClick&nbsp;execute"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>});&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("TAG", "onClick execute");
    }
});</pre>这样在onClick方法里面写实现,就可以在按钮被点击的时候执行。你可能也已经知道,如果想给这个按钮再添加一个touch事件,只需要调用:<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 1232px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>button.setOnTouchListener(</span><span class="keyword">new</span><span>&nbsp;OnTouchListener()&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;onTouch(View&nbsp;v,&nbsp;MotionEvent&nbsp;event)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(<span class="string">"TAG"</span><span>,&nbsp;</span><span class="string">"onTouch&nbsp;execute,&nbsp;action&nbsp;"</span><span>&nbsp;+&nbsp;event.getAction());&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>});&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("TAG", "onTouch execute, action " + event.getAction());
        return false;
    }
});</pre><p>onTouch方法里能做的事情比onClick要多一些,比如判断手指按下、抬起、移动等事件。那么如果我两个事件都注册了,哪一个会先执行呢?我们来试一下就知道了,运行程序点击按钮,打印结果如下:</p><p><br></p><p style="text-align: center;"><img src="https://img-blog.csdn.net/20130614230234671" alt=""><br></p><p style="text-align: center;"><br></p><p>可以看到,onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下)。因此事件传递的顺序是先经过onTouch,再传递到onClick。</p><p><br></p><p>细心的朋友应该可以注意到,onTouch方法是有返回值的,这里我们返回的是false,如果我们尝试把onTouch方法里的返回值改成true,再运行一次,结果如下:</p><p><br></p><p style="text-align: center;"><img src="https://img-blog.csdn.net/20130614231001468" alt=""><br></p><p style="text-align: center;"><br></p><p>我们发现,onClick方法不再执行了!为什么会这样呢?你可以先理解成onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。</p><p><br></p><p>如果到现在为止,以上的所有知识点你都是清楚的,那么说明你对Android事件传递的基本用法应该是掌握了。不过别满足于现状,让我们从源码的角度分析一下,出现上述现象的原理是什么。</p><p><br></p><p>首先你需要知道一点,只要你触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法。那当我们去点击按钮的时候,就会去调用Button类里的dispatchTouchEvent方法,可是你会发现Button类里并没有这个方法,那么就到它的父类TextView里去找一找,你会发现TextView里也没有这个方法,那没办法了,只好继续在TextView的父类View里找一找,这个时候你终于在View里找到了这个方法,示意图如下:</p><p><br></p><p style="text-align: center;"><img src="https://img-blog.csdn.net/20130616154134500" alt=""><br></p><p style="text-align: center;"><br></p><p>然后我们来看一下View中dispatchTouchEvent方法的源码:</p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 2751px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;dispatchTouchEvent(MotionEvent&nbsp;event)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mOnTouchListener&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;(mViewFlags&nbsp;&amp;&nbsp;ENABLED_MASK)&nbsp;==&nbsp;ENABLED&nbsp;&amp;&amp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOnTouchListener.onTouch(<span class="keyword">this</span><span>,&nbsp;event))&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;onTouchEvent(event);&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">public boolean dispatchTouchEvent(MotionEvent event) {
    if (mOnTouchListener != null &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED &amp;&amp;
            mOnTouchListener.onTouch(this, event)) {
        return true;
    }
    return onTouchEvent(event);
}</pre><p>这个方法非常的简洁,只有短短几行代码!我们可以看到,在这个方法内,首先是进行了一个判断,如果mOnTouchListener != null,(mViewFlags &amp; ENABLED_MASK) == ENABLED和mOnTouchListener.onTouch(this, event)这三个条件都为真,就返回true,否则就去执行onTouchEvent(event)方法并返回。</p><p><br></p><p>先看一下第一个条件,mOnTouchListener这个变量是在哪里赋值的呢?我们寻找之后在View里发现了如下方法:</p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 3121px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setOnTouchListener(OnTouchListener&nbsp;l)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;mOnTouchListener&nbsp;=&nbsp;l;&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">public void setOnTouchListener(OnTouchListener l) {
    mOnTouchListener = l;
}</pre><p>Bingo!找到了,mOnTouchListener正是在setOnTouchListener方法里赋值的,也就是说只要我们给控件注册了touch事件,mOnTouchListener就一定被赋值了。</p><p><br></p><p>第二个条件(mViewFlags &amp; ENABLED_MASK) == ENABLED是判断当前点击的控件是否是enable的,按钮默认都是enable的,因此这个条件恒定为true。</p><p><br></p><p>第三个条件就比较关键了,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch方法。也就是说如果我们在onTouch方法里返回true,就会让这三个条件全部成立,从而整个方法直接返回true。如果我们在onTouch方法里返回false,就会再去执行onTouchEvent(event)方法。</p><p><br></p><p>现在我们可以结合前面的例子来分析一下了,首先在dispatchTouchEvent中最先执行的就是onTouch方法,因此onTouch肯定是要优先于onClick执行的,也是印证了刚刚的打印结果。而如果在onTouch方法里返回了true,就会让dispatchTouchEvent方法直接返回true,不会再继续往下执行。而打印结果也证实了如果onTouch返回true,onClick就不会再执行了。</p><p><br></p><p>根据以上源码的分析,从原理上解释了我们前面例子的运行结果。而上面的分析还透漏出了一个重要的信息,那就是onClick的调用肯定是在onTouchEvent(event)方法中的!那我们马上来看下onTouchEvent的源码,如下所示:</p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 3804px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;onTouchEvent(MotionEvent&nbsp;event)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;viewFlags&nbsp;=&nbsp;mViewFlags;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;((viewFlags&nbsp;&amp;&nbsp;ENABLED_MASK)&nbsp;==&nbsp;DISABLED)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;A&nbsp;disabled&nbsp;view&nbsp;that&nbsp;is&nbsp;clickable&nbsp;still&nbsp;consumes&nbsp;the&nbsp;touch</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;events,&nbsp;it&nbsp;just&nbsp;doesn't&nbsp;respond&nbsp;to&nbsp;them.</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(((viewFlags&nbsp;&amp;&nbsp;CLICKABLE)&nbsp;==&nbsp;CLICKABLE&nbsp;||&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(viewFlags&nbsp;&amp;&nbsp;LONG_CLICKABLE)&nbsp;==&nbsp;LONG_CLICKABLE));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mTouchDelegate&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mTouchDelegate.onTouchEvent(event))&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(((viewFlags&nbsp;&amp;&nbsp;CLICKABLE)&nbsp;==&nbsp;CLICKABLE&nbsp;||&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(viewFlags&nbsp;&amp;&nbsp;LONG_CLICKABLE)&nbsp;==&nbsp;LONG_CLICKABLE))&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">switch</span><span>&nbsp;(event.getAction())&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;MotionEvent.ACTION_UP:&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">boolean</span><span>&nbsp;prepressed&nbsp;=&nbsp;(mPrivateFlags&nbsp;&amp;&nbsp;PREPRESSED)&nbsp;!=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;((mPrivateFlags&nbsp;&amp;&nbsp;PRESSED)&nbsp;!=&nbsp;</span><span class="number">0</span><span>&nbsp;||&nbsp;prepressed)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;take&nbsp;focus&nbsp;if&nbsp;we&nbsp;don't&nbsp;have&nbsp;it&nbsp;already&nbsp;and&nbsp;we&nbsp;should&nbsp;in</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;touch&nbsp;mode.</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">boolean</span><span>&nbsp;focusTaken&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(isFocusable()&nbsp;&amp;&amp;&nbsp;isFocusableInTouchMode()&nbsp;&amp;&amp;&nbsp;!isFocused())&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focusTaken&nbsp;=&nbsp;requestFocus();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!mHasPerformedLongPress)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;This&nbsp;is&nbsp;a&nbsp;tap,&nbsp;so&nbsp;remove&nbsp;the&nbsp;longpress&nbsp;check</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeLongPressCallback();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Only&nbsp;perform&nbsp;take&nbsp;click&nbsp;actions&nbsp;if&nbsp;we&nbsp;were&nbsp;in&nbsp;the&nbsp;pressed&nbsp;state</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!focusTaken)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Use&nbsp;a&nbsp;Runnable&nbsp;and&nbsp;post&nbsp;this&nbsp;rather&nbsp;than&nbsp;calling</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;performClick&nbsp;directly.&nbsp;This&nbsp;lets&nbsp;other&nbsp;visual&nbsp;state</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;of&nbsp;the&nbsp;view&nbsp;update&nbsp;before&nbsp;click&nbsp;actions&nbsp;start.</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mPerformClick&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPerformClick&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;PerformClick();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!post(mPerformClick))&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;performClick();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mUnsetPressedState&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUnsetPressedState&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;UnsetPressedState();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(prepressed)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPrivateFlags&nbsp;|=&nbsp;PRESSED;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshDrawableState();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postDelayed(mUnsetPressedState,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewConfiguration.getPressedStateDuration());&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!post(mUnsetPressedState))&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;If&nbsp;the&nbsp;post&nbsp;failed,&nbsp;unpress&nbsp;right&nbsp;now</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUnsetPressedState.run();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeTapCallback();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;MotionEvent.ACTION_DOWN:&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mPendingCheckForTap&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPendingCheckForTap&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;CheckForTap();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPrivateFlags&nbsp;|=&nbsp;PREPRESSED;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mHasPerformedLongPress&nbsp;=&nbsp;<span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postDelayed(mPendingCheckForTap,&nbsp;ViewConfiguration.getTapTimeout());&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;MotionEvent.ACTION_CANCEL:&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPrivateFlags&nbsp;&amp;=&nbsp;~PRESSED;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshDrawableState();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeTapCallback();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;MotionEvent.ACTION_MOVE:&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;x&nbsp;=&nbsp;(</span><span class="keyword">int</span><span>)&nbsp;event.getX();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;y&nbsp;=&nbsp;(</span><span class="keyword">int</span><span>)&nbsp;event.getY();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Be&nbsp;lenient&nbsp;about&nbsp;moving&nbsp;outside&nbsp;of&nbsp;buttons</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;slop&nbsp;=&nbsp;mTouchSlop;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;((x&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>&nbsp;-&nbsp;slop)&nbsp;||&nbsp;(x&nbsp;&gt;=&nbsp;getWidth()&nbsp;+&nbsp;slop)&nbsp;||&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(y&nbsp;&lt;&nbsp;<span class="number">0</span><span>&nbsp;-&nbsp;slop)&nbsp;||&nbsp;(y&nbsp;&gt;=&nbsp;getHeight()&nbsp;+&nbsp;slop))&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Outside&nbsp;button</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeTapCallback();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;((mPrivateFlags&nbsp;&amp;&nbsp;PRESSED)&nbsp;!=&nbsp;</span><span class="number">0</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Remove&nbsp;any&nbsp;future&nbsp;long&nbsp;press/tap&nbsp;checks</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeLongPressCallback();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Need&nbsp;to&nbsp;switch&nbsp;from&nbsp;pressed&nbsp;to&nbsp;not&nbsp;pressed</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPrivateFlags&nbsp;&amp;=&nbsp;~PRESSED;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshDrawableState();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">public boolean onTouchEvent(MotionEvent event) {
    final int viewFlags = mViewFlags;
    if ((viewFlags &amp; ENABLED_MASK) == DISABLED) {
        // A disabled view that is clickable still consumes the touch
        // events, it just doesn't respond to them.
        return (((viewFlags &amp; CLICKABLE) == CLICKABLE ||
                (viewFlags &amp; LONG_CLICKABLE) == LONG_CLICKABLE));
    }
    if (mTouchDelegate != null) {
        if (mTouchDelegate.onTouchEvent(event)) {
            return true;
        }
    }
    if (((viewFlags &amp; CLICKABLE) == CLICKABLE ||
            (viewFlags &amp; LONG_CLICKABLE) == LONG_CLICKABLE)) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                boolean prepressed = (mPrivateFlags &amp; PREPRESSED) != 0;
                if ((mPrivateFlags &amp; PRESSED) != 0 || prepressed) {
                    // take focus if we don't have it already and we should in
                    // touch mode.
                    boolean focusTaken = false;
                    if (isFocusable() &amp;&amp; isFocusableInTouchMode() &amp;&amp; !isFocused()) {
                        focusTaken = requestFocus();
                    }
                    if (!mHasPerformedLongPress) {
                        // This is a tap, so remove the longpress check
                        removeLongPressCallback();
                        // Only perform take click actions if we were in the pressed state
                        if (!focusTaken) {
                            // Use a Runnable and post this rather than calling
                            // performClick directly. This lets other visual state
                            // of the view update before click actions start.
                            if (mPerformClick == null) {
                                mPerformClick = new PerformClick();
                            }
                            if (!post(mPerformClick)) {
                                performClick();
                            }
                        }
                    }
                    if (mUnsetPressedState == null) {
                        mUnsetPressedState = new UnsetPressedState();
                    }
                    if (prepressed) {
                        mPrivateFlags |= PRESSED;
                        refreshDrawableState();
                        postDelayed(mUnsetPressedState,
                                ViewConfiguration.getPressedStateDuration());
                    } else if (!post(mUnsetPressedState)) {
                        // If the post failed, unpress right now
                        mUnsetPressedState.run();
                    }
                    removeTapCallback();
                }
                break;
            case MotionEvent.ACTION_DOWN:
                if (mPendingCheckForTap == null) {
                    mPendingCheckForTap = new CheckForTap();
                }
                mPrivateFlags |= PREPRESSED;
                mHasPerformedLongPress = false;
                postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
                break;
            case MotionEvent.ACTION_CANCEL:
                mPrivateFlags &amp;= ~PRESSED;
                refreshDrawableState();
                removeTapCallback();
                break;
            case MotionEvent.ACTION_MOVE:
                final int x = (int) event.getX();
                final int y = (int) event.getY();
                // Be lenient about moving outside of buttons
                int slop = mTouchSlop;
                if ((x &lt; 0 - slop) || (x &gt;= getWidth() + slop) ||
                        (y &lt; 0 - slop) || (y &gt;= getHeight() + slop)) {
                    // Outside button
                    removeTapCallback();
                    if ((mPrivateFlags &amp; PRESSED) != 0) {
                        // Remove any future long press/tap checks
                        removeLongPressCallback();
                        // Need to switch from pressed to not pressed
                        mPrivateFlags &amp;= ~PRESSED;
                        refreshDrawableState();
                    }
                }
                break;
        }
        return true;
    }
    return false;
}
</pre><p>相较于刚才的dispatchTouchEvent方法,onTouchEvent方法复杂了很多,不过没关系,我们只挑重点看就可以了。</p><p><br></p><p>首先在第14行我们可以看出,如果该控件是可以点击的就会进入到第16行的switch判断中去,而如果当前的事件是抬起手指,则会进入到MotionEvent.ACTION_UP这个case当中。在经过种种判断之后,会执行到第38行<span style="font-family: Consolas, &quot;Courier New&quot;, Courier, mono, serif;"><span style="line-height:18px">的performClick()方法,那我们进入到这个方法里瞧一瞧:</span></span></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 5669px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;performClick()&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mOnClickListener&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playSoundEffect(SoundEffectConstants.CLICK);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOnClickListener.onClick(<span class="keyword">this</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">public boolean performClick() {
    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
    if (mOnClickListener != null) {
        playSoundEffect(SoundEffectConstants.CLICK);
        mOnClickListener.onClick(this);
        return true;
    }
    return false;
}</pre>可以看到,只要mOnClickListener不是null,就会去调用它的onClick方法,那mOnClickListener又是在哪里赋值的呢?经过寻找后找到如下方法:<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 5935px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setOnClickListener(OnClickListener&nbsp;l)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!isClickable())&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setClickable(<span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mOnClickListener&nbsp;=&nbsp;l;&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">public void setOnClickListener(OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    mOnClickListener = l;
}</pre><p>一切都是那么清楚了!当我们通过调用setOnClickListener方法来给控件注册一个点击事件时,就会给mOnClickListener赋值。然后每当控件被点击时,都会在performClick()方法里回调被点击控件的onClick方法。</p><p><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></p><p>这样View的整个事件分发的流程就让我们搞清楚了!不过别高兴的太早,现在还没结束,还有一个很重要的知识点需要说明,就是touch事件的层级传递。我们都知道如果给一个控件注册了touch事件,每次点击它的时候都会触发一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。</p><p><span style="font-family: Consolas, &quot;Courier New&quot;, Courier, mono, serif; line-height: 18px;"><br></span></p><p>说到这里,很多的朋友肯定要有巨大的疑问了。这不是在自相矛盾吗?前面的例子中,明明在onTouch事件里面返回了false,ACTION_DOWN和ACTION_UP不是都得到执行了吗?其实你只是被假象所迷惑了,让我们仔细分析一下,在前面的例子当中,我们到底返回的是什么。</p><p>参考着我们前面分析的源码,首先在onTouch事件里返回了false,就一定会进入到onTouchEvent方法中,然后我们来看一下onTouchEvent方法的细节。由于我们点击了按钮,就会进入到第14行这个if判断的内部,然后你会发现,不管当前的action是什么,最终都一定会走到第89行,返回一个true。</p><p><br></p><p>是不是有一种被欺骗的感觉?明明在onTouch事件里返回了false,系统还是在onTouchEvent方法中帮你返回了true。就因为这个原因,才使得前面的例子中ACTION_UP可以得到执行。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p>那我们可以换一个控件,将按钮替换成ImageView,然后给它也注册一个touch事件,并返回false。如下所示:</p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 746px; top: 6691px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>imageView.setOnTouchListener(</span><span class="keyword">new</span><span>&nbsp;OnTouchListener()&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;onTouch(View&nbsp;v,&nbsp;MotionEvent&nbsp;event)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(<span class="string">"TAG"</span><span>,&nbsp;</span><span class="string">"onTouch&nbsp;execute,&nbsp;action&nbsp;"</span><span>&nbsp;+&nbsp;event.getAction());&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>});&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="java" style="display: none;">imageView.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("TAG", "onTouch execute, action " + event.getAction());
        return false;
    }
});</pre><p>运行一下程序,点击ImageView,你会发现结果如下:</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p style="text-align: center;"><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><img src="https://img-blog.csdn.net/20130617193504328" alt=""><br></span></span></span></p><p style="text-align: center;"><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p>在ACTION_DOWN执行完后,后面的一系列action都不会得到执行了。这又是为什么呢?因为ImageView和按钮不同,它是默认不可点击的,因此在onTouchEvent的第14行判断时无法进入到if的内部,直接跳到第91行返回了false,也就导致后面其它的action都无法执行了。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p>好了,关于View的事件分发,我想讲的东西全都在这里了。现在我们再来回顾一下开篇时提到的那三个问题,相信每个人都会有更深一层的理解。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p><strong>1.&nbsp;onTouch和onTouchEvent有什么区别,又该如何使用?</strong></p><p>从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></span></span></p><p>另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></span></span></span></p><p><strong>2.&nbsp;为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?</strong></p><p>如果你阅读了<a target="_blank" href="http://blog.csdn.net/sinyu890807/article/details/8744400">Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来</a>&nbsp;这篇文章。当时我在图片轮播器里使用Button,主要就是因为Button是可点击的,而ImageView是不可点击的。如果想要使用ImageView,可以有两种改法。第一,在ImageView的onTouch方法里返回true,这样可以保证ACTION_DOWN之后的其它action都能得到执行,才能实现图片滚动的效果。第二,在布局文件里面给ImageView增加一个android:clickable="true"的属性,这样ImageView变成可点击的之后,即使在onTouch里返回了false,ACTION_DOWN之后的其它action也是可以得到执行的。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px"><br></span></span></span></p><p>今天的讲解就到这里了,相信大家现在对Android事件分发机制又有了进一步的认识,在后面的文章中我会再带大家一起探究Android中ViewGroup的事件分发机制,感兴趣的朋友请继续阅读&nbsp;<a target="_blank" href="http://blog.csdn.net/sinyu890807/article/details/9153747">Android事件分发机制完全解析,带你从源码的角度彻底理解(下)</a>&nbsp;。</p><p><span style="font-family:Consolas,Courier New,Courier,mono,serif"><span style="line-height:18px"><br></span></span></p><style>blockquote{
    border-left: 10px solid rgba(128,128,128,0.075);
    background-color: rgba(128,128,128,0.05);
    border-radius: 0 5px 5px 0;
    padding: 15px 20px;
}</style><blockquote><p>关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。</p>    <p><a href="http://lib.csdn.net/base/wechat" class="replace_word" title="微信开发知识库" target="_blank" style="color:#df3434; font-weight:bold;">微信</a>扫一扫下方二维码即可关注:</p>    <p><img src="https://img-blog.csdn.net/20160507110203928" width="200px" alt=""> &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;<img src="https://img-blog.csdn.net/20161011100137978" width="200px" alt=""></p></blockquote>   
</div>

<!-- Baidu Button BEGIN -->

<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1500282049780">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->

<!--172.16.140.15-->

<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=416746"></script>

<script type="text/javascript">
    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->

<div id="digg" articleid="9097463">
            <dl id="btnDigg" class="digg digg_disable" οnclick="btndigga();">
               
                 <dt>顶</dt>
                <dd>377</dd>
            </dl>
           
              
            <dl id="btnBury" class="digg digg_disable" οnclick="btnburya();">
              
                  <dt>踩</dt>
                <dd>28</dd>               
            </dl>
            
        </div>
     <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
    <script type="text/javascript">
                function btndigga() {
                    $(".tracking-ad[data-mod='popu_222'] a").click();
                }
                function btnburya() {
                    $(".tracking-ad[data-mod='popu_223'] a").click();
                }
            </script>

<ul class="article_next_prev">
                <li class="prev_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='http://blog.csdn.net/sinyu890807/article/details/9050671';">上一篇</span><a href="http://blog.csdn.net/sinyu890807/article/details/9050671" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">Android系统联系人全特效实现(下),字母表快速滚动</a></li>
                <li class="next_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='http://blog.csdn.net/sinyu890807/article/details/9153753';">下一篇</span><a href="http://blog.csdn.net/sinyu890807/article/details/9153753" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">Java设计模式透析之 —— 组合(Composite)</a></li>
    </ul>

<div style="clear:both; height:10px;"></div>

<div class="similar_article">
                    <h4></h4>
                    <div class="similar_c" style="margin:20px 0px 0px 0px">
                        <div class="similar_c_t">
                          &nbsp;&nbsp;相关文章推荐
                        </div>
                   
                        <div class="similar_wrap tracking-ad" data-mod="popu_36">                       
                            <ul class="similar_list fl">    
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/lmj623565791/article/details/39102591" title="Android ViewGroup事件分发机制" strategy="BlogCommendFromBaidu" target="_blank">Android ViewGroup事件分发机制</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/sinyu890807/article/details/9153747" title="Android事件分发机制完全解析,带你从源码的角度彻底理解(下)" strategy="BlogCommendFromBaidu" target="_blank">Android事件分发机制完全解析,带你从源码的角度彻底理解(下)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/lmj623565791/article/details/38960443" title="Android View 事件分发机制 源码解析 (上)" strategy="BlogCommendFromBaidu" target="_blank">Android View 事件分发机制 源码解析 (上)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/yanbober/article/details/45887547" title="Android触摸屏事件派发机制详解与源码分析一(View篇)" strategy="BlogCommendFromBaidu" target="_blank">Android触摸屏事件派发机制详解与源码分析一(View篇)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/CHZiroy/article/details/44401615" title="Android事件分发机制" strategy="BlogCommendFromBaidu" target="_blank">Android事件分发机制</a>
                                   </li>
                            </ul>
                              <ul class="similar_list fr">      
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/Wei_Smile/article/details/51052114" title="View的事件分发机制解析" strategy="BlogCommendFromBaidu" target="_blank">View的事件分发机制解析</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/L664675249/article/details/50738102" title="Android中View的事件分发机制——Android开发艺术探索笔记" strategy="BlogCommendFromBaidu" target="_blank">Android中View的事件分发机制——Android开发艺术探索笔记</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/carson_ho/article/details/54136311" title="Android事件分发机制详解:史上最全面、最易懂" strategy="BlogCommendFromBaidu" target="_blank">Android事件分发机制详解:史上最全面、最易懂</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/mynameishuangshuai/article/details/52900723" title="Android6.0源码解读之View点击事件分发机制" strategy="BlogCommendFromBaidu" target="_blank">Android6.0源码解读之View点击事件分发机制</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/CHENYUFENG1991/article/details/46895349" title="Eclipse和Android Studio的偏好设置Preferences的导出与导入" strategy="BlogCommendFromBaidu" target="_blank">Eclipse和Android Studio的偏好设置Preferences的导出与导入</a>
                                   </li>
                            </ul>
                        </div>
                    </div>
                </div>   
      
</div>

<div id="suggest">

</div>
         <script language="javascript" type="text/javascript">     
             $(function(){
                 $.get("/sinyu890807/svc/GetSuggestContent/9097463",function(data){
                     $("#suggest").html(data);
                 });     
             });             
         </script>

<dl class="blog-ass-articl tracking-ad" id="res-relatived" data-mod="popu_84">
             <dt><span>猜你在找</span></dt>

<dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/46" title="机器学习之概率与统计推断" strategy="undefined" target="_blank">机器学习之概率与统计推断</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/49" title="机器学习之数学基础" strategy="undefined" target="_blank">机器学习之数学基础</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/48" title="机器学习之凸优化" strategy="undefined" target="_blank">机器学习之凸优化</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/47" title="机器学习之矩阵" strategy="undefined" target="_blank">机器学习之矩阵</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/detail/421" title="响应式布局全新探索" strategy="undefined" target="_blank">响应式布局全新探索</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/detail/426" title="探究Linux的总线、设备、驱动模型" strategy="undefined" target="_blank">探究Linux的总线、设备、驱动模型</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/detail/422" title="深度学习基础与TensorFlow实践" strategy="undefined" target="_blank">深度学习基础与TensorFlow实践</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/45" title="深度学习之神经网络原理与实战技巧" strategy="undefined" target="_blank">深度学习之神经网络原理与实战技巧</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/43" title="前端开发在线峰会" strategy="undefined" target="_blank">前端开发在线峰会</a>
                        </dd>
                        <dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;">
                             <a href="http://edu.csdn.net/huiyiCourse/series_detail/44" title="TensorFlow实战进阶:手把手教你做图像识别应用" strategy="undefined" target="_blank">TensorFlow实战进阶:手把手教你做图像识别应用</a>
                        </dd>
        </dl>

<!-- 广告位开始 -->
        <!-- 广告位结束 -->

<div class="comment_class">
    <div id="comment_title" class="panel_head">
        <span class="see_comment">查看评论</span><a name="comments"></a></div>
    <div id="comment_list"><dl class="comment_item comment_topic" id="comment_item_6903732"><dt class="comment_head" floor="173">173楼 <span class="user"><a class="username" href="/vae260772" target="_blank">vae260772</a> <span class="ptime">2017-06-14 14:47发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6903732" username="vae260772"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/vae260772" target="_blank"><img src="http://avatar.csdn.net/B/3/A/3_vae260772.jpg" width="40" height="40"></a></dd><dd class="comment_body">看了郭神2篇文章,一直有个问题没有搞清楚,就是ontouch的3个状态ACTION_DOWN、ACTION_MOVE与ACTION_UP到底是怎么执行的???给个总结,一句话调用三次view的dispatchTouchEvent(ev),相当于3个不同的事件!!!<br>前提父容器没有拦截事件分发:<br>点击按钮,必定执行一次控件(比如button)dispatchTouchEvent(ev),执行ACTION_DOWN事件,如果dispatchTouchEvent返回true;<br>继续执行一次或者多次dispatchTouchEvent(ev),这个时候如果你手指没有发抖会执行一次onLongClick方法,稍微移动一下会执行一次ACTION_MOVE状态,非常敏感,执行很多次都正常,这个时候如果也是返回true;<br>如果你手指移开了,再执行一次dispatchTouchEvent(ev),对应ACTION_UP,如果还是返回true;<br>会执行button的 onclick事件。</dd></dl><dl class="comment_item comment_topic" id="comment_item_6902630"><dt class="comment_head" floor="172">172楼 <span class="user"><a class="username" href="/vae260772" target="_blank">vae260772</a> <span class="ptime">2017-06-13 23:53发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6902630" username="vae260772"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/vae260772" target="_blank"><img src="http://avatar.csdn.net/B/3/A/3_vae260772.jpg" width="40" height="40"></a></dd><dd class="comment_body">ACTION_DOWN执行完是没有返回false的,每一个ACTION执行完没有出现返回值,在经过switch之后全部都返回一个true,所以后续的ACTION才可以继续触发。<br><br>但是代码明明是public boolean dispatchTouchEvent(MotionEvent event) {  <br>    if (mOnTouchListener != null &amp;amp;&amp;amp; (mViewFlags &amp;amp; ENABLED_MASK) == ENABLED &amp;amp;&amp;amp;  <br>            mOnTouchListener.onTouch(this, event)) {  <br>        return true;  <br>    }  <br>    return onTouchEvent(event);  <br>}  <br><br>onTouch在前面先执行, onTouchEvent(event)后执行的。为什么onTouch输出还要依赖onTouchEvent中的返回值true??? 异步?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6902620"><dt class="comment_head" floor="171">171楼 <span class="user"><a class="username" href="/vae260772" target="_blank">vae260772</a> <span class="ptime">2017-06-13 23:44发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6902620" username="vae260772"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/vae260772" target="_blank"><img src="http://avatar.csdn.net/B/3/A/3_vae260772.jpg" width="40" height="40"></a></dd><dd class="comment_body">“ontouch()方法中,返回false,会进入到ontouchevent()方法中,如果当前控件是可点击的,则会恒返回true,所以后面的ACTIONMOVE与ACTIONUP可以得到执行;如果为不可点击控件,则返回false,结束事件分发。”<br><br>ontouch()方法中,返回false了,button控件可点击的,则会恒返回true,,所以后面的ACTIONMOVE与ACTIONUP可以得到执行。这个执行的代码在哪里????????这一点没有搞懂</dd></dl><dl class="comment_item comment_topic" id="comment_item_6901801"><dt class="comment_head" floor="170">170楼 <span class="user"><a class="username" href="/IT_1995" target="_blank">IT_1995</a> <span class="ptime">2017-06-13 17:35发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6901801" username="IT_1995"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/IT_1995" target="_blank"><img src="http://avatar.csdn.net/0/7/7/3_it_1995.jpg" width="40" height="40"></a></dd><dd class="comment_body"><fieldset><legend>引用“liyangmeimei”的评论:</legend>等中文代码出来了,我也有这么牛逼</fieldset><br>这也和一个人的思维及学习能力有关啊,就算给你全部中文的你也学不来啊,你说这话思想是你学不来的。</dd></dl><dl class="comment_item comment_topic" id="comment_item_6838291"><dt class="comment_head" floor="169">169楼 <span class="user"><a class="username" href="/youyuge34" target="_blank">youyuge34</a> <span class="ptime">2017-05-16 19:22发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6838291" username="youyuge34"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/youyuge34" target="_blank"><img src="http://avatar.csdn.net/6/F/2/3_youyuge34.jpg" width="40" height="40"></a></dd><dd class="comment_body">说实话这篇guo大大写的不清不楚的,推荐大家先认真阅读http://www.jianshu.com/p/e99b5e8bd67b#这篇,对事件分发有了整体的全貌概念,再去研究鸿洋关于view和viewgroup事件分发的源代码</dd></dl><dl class="comment_item comment_topic" id="comment_item_6719359"><dt class="comment_head" floor="168">168楼 <span class="user"><a class="username" href="/tengliu6" target="_blank">滕柳</a> <span class="ptime">2017-03-31 11:13发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6719359" username="tengliu6"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/tengliu6" target="_blank"><img src="http://avatar.csdn.net/B/4/8/3_tengliu6.jpg" width="40" height="40"></a></dd><dd class="comment_body">感谢博主分享</dd></dl><dl class="comment_item comment_topic" id="comment_item_6719355"><dt class="comment_head" floor="167">167楼 <span class="user"><a class="username" href="/tengliu6" target="_blank">滕柳</a> <span class="ptime">2017-03-31 11:12发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6719355" username="tengliu6"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/tengliu6" target="_blank"><img src="http://avatar.csdn.net/B/4/8/3_tengliu6.jpg" width="40" height="40"></a></dd><dd class="comment_body">学习了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6719350"><dt class="comment_head" floor="166">166楼 <span class="user"><a class="username" href="/tengliu6" target="_blank">滕柳</a> <span class="ptime">2017-03-31 11:11发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6719350" username="tengliu6"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/tengliu6" target="_blank"><img src="http://avatar.csdn.net/B/4/8/3_tengliu6.jpg" width="40" height="40"></a></dd><dd class="comment_body">安卓开发  写的很好的博客</dd></dl><dl class="comment_item comment_topic" id="comment_item_6697261"><dt class="comment_head" floor="165">165楼 <span class="user"><a class="username" href="/ouxiang170744585" target="_blank">不会消失的夜晚187</a> <span class="ptime">2017-03-24 11:17发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6697261" username="ouxiang170744585"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/ouxiang170744585" target="_blank"><img src="http://avatar.csdn.net/D/D/6/3_ouxiang170744585.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭神,感觉文章中有一处您打错了,在讲“为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?”的第一种情况时,应该是在ImageView的onTouchEvent方法里返回true吧?如果onTouch方法里返回true,按照你讲的,ImageView是不可点击的,那么还是会执行onTouchEvent方法,在14行那儿直接跳出返回false,其他的action就不能执行了。</dd><dl class="comment_item comment_reply" id="comment_item_6715064"><dt class="comment_head" floor="165">Re: <span class="user"><a class="username" href="/zx277986425" target="_blank">centerzx</a> <span class="ptime">2017-03-30 00:00发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6715064" username="zx277986425"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zx277986425" target="_blank"><img src="http://avatar.csdn.net/7/6/C/3_zx277986425.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复ouxiang170744585:我开始和你想的一样,后来看了评论,然后又看了一遍。大神描述得没问题。代码是:if (mOnTouchListener != null &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED &amp;&amp; mOnTouchListener.onTouch(this, event)) { <br>return true; <br>} <br>return onTouchEvent(event); <br>} <br><br>如果onTouch返回true,就不会再执行onTouchEvent。请注意是enable和clickable 这是有区别的。一般控件的enable都为true</dd><dl class="comment_item comment_reply" id="comment_item_6840701"><dt class="comment_head" floor="1">Re: <span class="user"><a class="username" href="/it_wei_wei" target="_blank">it_wei_wei</a> <span class="ptime">2017-05-17 17:40发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6840701" username="it_wei_wei"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/it_wei_wei" target="_blank"><img src="http://avatar.csdn.net/F/5/D/3_it_wei_wei.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复zx277986425:既然imageview的onTouch事件返回了true,不会执行到onTouchEvent方法,   可又如何会执行ACTION_DOWN之后的其它action呢</dd><dl class="comment_item comment_reply" id="comment_item_6977293"><dt class="comment_head" floor="1">Re: <span class="user"><a class="username" href="/qq_17173933" target="_blank">PIXARtb</a> <span class="ptime">6天前 16:13发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6977293" username="qq_17173933"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_17173933" target="_blank"><img src="http://avatar.csdn.net/A/4/D/3_qq_17173933.jpg" width="40" height="40"></a></dd><dd class="comment_body">是这样,如果在onTouch方法里返回了true,就代表这个view要消耗这个down事件,那么后续的move,up事件都会被该view消耗。重点是onTouch方法返回了true,onTouchEvent方法不会被执行,这时候需要程序员自己在onTouch方法里面实现对down,move,up事件的处理过程。是不是恍然大悟</dd></dl></dl><dl class="comment_item comment_reply" id="comment_item_6729564"><dt class="comment_head" floor="1">Re: <span class="user"><a class="username" href="/ouxiang170744585" target="_blank">不会消失的夜晚187</a> <span class="ptime">2017-04-04 23:50发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6729564" username="ouxiang170744585"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/ouxiang170744585" target="_blank"><img src="http://avatar.csdn.net/D/D/6/3_ouxiang170744585.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复zx277986425:哦,是这样,谢谢啊!</dd></dl></dl></dl><dl class="comment_item comment_topic" id="comment_item_6678515"><dt class="comment_head" floor="164">164楼 <span class="user"><a class="username" href="/lsh_per" target="_blank">lsh_per</a> <span class="ptime">2017-03-16 14:38发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6678515" username="lsh_per"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/lsh_per" target="_blank"><img src="http://avatar.csdn.net/1/F/E/3_lsh_per.jpg" width="40" height="40"></a></dd><dd class="comment_body">两个问题:<br>1.ontouch()的ACTION_DOWN执行结束返回true以后,在执行ACTION_MOVE之前的过程是怎样的?经过了什么过程?<br>2.ontouch()的ACTION_UP执行后,是不是也是恒定返回为true?返回true以后会经过哪些过程? 如果ontouch返回的是false,那么这与上面返回的true会产生什么关系?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6675990"><dt class="comment_head" floor="163">163楼 <span class="user"><a class="username" href="/xiaohuaisw" target="_blank">BachCool</a> <span class="ptime">2017-03-15 21:03发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6675990" username="xiaohuaisw"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/xiaohuaisw" target="_blank"><img src="http://avatar.csdn.net/5/D/E/3_xiaohuaisw.jpg" width="40" height="40"></a></dd><dd class="comment_body">关于那个ACTION_DOWN返回false后其他的ACTION都不再执行有点迷惑。</dd><dl class="comment_item comment_reply" id="comment_item_6715067"><dt class="comment_head" floor="163">Re: <span class="user"><a class="username" href="/zx277986425" target="_blank">centerzx</a> <span class="ptime">2017-03-30 00:03发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6715067" username="zx277986425"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zx277986425" target="_blank"><img src="http://avatar.csdn.net/7/6/C/3_zx277986425.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复xiaohuaisw:如果返回为false,那么就必走ontouchevent,这个时候就看控件是否可以被点击。可以点击,那么返回true,后面的action可以执行,否则不能。</dd></dl><dl class="comment_item comment_reply" id="comment_item_6678491"><dt class="comment_head" floor="163">Re: <span class="user"><a class="username" href="/lsh_per" target="_blank">lsh_per</a> <span class="ptime">2017-03-16 14:28发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6678491" username="lsh_per"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/lsh_per" target="_blank"><img src="http://avatar.csdn.net/1/F/E/3_lsh_per.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复xiaohuaisw:ontouch()方法中,返回false,会进入到ontouchevent()方法中,如果当前控件是可点击的,则会恒返回true,所以后面的ACTIONMOVE与ACTIONUP可以得到执行;如果为不可点击控件,则返回false,结束事件分发。</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6646721"><dt class="comment_head" floor="162">162楼 <span class="user"><a class="username" href="/qq_16412311" target="_blank">qq_16412311</a> <span class="ptime">2017-03-03 14:34发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6646721" username="qq_16412311"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_16412311" target="_blank"><img src="http://avatar.csdn.net/C/E/2/3_qq_16412311.jpg" width="40" height="40"></a></dd><dd class="comment_body">6.0的api有些不一样,dispatchTouchEvent方法中代码一部分是<br>if (onFilterTouchEventForSecurity(event)) {<br>            //noinspection SimplifiableIfStatement<br>            ListenerInfo li = mListenerInfo;<br>            if (li != null &amp;&amp; li.mOnTouchListener != null<br>                    &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED<br>                    &amp;&amp; li.mOnTouchListener.onTouch(this, event)) {<br>                result = true;<br>            }<br><br>            if (!result &amp;&amp; onTouchEvent(event)) {<br>                result = true;<br>            }<br>        }<br>ImageView 的Enabled默认是true 所以如果onTouch方法返回false 会进入到onTouchEnvent方法,由于imagview的Clickable是false 所以进不去if里面去所以返回false后面的事件没法执行, 这时候如果改变Clickable为true后面的事件可以得到执行 还有一种方式 同时设置 imageview的onclick点击事件,Clickable也会变成ture后面的事件也就能得到执行 ,,本人亲自测试过</dd><dl class="comment_item comment_reply" id="comment_item_6674180"><dt class="comment_head" floor="162">Re: <span class="user"><a class="username" href="/junjle" target="_blank">junjle</a> <span class="ptime">2017-03-15 11:19发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6674180" username="junjle"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/junjle" target="_blank"><img src="http://avatar.csdn.net/0/9/8/3_junjle.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复qq_16412311:public void setOnClickListener(@Nullable OnClickListener l) {<br>        if (!isClickable()) {<br>            setClickable(true);<br>        }<br>        getListenerInfo().mOnClickListener = l;<br>    }<br>setOnClickListener会把clickable=true,所以会进入onTouchEvent里面</dd><dl class="comment_item comment_reply" id="comment_item_6755517"><dt class="comment_head" floor="1">Re: <span class="user"><a class="username" href="/chen_changtui" target="_blank">chen_changtui</a> <span class="ptime">2017-04-14 15:10发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6755517" username="chen_changtui"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/chen_changtui" target="_blank"><img src="http://avatar.csdn.net/B/6/A/3_chen_changtui.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复junjle:两种方式一样的 哈哈</dd></dl></dl></dl><dl class="comment_item comment_topic" id="comment_item_6646719"><dt class="comment_head" floor="161">161楼 <span class="user"><a class="username" href="/qq_16412311" target="_blank">qq_16412311</a> <span class="ptime">2017-03-03 14:32发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6646719" username="qq_16412311"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_16412311" target="_blank"><img src="http://avatar.csdn.net/C/E/2/3_qq_16412311.jpg" width="40" height="40"></a></dd><dd class="comment_body">6.0的api有些不一样,dispatchTouchEvent方法中代码一部分是<br>if (onFilterTouchEventForSecurity(event)) {<br>            //noinspection SimplifiableIfStatement<br>            ListenerInfo li = mListenerInfo;<br>            if (li != null &amp;&amp; li.mOnTouchListener != null<br>                    &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED<br>                    &amp;&amp; li.mOnTouchListener.onTouch(this, event)) {<br>                result = true;<br>            }<br><br>            if (!result &amp;&amp; onTouchEvent(event)) {<br>                result = true;<br>            }<br>        }<br>ImageView 的Enabled默认是true 所以如果onTouch方法返回false 会进入到onTouchEnvent方法,由于imagview的Clickable是false 所以进不去if里面去所以返回false后面的事件没法执行, 这时候如果改变Clickable为true后面的事件可以得到执行 还有一种方式 同时设置 imageview的onclick点击事件,Clickable也会变成ture后面的事件也就能得到执行 ,,本人亲自测试过</dd></dl><dl class="comment_item comment_topic" id="comment_item_6646715"><dt class="comment_head" floor="160">160楼 <span class="user"><a class="username" href="/qq_16412311" target="_blank">qq_16412311</a> <span class="ptime">2017-03-03 14:31发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6646715" username="qq_16412311"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_16412311" target="_blank"><img src="http://avatar.csdn.net/C/E/2/3_qq_16412311.jpg" width="40" height="40"></a></dd><dd class="comment_body">6.0的api有些不一样,dispatchTouchEvent方法中代码一部分是<br>if (onFilterTouchEventForSecurity(event)) {<br>            //noinspection SimplifiableIfStatement<br>            ListenerInfo li = mListenerInfo;<br>            if (li != null &amp;&amp; li.mOnTouchListener != null<br>                    &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED<br>                    &amp;&amp; li.mOnTouchListener.onTouch(this, event)) {<br>                result = true;<br>            }<br><br>            if (!result &amp;&amp; onTouchEvent(event)) {<br>                result = true;<br>            }<br>        }<br>ImageView 的Enabled默认是true 所以如果onTouch方法返回false 会进入到onTouchEnvent方法,由于imagview的Clickable是false 所以进不去if里面去所以返回false后面的事件没法执行, 这时候如果改变Clickable为true后面的事件可以得到执行 还有一种方式 同时设置 imageview的onclick点击事件,Clickable也会变成ture后面的事件也就能得到执行 ,,本人亲自测试过</dd></dl><dl class="comment_item comment_topic" id="comment_item_6646703"><dt class="comment_head" floor="159">159楼 <span class="user"><a class="username" href="/qq_16412311" target="_blank">qq_16412311</a> <span class="ptime">2017-03-03 14:30发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6646703" username="qq_16412311"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_16412311" target="_blank"><img src="http://avatar.csdn.net/C/E/2/3_qq_16412311.jpg" width="40" height="40"></a></dd><dd class="comment_body">6.0的api有些不一样,dispatchTouchEvent方法中代码一部分是<br>if (onFilterTouchEventForSecurity(event)) {<br>            //noinspection SimplifiableIfStatement<br>            ListenerInfo li = mListenerInfo;<br>            if (li != null &amp;&amp; li.mOnTouchListener != null<br>                    &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED<br>                    &amp;&amp; li.mOnTouchListener.onTouch(this, event)) {<br>                result = true;<br>            }<br><br>            if (!result &amp;&amp; onTouchEvent(event)) {<br>                result = true;<br>            }<br>        }<br>ImageView 的Enabled默认是true 所以如果onTouch方法返回false 会进入到onTouchEnvent方法,由于imagview的Clickable是false 所以进不去if里面去所以返回false后面的事件没法执行, 这时候如果改变Clickable为true后面的事件可以得到执行 还有一种方式 同时设置 imageview的onclick点击事件,Clickable也会变成ture后面的事件也就能得到执行 ,,本人亲自测试过</dd></dl><dl class="comment_item comment_topic" id="comment_item_6609010"><dt class="comment_head" floor="158">158楼 <span class="user"><a class="username" href="/briansxuan" target="_blank">briansxuan</a> <span class="ptime">2017-02-17 15:56发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6609010" username="briansxuan"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/briansxuan" target="_blank"><img src="http://avatar.csdn.net/5/1/F/3_briansxuan.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭神您好,我还是不明白为什么ImageView的onTouch()里面返回值设置为ture就可以了,设置为true之后,不是都不执行onTouchEvent()了吗?</dd><dl class="comment_item comment_reply" id="comment_item_6990637"><dt class="comment_head" floor="158">Re: <span class="user"><a class="username" href="/Wen_Z4" target="_blank">Wen_Z4</a> <span class="ptime">37分钟前发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6990637" username="Wen_Z4"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/Wen_Z4" target="_blank"><img src="http://avatar.csdn.net/E/6/3/3_wen_z4.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复briansxuan:可以先这样认为,控件的clickable(可点击)和enable(可用)是两种不同性质的属性,可以说,控件如果是有用的话,那么它就拥有要不就是可点击,要么就是不可点击这两项功能,如果控件不可用时,它的点击功能肯定是不能够用的了。控件一般都是enable=“true”的,而clickable则不一定是true(比如ImageView的默认clickable就是false)。回到问题上来,当ImageView的onTouch设置成返回true时,那么在它的ondispatchTouchEvent方法里肯定返回true,因为里面三个参数都满足了,这个时候ImageView就可以继续执行其他action若ACTION_MOVE和ACTION_UP。如果ImageView的onTouch方法返回false,那么它的ondispatchTouchEvent方法的第一个if语句就会返回false也是会去执行下面的onTouchEvent,而我onTouchEvent方法里面的所有其他action如ACTION_MOVE和ACTION_UP的执行都是在14行的判断控件是否可点击(clickable=“true”)前提下才能实现的,而ImageView默认是不可点击的clickable=“false”,所以ImageView的onTouchEvent方法里面的各项其他动作没有能够得到执行,这就有了郭神说第二个方法,将ImageView的clickable设置成true。</dd></dl><dl class="comment_item comment_reply" id="comment_item_6715068"><dt class="comment_head" floor="158">Re: <span class="user"><a class="username" href="/zx277986425" target="_blank">centerzx</a> <span class="ptime">2017-03-30 00:10发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6715068" username="zx277986425"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zx277986425" target="_blank"><img src="http://avatar.csdn.net/7/6/C/3_zx277986425.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复briansxuan:不执行,已经返回为true了,所以后续move、up继续执行</dd></dl><dl class="comment_item comment_reply" id="comment_item_6622595"><dt class="comment_head" floor="158">Re: <span class="user"><a class="username" href="/qq_30203943" target="_blank">青春小九九</a> <span class="ptime">2017-02-24 15:45发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6622595" username="qq_30203943"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_30203943" target="_blank"><img src="http://avatar.csdn.net/7/5/F/3_qq_30203943.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复briansxuan:ImageView是不可点击的,所以还是会执行OnTouchEvent();</dd><dl class="comment_item comment_reply" id="comment_item_6715069"><dt class="comment_head" floor="3">Re: <span class="user"><a class="username" href="/zx277986425" target="_blank">centerzx</a> <span class="ptime">2017-03-30 00:12发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6715069" username="zx277986425"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zx277986425" target="_blank"><img src="http://avatar.csdn.net/7/6/C/3_zx277986425.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复qq_30203943:你理解错了,是enable为false时才执行onTouchEvent</dd></dl><dl class="comment_item comment_reply" id="comment_item_6674183"><dt class="comment_head" floor="3">Re: <span class="user"><a class="username" href="/junjle" target="_blank">junjle</a> <span class="ptime">2017-03-15 11:20发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6674183" username="junjle"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/junjle" target="_blank"><img src="http://avatar.csdn.net/0/9/8/3_junjle.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复qq_30203943:回答有问题吧。ImageView的onTouch()里面返回值设置为ture,不会执行imageview的onTouchEvent方法了,但是由于返回true了,会执行imageview的ACTION_MOVE和ACTION_UP方法</dd></dl></dl></dl><dl class="comment_item comment_topic" id="comment_item_6605615"><dt class="comment_head" floor="157">157楼 <span class="user"><a class="username" href="/a3100293282" target="_blank">He.xj</a> <span class="ptime">2017-02-16 14:03发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6605615" username="a3100293282"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/a3100293282" target="_blank"><img src="http://avatar.csdn.net/2/8/3/3_a3100293282.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭神无敌</dd></dl><dl class="comment_item comment_topic" id="comment_item_6581697"><dt class="comment_head" floor="156">156楼 <span class="user"><a class="username" href="/qq_28482467" target="_blank">破费特ka</a> <span class="ptime">2017-02-03 15:28发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6581697" username="qq_28482467"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_28482467" target="_blank"><img src="http://avatar.csdn.net/D/5/B/3_qq_28482467.jpg" width="40" height="40"></a></dd><dd class="comment_body">前一个action返回true之后,代码是如何执行下一个action的呢??</dd><dl class="comment_item comment_reply" id="comment_item_6902631"><dt class="comment_head" floor="156">Re: <span class="user"><a class="username" href="/vae260772" target="_blank">vae260772</a> <span class="ptime">2017-06-13 23:56发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6902631" username="vae260772"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/vae260772" target="_blank"><img src="http://avatar.csdn.net/B/3/A/3_vae260772.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复qq_28482467:同求解答</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6559177"><dt class="comment_head" floor="155">155楼 <span class="user"><a class="username" href="/carson_ho" target="_blank">Carson_Ho</a> <span class="ptime">2017-01-17 17:38发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6559177" username="carson_ho"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/carson_ho" target="_blank"><img src="http://avatar.csdn.net/C/8/C/3_carson_ho.jpg" width="40" height="40"></a></dd><dd class="comment_body">感谢楼主整理</dd></dl><dl class="comment_item comment_topic" id="comment_item_6554750"><dt class="comment_head" floor="154">154楼 <span class="user"><a class="username" href="/u014795729" target="_blank">刘信的CSDN</a> <span class="ptime">2017-01-15 10:57发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6554750" username="u014795729"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u014795729" target="_blank"><img src="http://avatar.csdn.net/F/7/B/3_u014795729.jpg" width="40" height="40"></a></dd><dd class="comment_body">为什么android6.0 ImageView默认可以点击</dd></dl><dl class="comment_item comment_topic" id="comment_item_6541200"><dt class="comment_head" floor="153">153楼 <span class="user"><a class="username" href="/okokopai" target="_blank">大恶魔先生</a> <span class="ptime">2017-01-08 20:05发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6541200" username="okokopai"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/okokopai" target="_blank"><img src="http://avatar.csdn.net/9/B/A/3_okokopai.jpg" width="40" height="40"></a></dd><dd class="comment_body">我想问一个问题,dispatchTouchEvent不是在down、move、up是都会执行吗,<br>public boolean dispatchTouchEvent(MotionEvent event) {  <br>    if (mOnTouchListener != null &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED &amp;&amp;  <br>            mOnTouchListener.onTouch(this, event)) {  <br>        return true;  <br>    }  <br>    return onTouchEvent(event);  <br>}<br>这个方法只能说明,是onTouch方法返回决定onTouchEvent是否执行,当down事件时,onTouch返回false,执行onTouchEvent,就算该控件不是clickable,onTouchEvent返回false。为什么onTouch的其它事件也不能执行了呢,onTouchEvent并不能决定onTouch是否执行啊</dd><dl class="comment_item comment_reply" id="comment_item_6715070"><dt class="comment_head" floor="153">Re: <span class="user"><a class="username" href="/zx277986425" target="_blank">centerzx</a> <span class="ptime">2017-03-30 00:16发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6715070" username="zx277986425"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zx277986425" target="_blank"><img src="http://avatar.csdn.net/7/6/C/3_zx277986425.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复okokopai:onTouchEvent 返回false后,dispatchTouchEvent返回的值就是false了,那么事件就不再分发继续执行。我理解是这样</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6535137"><dt class="comment_head" floor="152">152楼 <span class="user"><a class="username" href="/Dreamfree3" target="_blank">staysWithMe</a> <span class="ptime">2017-01-05 14:07发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6535137" username="Dreamfree3"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/Dreamfree3" target="_blank"><img src="http://avatar.csdn.net/A/9/8/3_dreamfree3.jpg" width="40" height="40"></a></dd><dd class="comment_body">是不是有一种被欺骗的感觉?明明在onTouch事件里返回了false,系统还是在onTouchEvent方法中帮你返回了true。就因为这个原因,才使得前面的例子中ACTION_UP可以得到执行。 我想说这两个方法有啥联系么 !?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6531350"><dt class="comment_head" floor="151">151楼 <span class="user"><a class="username" href="/a1030260075" target="_blank">那个发饰</a> <span class="ptime">2017-01-03 16:27发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6531350" username="a1030260075"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/a1030260075" target="_blank"><img src="http://avatar.csdn.net/E/D/7/3_a1030260075.jpg" width="40" height="40"></a></dd><dd class="comment_body">讲得比较容易懂,谢谢</dd></dl><dl class="comment_item comment_topic" id="comment_item_6506807"><dt class="comment_head" floor="150">150楼 <span class="user"><a class="username" href="/CHENZELIN22" target="_blank">CHENZELIN22</a> <span class="ptime">2016-12-26 19:44发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6506807" username="CHENZELIN22"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/CHENZELIN22" target="_blank"><img src="http://avatar.csdn.net/F/6/8/3_chenzelin22.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭大神,您好, 我在用您的litepal数据库的时候出现了几个问题。<br>1 一对多的关系表,分别添加数据,存入数据库。然后把数据都读出来,在多的一方添加数据,save(),然后 一的一方save(),出现问题,一的一方生成了一个新的id,这种情况在页面间传递对象,然后都save()也会出现。<br>2 插入数据的时候有没有办法指定插入位置的呢,像list.add(position,bean)这种,我想在的处理方式是,先将最后一条数据删除,然后插入新数据,在将删除的数据插入, 插入失败</dd></dl><dl class="comment_item comment_topic" id="comment_item_6506799"><dt class="comment_head" floor="149">149楼 <span class="user"><a class="username" href="/CHENZELIN22" target="_blank">CHENZELIN22</a> <span class="ptime">2016-12-26 19:40发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6506799" username="CHENZELIN22"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/CHENZELIN22" target="_blank"><img src="http://avatar.csdn.net/F/6/8/3_chenzelin22.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭大神,您好, 我在用您的litepal数据库的时候出现了几个问题。<br>1 一对多的关系表,分别添加数据,存入数据库。然后把数据都读出来,在多的一方添加数据,save(),然后 一的一方save(),<br>    出现问题,一的一方生成了一个新的id,这种情况在页面间传递对象,然后都save()也会出现。<br>2 插入数据的时候有没有办法指定插入位置的呢,像list.add(position,bean)这种,我想在的处理方式是,先将最后一条数据删除,然后<br>   插入新数据,在将删除的数据插入, 插入失败<br><br>目前这两个问题比较严重,网上也没有找到好的解决办法,只能求助您了,请您帮我看看,谢谢,很抱歉打扰您了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6506791"><dt class="comment_head" floor="148">148楼 <span class="user"><a class="username" href="/CHENZELIN22" target="_blank">CHENZELIN22</a> <span class="ptime">2016-12-26 19:38发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6506791" username="CHENZELIN22"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/CHENZELIN22" target="_blank"><img src="http://avatar.csdn.net/F/6/8/3_chenzelin22.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭大神,您好, 我在用您的litepal数据库的时候出现了几个问题。<br>1 一对多的关系表,分别添加数据,存入数据库。然后把数据都读出来,在多的一方添加数据,save(),然后 一的一方save(),<br>    出现问题,一的一方生成了一个新的id,这种情况在页面间传递对象,然后都save()也会出现。<br>2 插入数据的时候有没有办法指定插入位置的呢,像list.add(position,bean)这种,我想在的处理方式是,先将最后一条数据删除,然后<br>   插入新数据,在将删除的数据插入, 插入失败<br><br>目前这两个问题比较严重,网上也没有找到好的解决办法,只能求助您了,请您帮我看看,谢谢,很抱歉打扰您了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6506790"><dt class="comment_head" floor="147">147楼 <span class="user"><a class="username" href="/CHENZELIN22" target="_blank">CHENZELIN22</a> <span class="ptime">2016-12-26 19:37发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6506790" username="CHENZELIN22"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/CHENZELIN22" target="_blank"><img src="http://avatar.csdn.net/F/6/8/3_chenzelin22.jpg" width="40" height="40"></a></dd><dd class="comment_body">郭大神,您好, 我在用您的litepal数据库的时候出现了几个问题。<br>1 一对多的关系表,分别添加数据,存入数据库。然后把数据都读出来,在多的一方添加数据,save(),然后 一的一方save(),<br>    出现问题,一的一方生成了一个新的id,这种情况在页面间传递对象,然后都save()也会出现。<br>2 插入数据的时候有没有办法指定插入位置的呢,像list.add(position,bean)这种,我想在的处理方式是,先将最后一条数据删除,然后<br>   插入新数据,在将删除的数据插入, 插入失败<br>目前这两个问题比较严重,网上也没有找到好的解决办法,只能求助您了,请您帮我看看,谢谢,很抱歉打扰您了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6501859"><dt class="comment_head" floor="146">146楼 <span class="user"><a class="username" href="/yuanshouhui1987" target="_blank">yuanshouhui1987</a> <span class="ptime">2016-12-23 12:18发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6501859" username="yuanshouhui1987"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/yuanshouhui1987" target="_blank"><img src="http://avatar.csdn.net/3/1/C/3_yuanshouhui1987.jpg" width="40" height="40"></a></dd><dd class="comment_body">分析的不错,特别适合初中级程序员</dd></dl><dl class="comment_item comment_topic" id="comment_item_6487678"><dt class="comment_head" floor="145">145楼 <span class="user"><a class="username" href="/qq_34772082" target="_blank">RiverBean</a> <span class="ptime">2016-12-16 11:33发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6487678" username="qq_34772082"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_34772082" target="_blank"><img src="http://avatar.csdn.net/9/E/8/3_qq_34772082.jpg" width="40" height="40"></a></dd><dd class="comment_body">dispatchTouchEvent(MotionEvent event) 中 (mViewFlags &amp; ENABLED_MASK) == ENABLED 的<br>mViewFlags &amp; ENABLED_MASK怎么解释昵 是什么意思昵 ?mViewFlags 和ENABLED_MASK是怎么来的?新手,表示折腾半天不知道咋回事</dd></dl><dl class="comment_item comment_topic" id="comment_item_6477817"><dt class="comment_head" floor="144">144楼 <span class="user"><a class="username" href="/wzx1125330" target="_blank">佑子-Artist</a> <span class="ptime">2016-12-12 14:06发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6477817" username="wzx1125330"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/wzx1125330" target="_blank"><img src="http://avatar.csdn.net/1/8/D/3_wzx1125330.jpg" width="40" height="40"></a></dd><dd class="comment_body">大神最近刚刚写的文章,半个月的阅读量已经21w了啊,马上研读研读</dd></dl><dl class="comment_item comment_topic" id="comment_item_6455540"><dt class="comment_head" floor="143">143楼 <span class="user"><a class="username" href="/gsfdjgji" target="_blank">13期-李天贵</a> <span class="ptime">2016-11-30 23:51发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6455540" username="gsfdjgji"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/gsfdjgji" target="_blank"><img src="http://avatar.csdn.net/4/0/A/3_gsfdjgji.jpg" width="40" height="40"></a></dd><dd class="comment_body">感谢分享·</dd></dl><dl class="comment_item comment_topic" id="comment_item_6444131"><dt class="comment_head" floor="142">142楼 <span class="user"><a class="username" href="/weixin_36222137" target="_blank">yhy_</a> <span class="ptime">2016-11-29 16:07发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6444131" username="weixin_36222137"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/weixin_36222137" target="_blank"><img src="http://avatar.csdn.net/4/4/F/3_weixin_36222137.jpg" width="40" height="40"></a></dd><dd class="comment_body">初学安卓的时候看过这篇文章,没看懂。  今天再来看恍然大悟 郭神66666666666666</dd></dl><dl class="comment_item comment_topic" id="comment_item_6441936"><dt class="comment_head" floor="141">141楼 <span class="user"><a class="username" href="/gaoyan321123" target="_blank">RockGao</a> <span class="ptime">2016-11-29 10:57发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6441936" username="gaoyan321123"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/gaoyan321123" target="_blank"><img src="http://avatar.csdn.net/A/C/A/3_gaoyan321123.jpg" width="40" height="40"></a></dd><dd class="comment_body">最近正好碰见这个问题,然后就看到郭神的这篇文章,太棒了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6429185"><dt class="comment_head" floor="140">140楼 <span class="user"><a class="username" href="/u011597890" target="_blank">Mr-Y</a> <span class="ptime">2016-11-24 17:14发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6429185" username="u011597890"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u011597890" target="_blank"><img src="http://avatar.csdn.net/1/1/6/3_u011597890.jpg" width="40" height="40"></a></dd><dd class="comment_body">这里我明白了,无论是设置点击事件还是让onTouch()的返回值为true,都是为了让ImageView调用的View的dispatchTouchEvent()的返回值为true,让ViewGroup在分发的时候能找到它,把ACTION继续传递下来。</dd><dl class="comment_item comment_reply" id="comment_item_6514388"><dt class="comment_head" floor="140">Re: <span class="user"><a class="username" href="/JGAMPTM_" target="_blank">JGAMPTM_</a> <span class="ptime">2016-12-29 16:47发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6514388" username="JGAMPTM_"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/JGAMPTM_" target="_blank"><img src="http://avatar.csdn.net/5/D/B/3_jgamptm_.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复u011597890:不对吧? 决定事件是否传给子控件的不应该是    ViewGroup中 onInterceptTouchEvent 的返回值是否为true 吗?</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6424465"><dt class="comment_head" floor="139">139楼 <span class="user"><a class="username" href="/u011597890" target="_blank">Mr-Y</a> <span class="ptime">2016-11-22 18:56发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6424465" username="u011597890"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u011597890" target="_blank"><img src="http://avatar.csdn.net/1/1/6/3_u011597890.jpg" width="40" height="40"></a></dd><dd class="comment_body">我还是不明白为什么ImageView的onTouch()里面返回值设置为ture就可以了,设置为true之后,不是都不执行onTouchEvent()了吗?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6410458"><dt class="comment_head" floor="138">138楼 <span class="user"><a class="username" href="/gx1058742912" target="_blank">gx1058742912</a> <span class="ptime">2016-11-15 14:47发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6410458" username="gx1058742912"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/gx1058742912" target="_blank"><img src="http://avatar.csdn.net/1/2/9/3_gx1058742912.jpg" width="40" height="40"></a></dd><dd class="comment_body">后面举例ImageView的时候,如果都进不去if条件内部,那又怎么会执行ACTION_DOWN呢,应该是什么action都不执行啊,为什么会打印出执行了ACTION_DOWN呢?</dd><dl class="comment_item comment_reply" id="comment_item_6837049"><dt class="comment_head" floor="138">Re: <span class="user"><a class="username" href="/sbl19940819" target="_blank">Songbl_</a> <span class="ptime">2017-05-16 11:26发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6837049" username="sbl19940819"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/sbl19940819" target="_blank"><img src="http://avatar.csdn.net/8/7/F/3_sbl19940819.jpg" width="40" height="40"></a></dd><dd class="comment_body">兄弟,我也不明白。你现在明白了嘛?</dd></dl><dl class="comment_item comment_reply" id="comment_item_6837035"><dt class="comment_head" floor="138">Re: <span class="user"><a class="username" href="/sbl19940819" target="_blank">Songbl_</a> <span class="ptime">2017-05-16 11:23发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6837035" username="sbl19940819"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/sbl19940819" target="_blank"><img src="http://avatar.csdn.net/8/7/F/3_sbl19940819.jpg" width="40" height="40"></a></dd><dd class="comment_body">后面举例ImageView的时候,如果都进不去if条件内部,那又怎么会执行ACTION_DOWN呢,应该是什么action都不执行啊,为什么会打印出执行了ACTION_DOWN呢?</dd></dl><dl class="comment_item comment_reply" id="comment_item_6514413"><dt class="comment_head" floor="138">Re: <span class="user"><a class="username" href="/JGAMPTM_" target="_blank">JGAMPTM_</a> <span class="ptime">2016-12-29 16:54发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6514413" username="JGAMPTM_"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/JGAMPTM_" target="_blank"><img src="http://avatar.csdn.net/5/D/B/3_jgamptm_.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复gx1058742912:public boolean dispatchTouchEvent(MotionEvent event) {  <br>    if (mOnTouchListener != null &amp;&amp; (mViewFlags &amp; ENABLED_MASK) == ENABLED &amp;&amp;  <br>            mOnTouchListener.onTouch(this, event)) {  <br>        return true;  <br>    }  <br>    return onTouchEvent(event);  <br>}  <br><br><br><br>这里第一个if语句里有  mOnTouchListener.onTouch(this, event)  这句调用,在这里直接就打印了一句,然后再返回的FALSE.</dd></dl><dl class="comment_item comment_reply" id="comment_item_6424503"><dt class="comment_head" floor="138">Re: <span class="user"><a class="username" href="/u011597890" target="_blank">Mr-Y</a> <span class="ptime">2016-11-22 19:19发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6424503" username="u011597890"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u011597890" target="_blank"><img src="http://avatar.csdn.net/1/1/6/3_u011597890.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复gx1058742912:我也十分不理解这个。而且这个ACTION_DOWN是onTouchEvent()里面的,不是都没进去吗?如果你是说是onTouch,ondispatchTouchEvent()里面打印的我还明白,但。。。</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6401130"><dt class="comment_head" floor="137">137楼 <span class="user"><a class="username" href="/syucsdn" target="_blank">She_Xin</a> <span class="ptime">2016-11-09 19:17发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6401130" username="syucsdn"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/syucsdn" target="_blank"><img src="http://avatar.csdn.net/1/9/A/3_syucsdn.jpg" width="40" height="40"></a></dd><dd class="comment_body">向郭神请教个问题,我现在在Android Studio中的看到的View源码和你讲的不一样是什么原因?</dd><dl class="comment_item comment_reply" id="comment_item_6425307"><dt class="comment_head" floor="137">Re: <span class="user"><a class="username" href="/ddlisbug" target="_blank">听歌写代码</a> <span class="ptime">2016-11-23 09:53发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6425307" username="ddlisbug"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/ddlisbug" target="_blank"><img src="http://avatar.csdn.net/1/3/7/3_ddlisbug.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复syucsdn:android sdk版本不一样</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6381688"><dt class="comment_head" floor="136">136楼 <span class="user"><a class="username" href="/coder_e" target="_blank">coder_e</a> <span class="ptime">2016-10-31 17:37发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6381688" username="coder_e"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/coder_e" target="_blank"><img src="http://avatar.csdn.net/F/3/D/3_coder_e.jpg" width="40" height="40"></a></dd><dd class="comment_body">讲解得真好,mark一下!</dd></dl><dl class="comment_item comment_topic" id="comment_item_6364619"><dt class="comment_head" floor="135">135楼 <span class="user"><a class="username" href="/mux22" target="_blank">mux2</a> <span class="ptime">2016-10-27 15:49发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6364619" username="mux22"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/mux22" target="_blank"><img src="http://avatar.csdn.net/F/D/C/3_mux22.jpg" width="40" height="40"></a></dd><dd class="comment_body">"这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。"这句话我反复看了好几遍,才看懂呀</dd><dl class="comment_item comment_reply" id="comment_item_6401131"><dt class="comment_head" floor="135">Re: <span class="user"><a class="username" href="/zlhjw1018" target="_blank">zlhjw1018</a> <span class="ptime">2016-11-09 19:17发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6401131" username="zlhjw1018"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zlhjw1018" target="_blank"><img src="http://avatar.csdn.net/A/7/5/3_zlhjw1018.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复mux22:兄弟,能解释下吗</dd><dl class="comment_item comment_reply" id="comment_item_6401216"><dt class="comment_head" floor="1">Re: <span class="user"><a class="username" href="/syucsdn" target="_blank">She_Xin</a> <span class="ptime">2016-11-09 20:02发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6401216" username="syucsdn"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/syucsdn" target="_blank"><img src="http://avatar.csdn.net/1/9/A/3_syucsdn.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复zlhjw1018:ACTION_DOWM执行完是没有返回false的,每一个ACTION执行完没有出现返回值,在经过switch之后全部都返回一个true,所以后续的ACTION才可以继续触发</dd></dl></dl></dl><dl class="comment_item comment_topic" id="comment_item_6349404"><dt class="comment_head" floor="134">134楼 <span class="user"><a class="username" href="/C_S_D_N_MUSHROOM" target="_blank">C_S_D_N_MUSHROOM</a> <span class="ptime">2016-10-21 09:34发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6349404" username="C_S_D_N_MUSHROOM"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/C_S_D_N_MUSHROOM" target="_blank"><img src="http://avatar.csdn.net/8/4/6/3_c_s_d_n_mushroom.jpg" width="40" height="40"></a></dd><dd class="comment_body">老板,我在京东买了本你那个书。55块几。 买回来发现印刷有些看不清呀?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6327321"><dt class="comment_head" floor="133">133楼 <span class="user"><a class="username" href="/DoIndieyxd" target="_blank">杨显栋</a> <span class="ptime">2016-10-09 15:01发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6327321" username="DoIndieyxd"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/DoIndieyxd" target="_blank"><img src="http://avatar.csdn.net/B/5/B/3_doindieyxd.jpg" width="40" height="40"></a></dd><dd class="comment_body">- - 我有一个傻傻的问题  为啥我的源码长 这样啊。。。<br>  public boolean dispatchTouchEvent(MotionEvent event) {<br>        throw new RuntimeException("Stub!");<br>    }<br><br>= = 找了半天也没找到源码到底在那 :-(</dd><dl class="comment_item comment_reply" id="comment_item_6388480"><dt class="comment_head" floor="133">Re: <span class="user"><a class="username" href="/maofelix" target="_blank">云出枫岫</a> <span class="ptime">2016-11-02 14:45发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6388480" username="maofelix"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/maofelix" target="_blank"><img src="http://avatar.csdn.net/6/B/D/3_maofelix.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复DoIndieyxd:如果使用的是AS开发,配置源码可以参考我的这篇文章:<br>http://www.jianshu.com/p/ca99100a6bd8</dd></dl><dl class="comment_item comment_reply" id="comment_item_6350350"><dt class="comment_head" floor="133">Re: <span class="user"><a class="username" href="/zlhjw1018" target="_blank">zlhjw1018</a> <span class="ptime">2016-10-21 13:57发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6350350" username="zlhjw1018"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zlhjw1018" target="_blank"><img src="http://avatar.csdn.net/A/7/5/3_zlhjw1018.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复DoIndieyxd:我也遇到过,你安装studio时有一个放sdk的目录,你用这个sdk,别用project 的sdk!</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6313407"><dt class="comment_head" floor="132">132楼 <span class="user"><a class="username" href="/u012715336" target="_blank">时芳芳</a> <span class="ptime">2016-10-03 19:00发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6313407" username="u012715336"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u012715336" target="_blank"><img src="http://avatar.csdn.net/4/F/E/3_u012715336.jpg" width="40" height="40"></a></dd><dd class="comment_body">楼主好,我刚刚试了下,给imageview注册onclicklistener事件后也会执行ACTION_DOWN,ACTION-MOVE,ACTION-UP,是不是给他注册了click事件就改了它的默认值了?</dd><dl class="comment_item comment_reply" id="comment_item_6374079"><dt class="comment_head" floor="132">Re: <span class="user"><a class="username" href="/ChenTianSaber" target="_blank">ChenTianSaber</a> <span class="ptime">2016-10-30 12:01发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6374079" username="ChenTianSaber"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/ChenTianSaber" target="_blank"><img src="http://avatar.csdn.net/C/9/8/3_chentiansaber.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复u012715336:你设置了SetOnClickListener()就会给ImageView设置Clickable属性,然后它就变得和Button一样了,你把SetOnClickListener注释掉就行了</dd></dl><dl class="comment_item comment_reply" id="comment_item_6352899"><dt class="comment_head" floor="132">Re: <span class="user"><a class="username" href="/abao_kevin520" target="_blank">abao_kevin520</a> <span class="ptime">2016-10-22 23:59发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6352899" username="abao_kevin520"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/abao_kevin520" target="_blank"><img src="http://avatar.csdn.net/1/C/9/3_abao_kevin520.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复u012715336:  public void setOnClickListener(@Nullable OnClickListener l) {<br>        if (!isClickable()) {<br>            setClickable(true);<br>        }<br>        getListenerInfo().mOnClickListener = l;<br>    }</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6255976"><dt class="comment_head" floor="131">131楼 <span class="user"><a class="username" href="/minjie0128" target="_blank">minjie0128</a> <span class="ptime">2016-09-03 13:50发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6255976" username="minjie0128"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/minjie0128" target="_blank"><img src="http://avatar.csdn.net/2/E/7/3_minjie0128.jpg" width="40" height="40"></a></dd><dd class="comment_body">看看这一篇<br>http://minjie.tech/2016/09/03/基于源码来了解Android的事件分发机制/</dd></dl><dl class="comment_item comment_topic" id="comment_item_6220141"><dt class="comment_head" floor="130">130楼 <span class="user"><a class="username" href="/Scotfield_msn" target="_blank">Scofield_Phil</a> <span class="ptime">2016-08-20 01:54发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6220141" username="Scotfield_msn"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/Scotfield_msn" target="_blank"><img src="http://avatar.csdn.net/9/B/B/3_scotfield_msn.jpg" width="40" height="40"></a></dd><dd class="comment_body">让让路,<br>http://blog.csdn.net/a553181867/article/details/51287844</dd></dl><dl class="comment_item comment_topic" id="comment_item_6213054"><dt class="comment_head" floor="129">129楼 <span class="user"><a class="username" href="/u013316901" target="_blank">刘韦声</a> <span class="ptime">2016-08-16 10:31发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6213054" username="u013316901"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u013316901" target="_blank"><img src="http://avatar.csdn.net/4/0/1/3_u013316901.jpg" width="40" height="40"></a></dd><dd class="comment_body">请问是不是按下手指和拿起手指都会触发dispatchTouchEvent方法呢?</dd><dl class="comment_item comment_reply" id="comment_item_6231147"><dt class="comment_head" floor="129">Re: <span class="user"><a class="username" href="/mz5178" target="_blank">Goldberg_M</a> <span class="ptime">2016-08-26 11:22发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6231147" username="mz5178"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/mz5178" target="_blank"><img src="http://avatar.csdn.net/1/8/0/3_mz5178.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复u013316901:return true 后续事件可以进入view的dispatchtouchevent .</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6210397"><dt class="comment_head" floor="128">128楼 <span class="user"><a class="username" href="/yangsec" target="_blank">yangsec</a> <span class="ptime">2016-08-14 12:01发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6210397" username="yangsec"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/yangsec" target="_blank"><img src="http://avatar.csdn.net/E/B/1/3_yangsec.jpg" width="40" height="40"></a></dd><dd class="comment_body">请教大神一下,为什么图片轮播器里的图片使用Button而不用ImageView?<br>为什么说ImageView是不可点击的就会导致不能滚动呢?<br>我的理解是,《Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来》 这篇文章中实现消费滚动事件的并不是ImageView啊,而是他们的父控件SlidingSwitcherView 。这样的话ImageView的dispatchTouchEvent返回为false不正好能把事件向上返回给父控件吗?<br>反而返回为true会导致SlidingSwitcherView不能接受到事件因而无法实现滚动。<br>实在想不明白了,希望大神赐教</dd></dl><dl class="comment_item comment_topic" id="comment_item_6169527"><dt class="comment_head" floor="127">127楼 <span class="user"><a class="username" href="/liyangmeimei" target="_blank">ym丶没红六</a> <span class="ptime">2016-08-02 17:49发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6169527" username="liyangmeimei"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/liyangmeimei" target="_blank"><img src="http://avatar.csdn.net/4/9/C/3_liyangmeimei.jpg" width="40" height="40"></a></dd><dd class="comment_body">等中文代码出来了,我也有这么牛逼</dd></dl><dl class="comment_item comment_topic" id="comment_item_6167686"><dt class="comment_head" floor="126">126楼 <span class="user"><a class="username" href="/lbk15836988030" target="_blank">野心ing</a> <span class="ptime">2016-08-01 16:06发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6167686" username="lbk15836988030"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/lbk15836988030" target="_blank"><img src="http://avatar.csdn.net/E/0/4/3_lbk15836988030.jpg" width="40" height="40"></a></dd><dd class="comment_body">必须赞一个。</dd></dl><dl class="comment_item comment_topic" id="comment_item_6134783"><dt class="comment_head" floor="125">125楼 <span class="user"><a class="username" href="/zxnbzw" target="_blank">zxnbzw</a> <span class="ptime">2016-07-19 15:46发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6134783" username="zxnbzw"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zxnbzw" target="_blank"><img src="http://avatar.csdn.net/C/1/1/3_zxnbzw.jpg" width="40" height="40"></a></dd><dd class="comment_body">请问:很多把android里面的事件分为触摸事件和按键事件。是分别对应MotionEvent和KeyEvent两个类吗?触摸事件好理解,按键事件是指什么?Button等控件的按下等事件还是软键盘的还是Android系统的音量等等按键?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6125449"><dt class="comment_head" floor="124">124楼 <span class="user"><a class="username" href="/yy_451686712" target="_blank">樱花_殇</a> <span class="ptime">2016-07-12 15:43发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6125449" username="yy_451686712"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/yy_451686712" target="_blank"><img src="http://avatar.csdn.net/4/D/9/3_yy_451686712.jpg" width="40" height="40"></a></dd><dd class="comment_body">view的源码已经变了若干次了,但是结论没有大变,看来我还是记结论吧,参悟源码太不可测</dd></dl><dl class="comment_item comment_topic" id="comment_item_6118108"><dt class="comment_head" floor="123">123楼 <span class="user"><a class="username" href="/ateng5921" target="_blank">热爱生活</a> <span class="ptime">2016-07-06 07:37发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6118108" username="ateng5921"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/ateng5921" target="_blank"><img src="http://avatar.csdn.net/C/A/9/3_ateng5921.jpg" width="40" height="40"></a></dd><dd class="comment_body">刚买了您的书籍,马上学习!感谢!</dd></dl><dl class="comment_item comment_topic" id="comment_item_6113128"><dt class="comment_head" floor="122">122楼 <span class="user"><a class="username" href="/qq_18739303" target="_blank">qq_18739303</a> <span class="ptime">2016-07-01 17:57发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6113128" username="qq_18739303"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_18739303" target="_blank"><img src="http://avatar.csdn.net/0/3/7/3_qq_18739303.jpg" width="40" height="40"></a></dd><dd class="comment_body">非常棒 查了很多这类的文章,这两篇是最详细的,通过源码进行论证,并且举一反三,让理解不仅仅只停留在表面。非常感谢博主</dd></dl><dl class="comment_item comment_topic" id="comment_item_6076673"><dt class="comment_head" floor="121">121楼 <span class="user"><a class="username" href="/duo2005duo" target="_blank">远古大钟</a> <span class="ptime">2016-06-07 16:12发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6076673" username="duo2005duo"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/duo2005duo" target="_blank"><img src="http://avatar.csdn.net/9/4/F/3_duo2005duo.jpg" width="40" height="40"></a></dd><dd class="comment_body">不错,不过onTouchEvent的分析还不够详细,详细可以看<br>http://blog.csdn.net/duo2005duo/article/details/51604119</dd></dl><dl class="comment_item comment_topic" id="comment_item_6076409"><dt class="comment_head" floor="120">120楼 <span class="user"><a class="username" href="/oyang716" target="_blank">凤凰的挽歌</a> <span class="ptime">2016-06-07 13:03发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6076409" username="oyang716"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/oyang716" target="_blank"><img src="http://avatar.csdn.net/8/5/0/3_oyang716.jpg" width="40" height="40"></a></dd><dd class="comment_body">文章很棒,在试着学习你分析问题的方法,关于“只要你触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法”这个是如何查到的呢?</dd></dl><dl class="comment_item comment_topic" id="comment_item_6073745"><dt class="comment_head" floor="119">119楼 <span class="user"><a class="username" href="/zrf1335348191" target="_blank">fanfan_story</a> <span class="ptime">2016-06-04 10:55发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6073745" username="zrf1335348191"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/zrf1335348191" target="_blank"><img src="http://avatar.csdn.net/4/4/C/3_zrf1335348191.jpg" width="40" height="40"></a></dd><dd class="comment_body">刚开始还能看懂,看来我得再学学了</dd></dl><dl class="comment_item comment_topic" id="comment_item_6059226"><dt class="comment_head" floor="118">118楼 <span class="user"><a class="username" href="/chen1026241686" target="_blank">chen1026241686</a> <span class="ptime">2016-05-30 15:28发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6059226" username="chen1026241686"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/chen1026241686" target="_blank"><img src="http://avatar.csdn.net/D/A/F/3_chen1026241686.jpg" width="40" height="40"></a></dd><dd class="comment_body">找不到比较好的文章??只能说你没好好找罢了 http://blog.csdn.net/yanbober/article/details/45887547</dd><dl class="comment_item comment_reply" id="comment_item_6125443"><dt class="comment_head" floor="118">Re: <span class="user"><a class="username" href="/yy_451686712" target="_blank">樱花_殇</a> <span class="ptime">2016-07-12 15:41发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6125443" username="yy_451686712"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/yy_451686712" target="_blank"><img src="http://avatar.csdn.net/4/D/9/3_yy_451686712.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复chen1026241686:人家13年写的,你贴的那篇15年写的,人家两年前就会的东西后来人过了好几年才慢慢参悟...</dd></dl><dl class="comment_item comment_reply" id="comment_item_6090441"><dt class="comment_head" floor="118">Re: <span class="user"><a class="username" href="/u010823943" target="_blank">calmerman</a> <span class="ptime">2016-06-21 17:28发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6090441" username="u010823943"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u010823943" target="_blank"><img src="http://avatar.csdn.net/D/C/1/3_u010823943.jpg" width="40" height="40"></a></dd><dd class="comment_body">回复chen1026241686:郭霖写的文章是什么时间,你说的文章是什么时间!</dd></dl></dl><dl class="comment_item comment_topic" id="comment_item_6043905"><dt class="comment_head" floor="117">117楼 <span class="user"><a class="username" href="/jujiq" target="_blank">jujiq</a> <span class="ptime">2016-05-20 22:57发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="6043905" username="jujiq"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/jujiq" target="_blank"><img src="http://avatar.csdn.net/8/A/1/3_jujiq.jpg" width="40" height="40"></a></dd><dd class="comment_body">我想问下您的第一行代码里面,为什么很多类都没有导入包就直接用了,然后也没有任何提示和说明。</dd></dl><div class="clear"></div></div>
    <div id="comment_bar"><div id="load_comments" page="2">查看更多评论</div></div>
    <div id="comment_form"><div class="guest_link">您还没有登录,请<a href="javascript:void(0);" οnclick="javascript:loginbox();">[登录]</a>或<a href="http://passport.csdn.net/account/register?from=http%3A%2F%2Fblog.csdn.net%2Fguolin_blog%2Farticle%2Fdetails%2F9097463%2F">[注册]</a></div></div>
    <div class="announce">
        * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场<a name="reply"></a><a name="quote"></a></div>
</div>

<script type="text/javascript">
    var fileName = '9097463';
    var commentscount = 305;
    var islock = false
</script>

<div id="ad_bot">
    </div>
<div id="report_dialog">
</div>

<div id="d-top" style="bottom:60px;">

<a id="quick-reply" class="btn btn-top q-reply" title="快速回复" style="display:none;">
            <img src="http://static.blog.csdn.net/images/blog-icon-reply.png" alt="快速回复">
        </a>    
    <a id="d-top-a" class="btn btn-top backtop" style="display: none;" title="返回顶部" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_huidaodingbu'])">         
         <img src="http://static.blog.csdn.net/images/top.png" alt="TOP">
    </a>
</div>
<script type="text/javascript">
    $(function ()
    {
        $("#ad_frm_0").height("90px");
        
        setTimeout(function(){
            $("#ad_frm_2").height("200px");
        },1000);    
    });
 
</script>
<style type="text/css">
    .tag_list
    {
        background: none repeat scroll 0 0 #FFFFFF;
        border: 1px solid #D7CBC1;
        color: #000000;
        font-size: 12px;
        line-height: 20px;
        list-style: none outside none;
        margin: 10px 2% 0 1%;
        padding: 1px;
    }
    .tag_list h5
    {
        background: none repeat scroll 0 0 #E0DBD3;
        color: #47381C;
        font-size: 12px;
        height: 24px;
        line-height: 24px;
        padding: 0 5px;
        margin: 0;
    }
    .tag_list h5 a
    {
        color: #47381C;
    }
    .classify
    {
        margin: 10px 0;
        padding: 4px 12px 8px;
    }
    .classify a
    {
        margin-right: 20px;
        white-space: nowrap;
    }
</style>

<div id="pop_win" style="display:none ;position: absolute; z-index: 10000; border: 1px solid rgb(220, 220, 220); top: 222.5px; left: 630px; opacity: 1; background: none 0px 0px repeat scroll rgb(255, 255, 255);">
    
</div>
<div id="popup_mask"></div>
<style>
    #popup_mask
    {
        position: absolute;
        width: 100%;
        height: 100%;
        background: #000;
        z-index: 9999;
        left: 0px;
        top: 0px;
        opacity: 0.3;
        filter: alpha(opacity=30);
        display: none;
    }

</style>

<script type="text/javascript">
    $(function(){        
        
        setTimeout(function(){
            $(".comment_body:contains('回复')").each(function(index,item){
                var u=$(this).text().split(':')[0].toString().replace("回复","")
                var thisComment=$(this);
                if(u)
                {
                    $.getJSON("https://passport.csdn.net/get/nick?callback=?", {users: u}, function(a) {
                        if(a!=null&&a.data!=null&&a.data.length>0)
                        {
                            nick=a.data[0].n;
                            if(u!=nick)
                            {
                                thisComment.text(thisComment.text().replace(u,nick));  
                            }
                        }       
                    });  
                }
            });

},200);

setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },5000);

setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },10000);

setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },15000);
        
        setTimeout(function(){
            $("a img[src='http://js.tongji.linezing.com/stats.gif']").parent().css({"position":"absolute","left":"50%"});
        },300);
    });

function loginbox(){
        var $logpop=$("#pop_win");
        $logpop.html('<iframe src="https://passport.csdn.net/account/loginbox?service=http://static.blog.csdn.net/callback.htm" frameborder="0" height="600" width="400" scrolling="no"></iframe>');

$('#popup_mask').css({
            opacity: 0.5,
            width: $( document ).width() + 'px',
            height:  $( document ).height() + 'px'
        });
        $('#popup_mask').css("display","block");
 
        $logpop.css( {
            top: ($( window ).height() - $logpop.height())/ 2  + $( window
       ).scrollTop() + 'px',
            left:($( window ).width() - $logpop.width())/ 2
        } );
 
        setTimeout( function () {
            $logpop.show();
            $logpop.css( {
                opacity: 1
            } );
        }, 200 );
 
        $('#popup_mask').unbind("click");
        $('#popup_mask').bind("click", function(){
            $('#popup_mask').hide();
            var $clopop = $("#pop_win");
            $("#common_ask_div_sc").css("display","none");
            $clopop.css( {
                opacity: 0
            } );
            setTimeout( function () {
                $clopop.hide();
            }, 350 );
            return false;
        });
    }

var articletitle='Android事件分发机制完全解析,带你从源码的角度彻底理解(上)';

</script>

<div class="clear">
                        </div>
                    </div>                   
                
            </div>
                   
           <div id="side">
               
    <div class="side">
<div id="panel_Profile" class="panel">
<ul class="panel_head"><span>个人资料</span></ul>
<ul class="panel_body profile">
<div id="blog_userface">
    <a href="http://my.csdn.net/sinyu890807" target="_blank">
    <img src="http://avatar.csdn.net/8/B/B/1_sinyu890807.jpg" title="访问我的空间" style="max-width:90%">
    </a>
    <br>
    <span><a href="http://my.csdn.net/sinyu890807" class="user_name" target="_blank">guolin</a></span>
</div>
<div class="interact">

<a href="javascript:void(0);" class="attent" id="span_add_follow" title="[加关注]"></a>

<a href="javascript:void(0);" class="letter" title="[发私信]" οnclick="window.open('http://msg.csdn.net/letters/model?receiver=sinyu890807','_blank','height=350,width=700');_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_sixin'])"></a>  
</div>
<div id="blog_medal">
                       <div class="ico_expert" οnclick="javascript:location='http://blog.csdn.net/experts/rule.html'" title="CSDN认证专家" style="cursor:pointer;width:60px;height:60px;background:url('http://c.csdnimg.cn/jifen/images/xunzhang/xunzhang/bokezhuanjiamiddle.png') no-repeat"></div>
                <div id="bms_box">
                                            <a target="_blank">
                                                    <img src="http://c.csdnimg.cn/jifen/images/xunzhang/xunzhang/zhuanlandaren.png" οnmοuseοver="m_over_m(this,2)" οnmοuseοut="m_out_m()" alt="1">
                                            </a>
                                            <a target="_blank">
                                                    <img src="http://c.csdnimg.cn/jifen/images/xunzhang/xunzhang/bokezhixing.png" οnmοuseοver="m_over_m(this,6)" οnmοuseοut="m_out_m()" alt="1">
                                            </a>
               </div>
</div>
<ul id="blog_rank">
    <li>访问:<span>6740435次</span></li>
    <li>积分:<span>39523</span> </li>    
    <li>等级: <span style="position:relative;display:inline-block;z-index:1">
            <img src="http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/blog8.png" alt="" style="vertical-align: middle;" id="leveImg">
            <div id="smallTittle" style=" position: absolute;  left: -24px;  top: 25px;  text-align: center;  width: 101px;  height: 32px;  background-color: #fff;  line-height: 32px;  border: 2px #DDDDDD solid;  box-shadow: 0px 2px 2px rgba (0,0,0,0.1);  display: none;   z-index: 999;">
            <div style="left: 42%;  top: -8px;  position: absolute;  width: 0;  height: 0;  border-left: 10px solid transparent;  border-right: 10px solid transparent;  border-bottom: 8px solid #EAEAEA;"></div>
            积分:39523 </div>
        </span>  </li>
    <li>排名:<span>第93名</span></li>
</ul>
<ul id="blog_statistics">
    <li>原创:<span>98篇</span></li>
    <li>转载:<span>0篇</span></li>
    <li>译文:<span>6篇</span></li>
    <li>评论:<span>13204条</span></li>
</ul>
</ul>
</div>

<div id="custom_column_36348469" class="panel">
<ul class="panel_head"><span>我的新书</span></ul>
<ul class="panel_body">
<p>《第二行代码》已出版<br>新书基于Android 7.0系统全面升级<br>更加入了许多振奋人心的新技术<br>
<br>
</p><center><a href="http://blog.csdn.net/sinyu890807/article/details/52032038"><img src="https://img-blog.csdn.net/20161124140922633"></a></center>
<div style="width:130px; margin-left: auto; margin-right: auto; margin-top: 5px">
<center>
<p><a target="_blank" href="http://blog.csdn.net/sinyu890807/article/details/52032038">查看详情</a></p><p></p></center>
<br>
纸质书购买:
<center>
<p>
<a target="_blank" href="https://item.jd.com/12012505.html">京东</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a target="_blank" href="https://detail.tmall.com/item.htm?id=542237674970">天猫</a>
<br>
<a target="_blank" href="http://product.dangdang.com/24144166.html">当当</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a target="_blank" href="https://www.amazon.cn/dp/B01MSR5D04">亚马逊</a>
</p>
</center>

<br>
电子书购买:
<center>
<p>
<a target="_blank" href="http://www.ituring.com.cn/book/1841">PDF</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a target="_blank" href="https://www.amazon.cn/dp/B072FCNT11">Kindle</a>
<br>
<a target="_blank" href="https://read.douban.com/ebook/35604638">豆瓣版</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a target="_blank" href="http://www.duokan.com/book/142526">多看版</a>
</p>
</center>
</div>
</ul>
</div>

<div id="custom_column_22765363" class="panel">
<ul class="panel_head"><span>微信公众号推荐</span></ul>
<ul class="panel_body">
<p>关注我的技术公众号,每天都有优质技术文章推送。</p>
<p></p><center><img style="width:200px; height:200px" src="https://img-blog.csdn.net/20160507110203928"></center><p></p>

<p>关注我的娱乐公众号,工作、学习累了的时候放松一下自己。</p>
<p></p><center><img style="width:200px; height:200px" src="https://img-blog.csdn.net/20161011100137978"></center><p></p>

<p></p><center><b>微信扫一扫上方二维码即可关注</b></center><p></p>
</ul>
</div>

<div id="custom_column_26685579" class="panel">
<ul class="panel_head"><span>共同进步</span></ul>
<ul class="panel_body">
<span style="display:block;">感兴趣的朋友可以加入我的QQ群,一起讨论学习,共同进步。</span><br>
<span style="display:block;"><font color="#f00">群号:256344794</font></span><br>
<span style="display:none;">人数有限,请不要重复加群</span>
<span style="display:none;"><font color="#f9920d">(即满)</font></span>
</ul>
</div><div id="panel_Category" class="panel">
    <ul class="panel_head"><span>博客专栏</span></ul>
    <ul class="panel_body" id="sp_column">
    <table cellpadding="0" cellspacing="0"><tbody><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/15318.html" target="_blank"><img src="https://img-blog.csdn.net/20170420143210632" style="width:75px;height:75px;"></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/15318.html" target="_blank">Glide最全解析</a>
    <p>文章:4篇</p>
    <span>阅读:83953</span>
    </td>
    </tr></tbody></table>
    <table cellpadding="0" cellspacing="0"><tbody><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/android-database-pro.html" target="_blank"><img src="https://img-blog.csdn.net/20151123180007942" style="width:75px;height:75px;"></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/android-database-pro.html" target="_blank">Android数据库高手秘籍</a>
    <p>文章:9篇</p>
    <span>阅读:473683</span>
    </td>
    </tr></tbody></table>
    </ul>
</div>

<div id="custom_column_37398049" class="panel">
<ul class="panel_head"><span>友情链接</span></ul>
<ul class="panel_body">
<a target="_blank" href="http://blog.csdn.net/lmj623565791">鸿洋的博客</a>
<br><br>
<a target="_blank" href="http://blog.csdn.net/xiaanming">夏安明的博客</a>
<br><br>
<a target="_blank" href="http://stormzhang.com/">stormzhang的博客</a>
<br><br>
<a target="_blank" href="http://www.jikedaohang.com/">极客导航</a>
</ul>
</div><div id="panel_Category" class="panel">
<ul class="panel_head"><span>文章分类</span></ul>
<ul class="panel_body">    
                 <li>
                    <a href="/sinyu890807/article/category/1369150" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Android精华教程</a><span>(21)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/1399638" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Android疑难解析</a><span>(40)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/2400923" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Android第一行代码</a><span>(4)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/2522725" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Android数据库高手秘籍</a><span>(7)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/1381137" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Java设计模式透析</a><span>(5)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/1380837" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Ruby设计模式透析</a><span>(5)</span>
                </li>
                 <li>
                    <a href="/sinyu890807/article/category/1807611" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">随笔</a><span>(7)</span>
                </li>
</ul>
</div><div id="panel_Archive" class="panel">
<ul class="panel_head"><span>文章存档</span></ul>
<ul class="panel_body">
<div id="archive_list"><li><a href="/sinyu890807/article/month/2017/06">2017年06月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2017/05">2017年05月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2017/04">2017年04月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2017/03">2017年03月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2017/02">2017年02月</a><span>(1)</span></li><span class="hidelist" style="display:none;"><li><a href="/sinyu890807/article/month/2016/12">2016年12月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2016/11">2016年11月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/10">2016年10月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/08">2016年08月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/07">2016年07月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/06">2016年06月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2016/05">2016年05月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/04">2016年04月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/03">2016年03月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2016/02">2016年02月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2016/01">2016年01月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/12">2015年12月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2015/11">2015年11月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/10">2015年10月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/08">2015年08月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/07">2015年07月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/06">2015年06月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/05">2015年05月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/04">2015年04月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2015/03">2015年03月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2015/02">2015年02月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2014/12">2014年12月</a><span>(3)</span></li><li><a href="/sinyu890807/article/month/2014/11">2014年11月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2014/10">2014年10月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2014/09">2014年09月</a><span>(5)</span></li><li><a href="/sinyu890807/article/month/2014/08">2014年08月</a><span>(3)</span></li><li><a href="/sinyu890807/article/month/2014/07">2014年07月</a><span>(3)</span></li><li><a href="/sinyu890807/article/month/2014/06">2014年06月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2014/05">2014年05月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2014/04">2014年04月</a><span>(3)</span></li><li><a href="/sinyu890807/article/month/2014/03">2014年03月</a><span>(1)</span></li><li><a href="/sinyu890807/article/month/2014/01">2014年01月</a><span>(2)</span></li><li><a href="/sinyu890807/article/month/2013/12">2013年12月</a><span>(5)</span></li><li><a href="/sinyu890807/article/month/2013/11">2013年11月</a><span>(4)</span></li><li><a href="/sinyu890807/article/month/2013/10">2013年10月</a><span>(4)</span></li><li><a href="/sinyu890807/article/month/2013/09">2013年09月</a><span>(4)</span></li><li><a href="/sinyu890807/article/month/2013/08">2013年08月</a><span>(4)</span></li><li><a href="/sinyu890807/article/month/2013/07">2013年07月</a><span>(5)</span></li><li><a href="/sinyu890807/article/month/2013/06">2013年06月</a><span>(5)</span></li><li><a href="/sinyu890807/article/month/2013/05">2013年05月</a><span>(5)</span></li><li><a href="/sinyu890807/article/month/2013/04">2013年04月</a><span>(6)</span></li><li><a href="/sinyu890807/article/month/2013/03">2013年03月</a><span>(4)</span></li></span><div id="archive_list_button" class="list_closed">展开</div></div>
</ul>
</div>
<div id="hotarticls" class="panel tracking-ad" data-mod="popu_340">
<ul class="panel_head">
    <span>       
阅读排行    </span>
</ul>

<ul class="panel_body itemlist">
<li>
<a href="/guolin_blog/article/details/9097463" title="Android事件分发机制完全解析,带你从源码的角度彻底理解(上)" target="_blank">Android事件分发机制完全解析,带你从源码的角度彻底理解(上)</a><span>(283455)</span>
</li>
<li>
<a href="/guolin_blog/article/details/17482095" title="Android Volley完全解析(一),初识Volley的基本用法" target="_blank">Android Volley完全解析(一),初识Volley的基本用法</a><span>(257688)</span>
</li>
<li>
<a href="/guolin_blog/article/details/8881711" title="Android Fragment完全解析,关于碎片你所需知道的一切" target="_blank">Android Fragment完全解析,关于碎片你所需知道的一切</a><span>(249592)</span>
</li>
<li>
<a href="/guolin_blog/article/details/12921889" title="Android LayoutInflater原理分析,带你一步步深入了解View(一)" target="_blank">Android LayoutInflater原理分析,带你一步步深入了解View(一)</a><span>(216329)</span>
</li>
<li>
<a href="/guolin_blog/article/details/11952435" title="Android Service完全解析,关于服务你所需知道的一切(上)" target="_blank">Android Service完全解析,关于服务你所需知道的一切(上)</a><span>(181879)</span>
</li>
<li>
<a href="/guolin_blog/article/details/16330267" title="Android视图绘制流程完全解析,带你一步步深入了解View(二)" target="_blank">Android视图绘制流程完全解析,带你一步步深入了解View(二)</a><span>(162487)</span>
</li>
<li>
<a href="/guolin_blog/article/details/9316683" title="Android高效加载大图、多图解决方案,有效避免程序OOM" target="_blank">Android高效加载大图、多图解决方案,有效避免程序OOM</a><span>(162223)</span>
</li>
<li>
<a href="/guolin_blog/article/details/18234477" title="Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)" target="_blank">Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)</a><span>(161669)</span>
</li>
<li>
<a href="/guolin_blog/article/details/17482165" title="Android Volley完全解析(二),使用Volley加载网络图片" target="_blank">Android Volley完全解析(二),使用Volley加载网络图片</a><span>(133528)</span>
</li>
<li>
<a href="/guolin_blog/article/details/13171191" title="Android Fragment应用实战,使用碎片向ActivityGroup说再见" target="_blank">Android Fragment应用实战,使用碎片向ActivityGroup说再见</a><span>(122397)</span>
</li>
</ul>
</div>
<div id="hotarticls2" class="panel tracking-ad" data-mod="popu_341">
<ul class="panel_head"><span>评论排行</span></ul>
<ul class="panel_body itemlist">
<li>
<a href="/guolin_blog/article/details/26365913" title="历时一年,我的著作《第一行代码——Android》已出版!" target="_blank">历时一年,我的著作《第一行代码——Android》已出版!</a><span>(721)</span>
</li>
<li>
<a href="/guolin_blog/article/details/52032038" title="历久而新,我的新书《第二行代码》已出版!" target="_blank">历久而新,我的新书《第二行代码》已出版!</a><span>(557)</span>
</li>
<li>
<a href="/guolin_blog/article/details/12921889" title="Android LayoutInflater原理分析,带你一步步深入了解View(一)" target="_blank">Android LayoutInflater原理分析,带你一步步深入了解View(一)</a><span>(343)</span>
</li>
<li>
<a href="/guolin_blog/article/details/34093441" title="Android照片墙完整版,完美结合LruCache和DiskLruCache" target="_blank">Android照片墙完整版,完美结合LruCache和DiskLruCache</a><span>(314)</span>
</li>
<li>
<a href="/guolin_blog/article/details/9097463" title="Android事件分发机制完全解析,带你从源码的角度彻底理解(上)" target="_blank">Android事件分发机制完全解析,带你从源码的角度彻底理解(上)</a><span>(305)</span>
</li>
<li>
<a href="/guolin_blog/article/details/9255575" title="Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能" target="_blank">Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能</a><span>(270)</span>
</li>
<li>
<a href="/guolin_blog/article/details/9671609" title="Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效" target="_blank">Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效</a><span>(266)</span>
</li>
<li>
<a href="/guolin_blog/article/details/38556989" title="Android数据库高手秘籍(二)——创建表和LitePal的基本用法" target="_blank">Android数据库高手秘籍(二)——创建表和LitePal的基本用法</a><span>(266)</span>
</li>
<li>
<a href="/guolin_blog/article/details/49805231" title="2015年终总结,忙碌和无所事事的一年" target="_blank">2015年终总结,忙碌和无所事事的一年</a><span>(253)</span>
</li>
<li>
<a href="/guolin_blog/article/details/13171191" title="Android Fragment应用实战,使用碎片向ActivityGroup说再见" target="_blank">Android Fragment应用实战,使用碎片向ActivityGroup说再见</a><span>(252)</span>
</li>
</ul>
</div>
<div id="newcomments" class="panel">
<ul class="panel_head"><span>最新评论</span></ul>
<ul class="panel_body itemlist">
    <li>
   
         <a href="/guolin_blog/article/details/9097463#comments">Android事件分发机制完全解析,带你从源码的角度彻底理解(上)</a>
    <p style="margin:0px;"><a href="/Wen_Z4" class="user_name">Wen_Z4</a>:
@briansxuan:可以先这样认为,控件的clickable(可点击)和enable(可用)是两...
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/53759439#comments">Android图片加载框架最全解析(一),Glide的基本用法</a>
    <p style="margin:0px;"><a href="/sf869345918" class="user_name">sf869345918</a>:
@Yang_yun_258:    Glide.with(this)                ...
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/70215985#comments">Android图片加载框架最全解析(四),玩转Glide的回调与监听</a>
    <p style="margin:0px;"><a href="/zhangyupeng_hehe" class="user_name">PP88</a>:
现在最新版的app QQ登录,背景那个gif图用的应该就是这个技术吧
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/52032038#comments">历久而新,我的新书《第二行代码》已出版!</a>
    <p style="margin:0px;"><a href="/chengxi1014" class="user_name">小曦曦大神</a>:
郭老师 我还有一个问题 在第十二章的最后一小节中 在设置recyclerView点击事件之前 Fru...
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/52032038#comments">历久而新,我的新书《第二行代码》已出版!</a>
    <p style="margin:0px;"><a href="/chengxi1014" class="user_name">小曦曦大神</a>:
郭老师 我还有一个问题 在第十二章的最后一小节中 在设置recyclerView点击事件之前 Fru...
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/39207945#comments">Android数据库高手秘籍(四)——使用LitePal建立表关联</a>
    <p style="margin:0px;"><a href="/wjb820728252" class="user_name">氵青-风</a>:
@myzqsql:你好,我也遇到了同样的问题,请问你能详细描述一下在哪里加true吗?
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/28863651#comments">Android DiskLruCache完全解析,硬盘缓存的最佳方案</a>
    <p style="margin:0px;"><a href="/a742340082" class="user_name">坚持不放弃</a>:
就是用呀
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/9153747#comments">Android事件分发机制完全解析,带你从源码的角度彻底理解(下)</a>
    <p style="margin:0px;"><a href="/qq_22194581" class="user_name">qq_22194581</a>:
@qq_32405269:由于在Action_Down事件中你在子View的dispatchTouc...
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/9153747#comments">Android事件分发机制完全解析,带你从源码的角度彻底理解(下)</a>
    <p style="margin:0px;"><a href="/qq_22194581" class="user_name">qq_22194581</a>:
恩 自己看了遍源码,终于把触摸事件搞明白了
    </p>
    </li>
    <li>
   
         <a href="/guolin_blog/article/details/53122387#comments">Android新特性介绍,ConstraintLayout完全解析</a>
    <p style="margin:0px;"><a href="/qq_14932027" class="user_name">土拨鼠挖地瓜</a>:
可以直接设置控件宽度百分比吗?就像百分比布局那样
    </p>
    </li>
</ul>
</div>
<div class="panel" id="panel_Search">
    <ul class="panel_head"><span>文章搜索</span></ul>
    <ul class="panel_body">
        <form id="frmSearch" action="http://so.csdn.net/search" class="form_search csdn-tracking-statistics" target="_blank" data-mod="popu_306">
        <span><input id="inputSearch" type="text" class="blogsearch" title="请输入关键字"></span>
        <input id="btnSubmit" type="button" value="搜索" title="search in blog">
        <input type="hidden" name="q" id="inputQ">
        <input type="hidden" name="t" value="blog">
        <a id="btnSearchBlog" target="_blank"></a>
        </form>
    </ul>
</div>

<script type="text/javascript">

$(function () {
        $("#btnSubmit").unbind("click");
        $("#btnSubmit").click(function () {           
            search();
        });

$("#frmSearch").submit(function () {           
            search();
            return false;
        });

function search()
        {
            if ($("#inputSearch").val() == "") {               
                alert("请录入搜索关键词!");                         
                return false;
            }
            //var url = "http://so.csdn.net/so/search/s.do?q=" + encodeURIComponent($("#inputSearch").val()) + "&u=" + username + "&t=blog";           
            var url = "https://www.baidu.com/s?wd=" + encodeURIComponent($("#inputSearch").val()) + "%20site%3Ablog.csdn.net"
            window.location.href = url;
        }   
    });
</script>

<div id="custom_column_37394313" class="panel">
<ul class="panel_head"><span>统计</span></ul>
<ul class="panel_body">
<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1601636'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s95.cnzz.com/stat.php%3Fid%3D1601636' type='text/javascript'%3E%3C/script%3E"));</script><span id="cnzz_stat_icon_1601636"><a href="http://www.cnzz.com/stat/website.php?web_id=1601636" target="_blank" title="站长统计">站长统计</a></span><script src=" http://s95.cnzz.com/stat.php?id=1601636" type="text/javascript"></script><script src="http://c.cnzz.com/core.php?web_id=1601636&amp;t=z" charset="utf-8" type="text/javascript"></script>
</ul>
</div>    </div>
    <div class="clear">
    </div>

</div>

<div class="clear">
            </div>
        </div>

<script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script>
<script type="text/javascript">
    $(function () {
        function __get_code_toolbar(snippet_id) {
            return $("<span class='tracking-ad' data-mod='popu_167'><a href='https://code.csdn.net/snippets/"
                    + snippet_id
                    + "' target='_blank' title='在CODE上查看代码片'  style='text-indent:0;'><img src='https://code.csdn.net/assets/CODE_ico.png' width=12 height=12 alt='在CODE上查看代码片' style='position:relative;top:1px;left:2px;'/></a></span>"
                    + "<span class='tracking-ad' data-mod='popu_170'><a href='https://code.csdn.net/snippets/"
                    + snippet_id
                    + "/fork' target='_blank' title='派生到我的代码片' style='text-indent:0;'><img src='https://code.csdn.net/assets/ico_fork.svg' width=12 height=12 alt='派生到我的代码片' style='position:relative;top:2px;left:2px;'/></a></span>");
        }
        
        $("[code_snippet_id]").each(function () {
            __s_id = $(this).attr("code_snippet_id");
            if (__s_id != null && __s_id != "" && __s_id != 0 && parseInt(__s_id) > 70020) {
                __code_tool = __get_code_toolbar(__s_id);
                $(this).prev().find(".tools").append(__code_tool);
            }
        });

$(".bar").show();
    });
</script>

</div>

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)相关推荐

  1. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  2. [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解

    我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...

  3. Android异步消息处理机制完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9991569 之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久 ...

  4. [学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解

    开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一 ...

  5. Android ListView工作原理完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是List ...

  6. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  7. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  8. Android 事件分发机制

    Android 事件分发机制  demo验证:  https://blog.csdn.net/hty1053240123/article/details/77866302 目录 1.基础认知 2.事件 ...

  9. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

最新文章

  1. 服务器安全性文档,Microsoft Web服务器的安全性
  2. CM12同步源码及编译教程
  3. python基础:细节问题梳理
  4. SQL2005 express升级到2008企业版解决4096限制问题
  5. Elasticsearch拼音和ik分词器的结合应用
  6. 三星副会长李在镕启程赴美
  7. 滴滴顺风车上线新功能,特殊时期便捷出行
  8. 使用WebDeployment Project改善VS2005发布网站问题 [系列导读]
  9. 小程序 背景图 repeat_简单可爱的微信聊天背景图片
  10. 20.HTTP-NG
  11. 使用 Docker Machine 添加机器记录
  12. AWVS13安装教程
  13. 计算机视觉资料大合集
  14. 【颜纠日记】PS批量裁剪不同图片-告别重复性操作
  15. 功率谱估值方法matlab仿真——2、经典估值方法介绍
  16. 电脑参数,台式电脑怎么查看配置参数|如何查询台式机硬件配置
  17. 计算机网络ping所有用法,电脑Ping命令的使用大全
  18. 2 HTML常用标签标签嵌套和并列关系
  19. 【轻博客观察之二】十问Tumblr
  20. 客户说:在忙,回头联系你。如何话术应对呢?

热门文章

  1. “星际穿越”观后感(宇宙只是界面,科技永远触摸不到世界的本原)
  2. tps 与 事务平均响应时间关系对答(转)
  3. 内网穿透轻松突破内网服务器并远程控制
  4. py基础教程学习(1)
  5. 跨越汽车智能化鸿沟,平台级领导者Apollo的解法
  6. Matlab 错误使用 plot 矢量长度必须相同
  7. Smartbi Insight 与Smartbi Eagle的区别
  8. UEditor练习(JSP版)20190603
  9. 哪种蓝牙耳机佩戴最舒适?佩戴最舒适的半入耳式蓝牙耳机推荐
  10. 开源作者突然去世,后面要怎么整?