編輯:關於Android編程
上一篇,我們從源碼的角度分析了View的事件分發過程,這篇我們從實例的角度來看看不同實例下具體的輸出會是什麼樣子的呢?好的,我們開始吧!
同樣我們的測試布局文件:
也即我們的測試布局是醬紫的:
注意直接運行測試代碼的效果我在上一篇博客中已經貼出來了,這一篇將不再涉及;
測試1:(僅僅將MyButton的onTouch方法的返回值修改為true)
也就是修改MyButton的setOnTouchListener參數的onTouch方法返回值;
長按MyButton按鈕查看Logcat輸出:
07-01 02:19:16.867: I/System.out(776): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 02:19:16.870: I/System.out(776): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 02:19:16.870: I/System.out(776): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 02:19:16.870: I/System.out(776): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 02:19:16.870: I/System.out(776): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 02:19:16.880: I/System.out(776): MyButton--->onTouch--->DOWN 07-01 02:19:16.880: I/System.out(776): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 02:19:16.880: I/System.out(776): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 02:19:16.880: I/System.out(776): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 02:19:16.963: I/System.out(776): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 02:19:16.963: I/System.out(776): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 02:19:16.963: I/System.out(776): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 02:19:16.963: I/System.out(776): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 02:19:16.963: I/System.out(776): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 02:19:16.963: I/System.out(776): MyButton--->onTouch--->UP 07-01 02:19:16.970: I/System.out(776): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 02:19:16.970: I/System.out(776): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 02:19:16.970: I/System.out(776): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true
可以看到Log輸出的第5行執行MyButton的dispatchTouchEvent之後,首先執行的是onTouch方法,因為我們在onTouch方法中返回了true,那麼根據View事件分發源碼分析知道dispatchTouchEvent將直接返回true,也就看到了onTouch之後直接輸出的是第7行MyButton的dispatchTouchEvenet返回值,因為連onTouchEvent方法都沒有執行,那麼在onTouchEvent中的檢測是否要執行onLongClick以及onClick也就不會執行了,隨後的MOVE以及UP事件執行過程和DOWN事件一致,從這點看出來onTouch方法優先於onTouchEvent執行;
測試2:(僅僅將MyButton的onLongClick方法返回值設置為true)
也即僅僅修改MyButton的setOnLongClick參數的onLongClick返回值為true
長按MyButton按鈕,查看Logcat輸出:
07-01 04:42:08.118: I/System.out(1055): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 04:42:08.120: I/System.out(1055): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 04:42:08.120: I/System.out(1055): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 04:42:08.120: I/System.out(1055): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 04:42:08.120: I/System.out(1055): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 04:42:08.120: I/System.out(1055): MyButton--->onTouch--->DOWN 07-01 04:42:08.120: I/System.out(1055): MyButton--->onTouchEvent--->ACTION_DOWN 07-01 04:42:08.120: I/System.out(1055): MyButton--->onTouchEvent--->ACTION_DOWN--->true 07-01 04:42:08.120: I/System.out(1055): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 04:42:08.120: I/System.out(1055): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 04:42:08.120: I/System.out(1055): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 04:42:08.653: I/System.out(1055): MyButton--->onLongClick 07-01 04:42:08.950: I/System.out(1055): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 04:42:08.950: I/System.out(1055): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 04:42:08.950: I/System.out(1055): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 04:42:08.950: I/System.out(1055): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 04:42:08.950: I/System.out(1055): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 04:42:08.960: I/System.out(1055): MyButton--->onTouch--->UP 07-01 04:42:08.960: I/System.out(1055): MyButton--->onTouchEvent--->ACTION_UP 07-01 04:42:08.960: I/System.out(1055): MyButton--->onTouchEvent--->ACTION_UP--->true 07-01 04:42:08.960: I/System.out(1055): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 04:42:08.960: I/System.out(1055): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 04:42:08.970: I/System.out(1055): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true前6行的輸出和測試1是一樣的,從第7行開始執行的是MyButton的onTouchEvent方法,原因就是我們在onTouch中返回的是false,接著你在第12行看到調用了onLongClick方法,在上一篇博客已經解釋了為什麼onLongClick會在第9行MyButton的dispatchTouchEvent返回後執行,原因就是因為onLongClick方法是在子線程中執行的,什麼時間執行不是確定的,但可以保證肯定是在onClick方法前執行的,如果你多次進行測試2的測試,你會發現onLonClick方法與MOVE事件的執行順序是不確定的,從上面的Log輸出中我們同樣沒看到onClick的輸出,原因在於我們在onLongClick方法中返回了true,這也就說明一點onLongClick優先於onClick執行;
測試3:(假設我們僅僅讓MyButton的onTouch方法在DOWN的情況下返回false,剩余情況下返回true,這個測試主要是為了驗證onLongClick是在DOWN事件下進行監聽的)
也就是我把MyButton的Touch事件監聽器修改成下面這樣子:
myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { boolean result = false; switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("MyButton--->onTouch--->DOWN"); result = false; break; case MotionEvent.ACTION_MOVE: System.out.println("MyButton--->onTouch--->MOVE"); result = true; break; case MotionEvent.ACTION_UP: System.out.println("MyButton--->onTouch--->UP"); result = true; break; default: break; } return result; } });長按MyButton,查看Logcat,你會看到下面輸出:
07-01 05:04:35.920: I/System.out(1239): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:04:35.920: I/System.out(1239): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:04:35.920: I/System.out(1239): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 05:04:35.920: I/System.out(1239): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 05:04:35.920: I/System.out(1239): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:04:35.920: I/System.out(1239): MyButton--->onTouch--->DOWN 07-01 05:04:35.920: I/System.out(1239): MyButton--->onTouchEvent--->ACTION_DOWN 07-01 05:04:35.930: I/System.out(1239): MyButton--->onTouchEvent--->ACTION_DOWN--->true 07-01 05:04:35.941: I/System.out(1239): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:04:35.941: I/System.out(1239): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:04:35.941: I/System.out(1239): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:04:36.445: I/System.out(1239): MyButton--->onLongClick 07-01 05:04:36.991: I/System.out(1239): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 05:04:36.991: I/System.out(1239): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 05:04:36.991: I/System.out(1239): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 05:04:37.000: I/System.out(1239): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 05:04:37.000: I/System.out(1239): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 05:04:37.000: I/System.out(1239): MyButton--->onTouch--->UP 07-01 05:04:37.000: I/System.out(1239): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:04:37.000: I/System.out(1239): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:04:37.000: I/System.out(1239): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true輸出中你會發現第7行在DOWN事件情況下執行了MyButton的onTouchEvent方法,因為我們在DOWN情況下設置了onTouch返回值是false,隨後你看到了onLongClick的輸出,但是在輸出中你不會看到在MOVE和UP情況下執行onTouchEvent方法,因為這兩種情況下onTouch方法的返回值是true,從這個測試例子你會知道onLongClick的執行時機在DOWN的時候就開始了,至於你是在MOVE和UP之前或者之後執行這個不確定,但是肯定是在UP之後調用onClick之前執行的;
測試4:(僅僅讓MyButton的onTouch方法在UP的情況下返回false,剩余情況下返回true,這個測試主要是為了驗證onClick的執行不僅僅是只有UP事件就可以的,他還需要在DOWN事件)
也就是我把MyButton的Touch事件監聽器修改成下面這樣子:
myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { boolean result = false; switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("MyButton--->onTouch--->DOWN"); result = true; break; case MotionEvent.ACTION_MOVE: System.out.println("MyButton--->onTouch--->MOVE"); result = true; break; case MotionEvent.ACTION_UP: System.out.println("MyButton--->onTouch--->UP"); result = false; break; default: break; } return result; } });長按MyButton,你會看到下面輸出:
07-01 05:20:37.160: I/System.out(1398): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:20:37.160: I/System.out(1398): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:20:37.160: I/System.out(1398): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 05:20:37.160: I/System.out(1398): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 05:20:37.160: I/System.out(1398): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:20:37.160: I/System.out(1398): MyButton--->onTouch--->DOWN 07-01 05:20:37.160: I/System.out(1398): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:20:37.160: I/System.out(1398): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:20:37.160: I/System.out(1398): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:20:38.610: I/System.out(1398): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 05:20:38.610: I/System.out(1398): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 05:20:38.610: I/System.out(1398): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 05:20:38.610: I/System.out(1398): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 05:20:38.610: I/System.out(1398): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 05:20:38.610: I/System.out(1398): MyButton--->onTouch--->UP 07-01 05:20:38.620: I/System.out(1398): MyButton--->onTouchEvent--->ACTION_UP 07-01 05:20:38.620: I/System.out(1398): MyButton--->onTouchEvent--->ACTION_UP--->true 07-01 05:20:38.630: I/System.out(1398): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:20:38.630: I/System.out(1398): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:20:38.630: I/System.out(1398): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true無論你怎麼按按鈕都不再會出現onLongClick以及onClick輸出的,原因在於我們是在MyButton的onTouchEvent的DOWN事件中監聽longclick以及click的,但是只有longclick會在DOWN事件之後有權利執行他的onLongClick方法,click執行他的onClick方法只能是在UP事件之後才能開始的,我們MyButton的onTouch方法在DOWN事件情況下返回了true,那麼這種情況下連onTouchEvent都不會執行,就別說是監聽longclick以及click了;同樣MOVE情況下也不會執行MyButton的onTouchEvent方法,因為我們在這種情況下也將onTouch方法的返回值設置成了true;
測試5:(讓MyButton的onTouch方法在DOWN以及UP的情況下返回false,UP情況下返回true,這個測試主要是為了驗證onLongClick和onClick的執行在你點擊和移動沒有超出按鈕范圍的情況下和MOVE事件關系不大)
也就是我把MyButton的Touch事件監聽器修改成下面這樣子:
myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { boolean result = false; switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("MyButton--->onTouch--->DOWN"); result = false; break; case MotionEvent.ACTION_MOVE: System.out.println("MyButton--->onTouch--->MOVE"); result = true; break; case MotionEvent.ACTION_UP: System.out.println("MyButton--->onTouch--->UP"); result = false; break; default: break; } return result; } });點擊或者長按或者在MyButton上移動不超過他范圍,查看Logcat輸出:
07-01 05:38:52.231: I/System.out(1553): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:38:52.231: I/System.out(1553): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:38:52.231: I/System.out(1553): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 05:38:52.241: I/System.out(1553): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 05:38:52.241: I/System.out(1553): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:38:52.241: I/System.out(1553): MyButton--->onTouch--->DOWN 07-01 05:38:52.241: I/System.out(1553): MyButton--->onTouchEvent--->ACTION_DOWN 07-01 05:38:52.251: I/System.out(1553): MyButton--->onTouchEvent--->ACTION_DOWN--->true 07-01 05:38:52.251: I/System.out(1553): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:38:52.251: I/System.out(1553): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:38:52.261: I/System.out(1553): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:38:52.789: I/System.out(1553): MyButton--->onLongClick 07-01 05:38:53.688: I/System.out(1553): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 05:38:53.688: I/System.out(1553): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 05:38:53.691: I/System.out(1553): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 05:38:53.691: I/System.out(1553): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 05:38:53.691: I/System.out(1553): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 05:38:53.691: I/System.out(1553): MyButton--->onTouch--->UP 07-01 05:38:53.691: I/System.out(1553): MyButton--->onTouchEvent--->ACTION_UP 07-01 05:38:53.691: I/System.out(1553): MyButton--->onTouchEvent--->ACTION_UP--->true 07-01 05:38:53.691: I/System.out(1553): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:38:53.691: I/System.out(1553): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:38:53.691: I/System.out(1553): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:38:53.691: I/System.out(1553): MyButton--->OnClick你會看到這種情況下既有onLongClick輸出又有onClick輸出,並且在DOWN和UP的情況下都會調用MyButton的onTouchEvent方法,我這裡沒有貼出來MOVE情況下的輸出,如果你自己測試的話會發現MOVE情況下是不會執行MyButton的onTouchEvent方法的,因為這種情況下onTouch的返回值是true;
測試6:(測試5已經說了只有在那種情況下MOVE事件對onLongClick以及onClick沒有影響,原因就是我們在MOVE情況下MyButton的onTouch方法的返回值是true的,如果將這個返回值修改為false的話就會有影響了)
也就是我把MyButton的Touch事件監聽器修改成下面這樣子:
myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { boolean result = false; switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("MyButton--->onTouch--->DOWN"); result = false; break; case MotionEvent.ACTION_MOVE: System.out.println("MyButton--->onTouch--->MOVE"); result = false; break; case MotionEvent.ACTION_UP: System.out.println("MyButton--->onTouch--->UP"); result = false; break; default: break; } return result; } });如果你長按著MyButton按鈕並且快速移到MyButton范圍外,你會看到類似的下面輸出:
07-01 05:45:44.030: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:45:44.030: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:45:44.030: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN 07-01 05:45:44.030: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_DOWN--->false 07-01 05:45:44.030: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_DOWN 07-01 05:45:44.040: I/System.out(1620): MyButton--->onTouch--->DOWN 07-01 05:45:44.040: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_DOWN 07-01 05:45:44.050: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_DOWN--->true 07-01 05:45:44.050: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:45:44.050: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:45:44.050: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_DOWN--->true 07-01 05:45:44.135: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_MOVE 07-01 05:45:44.135: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_MOVE 07-01 05:45:44.135: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_MOVE 07-01 05:45:44.135: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_MOVE--->false 07-01 05:45:44.140: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_MOVE 07-01 05:45:44.140: I/System.out(1620): MyButton--->onTouch--->MOVE 07-01 05:45:44.140: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_MOVE 07-01 05:45:44.140: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_MOVE--->true 07-01 05:45:44.140: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_MOVE--->true 07-01 05:45:44.140: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_MOVE--->true 07-01 05:45:44.140: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_MOVE--->true 07-01 05:45:44.140: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_UP 07-01 05:45:44.140: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP 07-01 05:45:44.140: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP 07-01 05:45:44.150: I/System.out(1620): MyRelativeLayout--->onInterceptTouchEvent--->ACTION_UP--->false 07-01 05:45:44.150: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_UP 07-01 05:45:44.150: I/System.out(1620): MyButton--->onTouch--->UP 07-01 05:45:44.150: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_UP 07-01 05:45:44.150: I/System.out(1620): MyButton--->onTouchEvent--->ACTION_UP--->true 07-01 05:45:44.150: I/System.out(1620): MyButton--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:45:44.150: I/System.out(1620): MyRelativeLayout--->dispatchTouchEvent--->ACTION_UP--->true 07-01 05:45:44.150: I/System.out(1620): MainActivity--->dispatchTouchEvent--->ACTION_UP--->true可以看到不管是DOWN、MOVE、UP情況下,都會執行MyButton的onTouchEvent方法,但是你卻看不到onLongClick以及onClick的身影,原因在於當你移出MyButton的范圍之後,MOVE事件會從MessageQueue中移出關於MyButton的click以及longclick監聽的Message,這樣就不會執行onLongClick以及onClick方法了,這是快速移出MyButton范圍的情況輸出;如果你在MyButton上面停留一會在移出MyButton范圍的話,你會看到onLongClick的輸出,但是看不到onClick的輸出;總結一下,不管怎樣,只要你移出了MyButton范圍,onClick是肯定不會執行了,至於onLongClick就要看你的移出速度了;
這樣,我對View的事件分發過程做了下簡單的測試,自認為比較全了,有什麼不正確的地方希望高手賜教,贈人玫瑰,手留余香!!!!!
手機qq怎麼安裝?,安裝目錄哪裡找,下面小編就簡單介紹下。 手機qq安裝教程 方式一:手機下載(Android Market 電子市場)安裝 啟動程序列表的
效果:需要知識:1. 二次貝塞爾曲線2. 動畫知識3. 基礎自定義view知識先來解釋下什麼叫阻尼運動阻尼振動是指,由於振動系統受到摩擦和介質阻力或其他能耗而使振幅隨時間
很久前也寫過一篇Android數據庫操作相關內容。在正式項目中,我們通常會使用數據庫開源框架如GreenDao來對數據庫進行操作。感覺很久沒有直接使用Sql語句了,這幾天
Android Service是分為兩種: 本地服務(Local Service): 同一個apk內被調用 遠程服務(Remote Service):被另一個apk調