事件監聽,回撥事件
一、事件監聽涉及到三個類物件
1、EventSource(事件源)事件發生的場所
2、Event(事件):事件封裝介面元件上面發生的特定事件
3、EventListener(事件監聽器):負責監聽事件源發生的事件
二、監聽器就是程式中的MyClickListenner類,監聽器類必須要程式設計師自己實現,關鍵在於實現處理。通常事件監聽器必須實現的監聽介面有:
1、View.OnClickListener: 單擊事件的監聽器必須實現的介面
2、View.OnCreateContextMenuListener: 建立上下文選單事件的事件監聽器必須要實現的的介面
3、View.onFocusChangeListener: 焦點改變事件監聽器必須實現的介面
4、View.OnkeyListener: 按鍵事件監聽器必須要實現的介面
5、View.OnLongClickListener: 長按事件監聽器必須實現的介面
6、View.OnTouchListener: 觸控事件監聽器必須實現的介面
三、註冊監聽器,只需要呼叫事件源的 setXxxListener(XxxListener)方法就可以了。也可以在xml中用Android:onClick屬性指定監聽
四、基於回撥事件處理
GUI提供一些事件的處理回撥方法,以View為例
1、boolean onKeyDown(int keyCode ,keyEvent event): 當用戶在該元件上按下一個鍵,觸發該方法
2、boolean onKeyLongPress(int keyCode,KeyEvent evnt): 當用戶在元件上長按鍵時觸發該方法
3、boolean onKeyShortcut(int keyCode,KeyEvent evnt): 當用戶在元件上快捷鍵事件時,觸發該方法
4、boolean onKeyUp(int keyCode,KeyEvent evnt): 當用戶在元件上鬆開按鍵事件時,觸發該方法
5、boolean onTouchEvent(MotionEvent event): 當用戶觸控觸控式螢幕時,觸發該方法
6、boolean onTrackballEvent(MotionEvent event): 當用戶觸發軌跡球事件時,觸發該方法
5、總的來說事件發生時,首先觸發的是繫結在元件上的監聽器,其次才觸發該元件上面的回撥方法,最後才是傳播到該元件所在的Activity上。
在一些情況下,基於回撥事件處理機制會更好地提高程式地內聚性
6、通過回撥方法實現跟隨手指地小球(重寫boolean onTouchEvent(MotionEvent event))
1、自定一個DrawView,繼承View
public class DrawView extends View { public float currentX=40; public float currentY=50; Paint paint=new Paint();//建立畫筆 public DrawView(Context context) { super(context); } public DrawView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } //重寫onDraw public void onDraw(Canvas canvas){ super.onDraw(canvas); paint.setColor(Color.RED); canvas.drawCircle(currentX,currentY,20,paint); } //重寫onTouchEvent(MotionEvent event) 當發生觸控式螢幕事件的時候發生 public boolean onTouchEvent(MotionEvent event){ currentX=event.getX(); //獲取觸控事件的x currentY=event.getY(); //獲取觸控事件的y //通知當前的元件重化自己 invalidate(); return true; } }
二、有兩種用法
1.1、可直接在xml中使用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.example.asus.summary.view.DrawView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
1.2、Activity
public class DrawActivity extends AppCompatActivity { protected void onCreate(Bundle saveInstanceSate) { super.onCreate(saveInstanceSate); setContentView(R.layout.draw_activity); } }
2、Activity
public class DrawActivity extends AppCompatActivity { protected void onCreate(Bundle saveInstanceSate) { super.onCreate(saveInstanceSate); LinearLayout linearLayout=new LinearLayout(this); //線性佈局管理器 DrawView drawView=new DrawView(this); //自定義view drawView.setMinimumHeight(300); drawView.setMinimumWidth(500); linearLayout.addView(drawView); //佈局容器中加入自定義view setContentView(linearLayout); //設定佈局 } }