編輯:關於Android編程
Android中的事件分為按鍵事件和觸摸事件。
Touch事件是由一個ACTION_DOWN,n個ACTION_MOVE,一個ACTION_UP組成onClick,onLongClick,onScroll等事件。
Android 中與 Touch 事件相關的方法及其對應的作用:
dispatchTouchEvent(MotionEvent ev) 事件分發
onInterceptTouchEvent(MotionEvent ev) 事件攔截
onTouchEvent(MotionEvent ev) 事件響應
Activity:dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)
View: dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)
ViewGroup繼承View,上面方法都是public的,所以他擁有上面所有方法,ViewGroup類裡面新添加了方法onInterceptTouchEvent(MotionEvent ev)。
為了比較清楚的了解執行流程,我做了如圖所示的小demo:
這裡我們要清楚一個東西,控件分為兩種:一種是繼承View不能包含其他控件的控件;另一種是繼承ViewGroup可以包含其他控件的控件,暫且稱為容器控件,比如ListView,GridView,LinearLayout等。
上面demo的Button就是繼承自View的,淺綠色區域是一個橫向的LinearLayout,而他是繼承自ViewGroup的。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPs/IuMXK9tK7z8JkZW1vtcTWxtf3o7o8YnIgLz4NCsDvw+bT0Mj9uPbA4KO6PGJyIC8+DQpNeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHk8YnIgLz4NCk15QnV0dG9uIGV4dGVuZHMgQnV0dG9uPGJyIC8+DQpNeUxpbmVhckxheW91dCBleHRlbmRzIExpbmVhckxheW91dDxiciAvPg0K1NpNeUFjdGl2aXR51tCjujwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
public class MyActivity extends Activity
{
private static final String TAG = MyActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i(TAG, MotionEvent.actionToString(ev.getAction()) + dispatchTouchEvent());
return super.dispatchTouchEvent(ev);
}
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG, MotionEvent.actionToString(event.getAction()) + onTouchEvent());
return super.onTouchEvent(event);
}
}
MyButton和MyLinearLayout十分相似,MyLinearLayout只多了一個onInterceptTouchEvent方法,這裡貼出MyButton的代碼,如果需要MyLinearLayout的代碼可以在後面直接下載,看完整的代碼。
MyButton
public class MyButton extends Button
{
private static final String TAG = MyButton.class.getSimpleName();
public MyButton(Context context)
{
super(context);
}
public MyButton(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i(TAG, MotionEvent.actionToString(ev.getAction()) + dispatchTouchEvent());
return super.dispatchTouchEvent(ev);
}
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG, MotionEvent.actionToString(event.getAction()) + onTouchEvent());
return super.onTouchEvent(event);
}
}
Java代碼都是非常簡單的
因為我們要使用自己定義的控件,所以在xml布局代碼中是這樣的:
log的顯示為 Tag顯示:具體類, Text顯示:具體動作 + 調用方法名
點擊MyButton(深綠色區域),出現的結果是:
點擊MyLinearLayout 非MyButton區域(淺綠色區域),結果是:
點擊MyActivity 非MyLinearLayout區域(空白區域),結果是:
源碼,內部具體到底是怎麼處理的。
TabLayout的使用簡單介紹比如在平常的項目中實現這樣的效果,一般都是都會使用viewPageIndicate等幾個開源框架直接實現,或者使用自定義的Horizont
先給大家展示下關於仿支付寶錢包首頁中帶有分割線的gridview,俗稱九宮格 的效果圖,怎麼樣是不是和你想象的一樣啊。在你的預料之中就繼續訪問以下代碼內容吧。我們都知道L
喜歡另辟蹊徑的我,在這裡廢話不多說了,直接上代碼和圖片了。效果圖如下:第一步:MainActivity的代碼如下:package net.loonggg.test; i
先放個gif。。最終效果如果: 主要演示了Android從服務器下載文件,調用Notification顯示下載進度,並且在下載完畢以後點擊通知會跳轉到安裝APK的界面,演