[译]PC盛世已经终结
By 马冬亮(凝霜 Loki)
一个人的战争(http://blog.csdn.net/MDL13412)
原文:《The PC is Over》时间及能力有限,如有错误请谅解。
MG Siegler在博文中写到:
PC盛世已经终结。它将继续存在,但正加速成为遗迹。
现在我不愿意使用PC。而是更愿意在绝大多数时间使用平板电脑。并且渐渐地,我可以做到。我想在所有的剩余时间使用智能手机,并且已经这么做了。
桌面web的价值更多的时候只是一种错觉,移动设备的速度正在改善,并且正在迎头赶上。
不要在你原有网站基础上构建一个app。构建一个app,就像你的网站从来没有存在过一样。为从来没有用过桌面电脑的用户构建一个app,因为很快他们就将到来。
考虑到MG Siegler是一个记者,并且是一个科技博客air-quotes的记者,所以他很擅长夸大事实。你可能会说他比一般的博主擅长夸张十亿倍。以他自己的方式,他是一个创造者,我认为:它创造了天花乱坠的广告:)
但他并没有完全错误。
我注意到我自己的计算机使用习惯有着相同的模式。就像我在The Last PC Laptop中写道的,传统的笔记本已经越来越难以成为适合所有情形的最佳选择——即使是一个现代的、超薄的、高级的笔记本。
从另一方面来看,桌面PC无可厚非。比如,你想要三个显示器,8核心CPU,64GB内存和多GPU的硬件配置。如果你需要变态的性能,那桌面计算机刚好能满足你。并且它可能比你想要的便宜,因为桌面计算机是用通用配件制造的(译注:传说中的兼容机)。它同样比笔记本更有乐趣,因为改装的强烈意愿,再加上对动力的渴望,就是“改装的高速汽车”的本质。
并且它棒极了:)
但是即使作为一个PC发烧友,我发现最近几年我开始丧失升级更快的多核心CPU、更精细的GPU、更高的带宽以及更多GB内存的兴趣。除了固态硬盘给我们提供了急需的几个数量级的读写速度提升外,你最后一次感觉需要升级台式机或者笔记本是什么时候?如果我使用了一个SSD硬盘,你真的可以分辨出一台2009年的高端非游戏用计算机与现在计算机的区别吗?(译注:非游戏计算机主要是去掉了对显卡的依赖)
我不确定我可以。
想象一个汽车发烧友,在看到大街上充斥的Chrysler K-Cars和Plymouth minivans,而其引擎盖下的装置只比他两年前自己定制的宝贝装置有些许提升,他会有多失望。
我想我们正经历着,从计算性能角度满足普通用户需求的阶段。我想说双核心CPU成为主流大约是在2008年左右。当你拥有除了发烧友、视频编辑人员和程序员以外,其他用户曾经需要的所有计算性能时,你会做什么?一旦你拥有了“足够的”计算能力,对于“足够”没有绝对的标准,计算机的过去和未来都始终向着更小、更廉价发展。这并不是什么新趋势,MG Siegler只是从记者的角度向我们诠释。
我们已经见证了从占据一整座建筑的大型机,到占据一个房间的小型机,再到只占用桌面大小的微型计算机这一历程。现在我们已经做好准备迎接下一个阶段:计算机不再仅适合放在你的膝盖上,它们可以握在手里。这场游戏的名字不再是让计算机变得更强大,而是从根本上,在不损失太多性能的前提下,减小其尺寸与功耗。
我提到性能对台式机和笔记本是多么的毫无新意。这太无聊了,以至于我不愿意去关注硬件基准测试。让我们假设没有SSD硬盘,从2008年以来台式机和笔记本都在最良好的经济形式下发展,现在我们将其与iPhone自2008年以来惊人的性能提升做对比:
假使图表没有表述的很清楚,在iPhone过去的四年发展历程中,我们看到了其在Browsermark跑分中有20倍的提升,在GeekBench跑分中有4倍的提升(译注:我怎么感觉图中是8倍的关系?!)。在智能手机的世界里,性能——最坏情况下——几乎每年翻一番。
具有讽刺意义的是,这些结果刊登在PC Magazine上面。我想提醒你注意刚才说到的杂志中的两个字母,第一个是Pee,第二个是Cee。是的,PC Magazine现在正刊登各种让发烧友流口水的智能手机评测。这和PC有什么关系?恩,它实际上智能手机已经能做PC可以做的任何事了。
我有一台iPhone 5,并且我可以以亲身经历证明它比我刚换代下来的iPhone 4要快的多的非常多(译注:原文crazy faster
than)。一旦你加入了4G网络和5 GHz的Wifi支持,它太快了——除了显示屏有明显的大小限制外,我发现我并不那么在意我是否在访问一个“手机版”网站。我发现其在显示质量上的提升甚至要比速度更明显。AnandTech网站说,如果iPhone 5作为一个台式机显示器的话,它将是他们测试过的最好的一款。我们的手机现在太TMD(译注:原文单词是damn,我觉得中文大概就是这个意思啦)快了,并且能胜任个人计算机工作,以至于我开始思考:为什么不插上一个键盘和显示器,把它当作“笔记本”使用,
所以MG Siegler也许是对的。PC盛世已经终结。。。至少我们知道在形势上是这样。我们再也不需要巨大声响的笔记本和台式机,就像我们不再需要占据一整座建筑物和一间房间的大型机和小型机一样。
Posted by Jeff Atwood
译者注:我个人对平板电脑非常推崇,除了编程以外的工作,用我的iPad都要比在我那装着Fedora 17的笔记本上舒服的多:)
4楼xcoldplay前天 11:52慢慢PC会成为一种专业的设备了。Re: MDL13412前天 11:53回复xcoldplayn现在已经向办公和开发的方向进展了,而且台式机很可能被笔记本取代。3楼lijiantao923前天 09:34有什么可比性?拿移动设备的优势来和台式机的略势来比?你怎么不在平板上编程,不在平板上写论文呢?2楼yehongxue8前天 00:58路过打酱油1楼lijiantao9233天前 13:58就算移动设备性能比台式好100倍,也是白搭。这根本不是性能问题,而是操作问题。Re: MDL134123天前 15:15回复lijiantao923n要喷你去喷原作者去,你喷我干什么,我只是翻译过来而已。Re: lijiantao9233天前 15:16回复MDL13412n这不叫喷啊。这叫讨论。Re: MDL134123天前 15:33回复lijiantao923n考虑到MG Siegler是一个记者,并且是一个科技博客air-quotes的记者,所以他很擅长夸大事实。你可能会说他比一般的博主擅长夸张十亿倍。以他自己的方式,他是一个创造者,我认为:它创造了天花乱坠的广告:)n作者还说了这个,杂志编辑的话,你懂的。Re: MDL13412前天 21:25回复lijiantao923n当你拥有除了发烧友、视频编辑人员和程序员以外,其他用户曾经需要的所有计算性能时,你会做什么?一旦你拥有了“足够的”计算能力,对于“足够”没有绝对的标准,计算机的过去和未来都始终向着更小、更廉价发展。这并不是什么新趋势,MG Siegler只是从记者的角度向我们诠释。n看这句话,工程人员和普通用户需求不同。办公需求又和日常需求不同,我个人现在除了写程序、博客,基本都是用iPad来搞,我们学校的女生几乎所有需求都可以用ipad来搞定。n对于不玩游戏,只看电影、聊天、发微博的“现代青年”,台式机真心不是好选择。Re: lijiantao923前天 23:24回复MDL13412n这点我不否认。这正是移动设备的优点。但是说n“PC盛世已经终结。它将继续存在,但正加速成为遗迹。”n却是夸张了。android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你就明白了。
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果
interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent
也返回 false 的话,这个事件就会“消失”, 而且接收不到下一次事件。(我说的一次事件指的是 down 到 up 之间的一系列事件)。Touchevent 中,返回值是 true ,则说明消耗掉了这个事件。
注:上半部分为父View,下半部分为子View;
(等待下一次事件是从down到up之间的事件)
完整的传递流程为:父View->子View->子View的子View->……->子View的子View->子View->父View。
如果整个流程中都没有处理掉这个事件,即所有处理的返回值均为false,则不会再传递下一次事件,因为他会认为你这次的事件阻塞了,没必要给下一次。 onTouchEvent如果不消耗的话,会从子view传递到父view。
下面是两个DEMO
DEMO1
主程序:
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class Test extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.test, menu); return true; } }
RootView继承自LinearLayout
package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * LinearLayout对dispatchTouchEvent没有任何修改 * * @author bxwu * */ public class RootView extends LinearLayout { private static final String TAG = "RootView"; public RootView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_CANCEL"); return false; } return false; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onTouchEvent-------->ACTION_CANCEL"); return false; } // RootView 不消耗任何动作 return false; } }
Call0继承自LinearLayout
package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; public class Cell0 extends LinearLayout { private static final String TAG = "Cell0"; public Cell0(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_CANCEL"); return false; } return false; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onTouchEvent-------->ACTION_CANCEL"); return false; } return true; } }
Call1继承自LinearLayout
package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; public class Cell1 extends LinearLayout { private static final String TAG = "Cell1"; public Cell1(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent-------->ACTION_CANCEL"); return false; } return false; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onTouchEvent-------->ACTION_DOWN"); return false; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onTouchEvent-------->ACTION_MOVE"); return false; case MotionEvent.ACTION_UP: Log.d(TAG, "onTouchEvent-------->ACTION_UP"); return false; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onTouchEvent-------->ACTION_CANCEL"); return false; } return true; } }
布局文件:
<com.example.test.RootView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="#000000" > <com.example.test.Cell0 android:layout_width="200dip" android:layout_height="300dip" android:gravity="center" android:background="#ff0000"> <com.example.test.Cell1 android:layout_width="100dip" android:layout_height="200dip" android:background="#00ff00"> </com.example.test.Cell1> </com.example.test.Cell0> </com.example.test.RootView>
由于没有覆写dispatchTouchEvent(MotionEvent ev) 方法,所以View的dispatchTouchEvent(MotionEvent ev) 返回值为false,即交予View的onInterceptTouchEvent(MotionEvent ev)处理。
情况一:onInterceptTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent ev)的返回值都为false
D/RootView(1381): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell0(1381): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell1(1381): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell1(1381): onTouchEvent-------->ACTION_DOWN
D/Cell0(1381): onTouchEvent-------->ACTION_DOWN
D/RootView(1381): onTouchEvent-------->ACTION_DOWN
情况二:Call1的onTouchEvent(MotionEvent ev)对应的ACTION_DOWN选项为true
D/RootView(1577): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell0(1577): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell1(1577): onInterceptTouchEvent-------->ACTION_DOWN
D/Cell1(1577): onTouchEvent-------->ACTION_DOWN
D/RootView(1577): onInterceptTouchEvent-------->ACTION_MOVE
D/Cell0(1577): onInterceptTouchEvent-------->ACTION_MOVE
D/Cell1(1577): onTouchEvent-------->ACTION_MOVE
D/RootView(1577): onInterceptTouchEvent-------->ACTION_MOVE
D/Cell0(1577): onInterceptTouchEvent-------->ACTION_MOVE
D/Cell1(1577): onTouchEvent-------->ACTION_MOVE
D/RootView(1577): onInterceptTouchEvent-------->ACTION_UP
D/Cell0(1577): onInterceptTouchEvent-------->ACTION_UP
D/Cell1(1577): onTouchEvent-------->ACTION_UP
第二个工程:
主程序:
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class Test extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.test, menu); return true; } }
MyLinearLayout程序:
package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; public class MyLinearLayout extends LinearLayout { private final String TAG = "MyLinearLayout"; public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); Log.d(TAG, TAG); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "dispatchTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL"); break; } return true; } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "---onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); break; } return true; } }
MyTextView程序:
package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.TextView; public class MyTextView extends TextView { private final String TAG = "MyTextView"; public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(ev); } public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL"); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "---onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); break; } return true; } }
布局文件
<com.example.test.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="#000000" > <com.example.test.MyTextView android:layout_width="200dip" android:layout_height="300dip" android:gravity="center" android:background="#ff0000"> </com.example.test.MyTextView> </com.example.test.MyLinearLayout>
为了指代方便,下面将MyLinearLayout简称为L,将MyTextView简称为T,L.onInterceptTouchEvent=true
表示的含义为MyLinearLayout中的onInterceptTouchEvent方法返回值为true,通过程序运行时输出的Log来说明调用时序。
第1种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=true
输出下面的Log:
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_DOWN
D/MyTextView(11865): dispatchTouchEvent action:ACTION_DOWN
D/MyTextView(11865): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_MOVE
D/MyTextView(11865): dispatchTouchEvent action:ACTION_MOVE
D/MyTextView(11865): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_UP
D/MyTextView(11865): dispatchTouchEvent action:ACTION_UP
D/MyTextView(11865): ---onTouchEvent action:ACTION_UP
结论:TouchEvent完全由TextView处理。
第2种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=false
输出下面的Log:
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): onInterceptTouchEvent action:ACTION_DOWN
D/MyTextView(13101): dispatchTouchEvent action:ACTION_DOWN
D/MyTextView(13101): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_UP
结论:TextView只处理了ACTION_DOWN事件,LinearLayout处理了所有的TouchEvent。
第3种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=true
输出下面的Log:
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): onInterceptTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_UP
结论:LinearLayout处理了所有的TouchEvent。
第4种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=false
输出下面的Log:
D/MyLinearLayout(13452): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13452): onInterceptTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13452): ---onTouchEvent action:ACTION_DOWN
结论:LinearLayout只处理了ACTION_DOWN事件,那么其他的TouchEvent被谁处理了呢?答案是LinearLayout最外层的Activity处理了TouchEvent。
工程文件1:http://download.csdn.net/detail/zhaoshiqing7/4614307
工程文件2:http://download.csdn.net/detail/zhaoshiqing7/4614690
百度董事长兼CEO李彦宏、阿里巴巴集团主席马云、腾讯董事长马化腾三大中国互联网巨头昨日在深圳IT领袖峰会上进行了一场巅峰对话。在谈及自己的梦想时,李彦宏坦言,虽然自己非常向往闲云野鹤的生活,但处于当前的时代机遇,自己最大的梦想,是在中国做出一家全球有影响力的企业,并一直在为之努力。
目前,中国的GDP已经跃居全球第二,而中国的互联网用户数更是已经超过美国跃升为全球第一。“全球这么大的一个经济体,没有一个在全球有影响力的企业,是非常说不过去的。”李彦宏指出,站在这样的时代机遇点,面对高速发展的中国经济和如此巨大的互联网市场。
“我们这一代人可以做得更好,可以让中国更受国际尊重,更有国际影响力,让大家看到中国也能拥有优秀企业,让大家知道,中国的企业也能与国际大企业一争高下。”李彦宏说道。
李彦宏笑称,尽管自己一向崇尚云野鹤的生活,但身处这样的时代节点,“发现很多东西能够做,但还没有来得及做”,因此,还是将事业放在前面,“先实现事业的梦想,再实现生活的梦想、家庭的梦想。”