1. 程式人生 > >事件監聽,回撥事件

事件監聽,回撥事件

一、事件監聽涉及到三個類物件

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);     //設定佈局
    }
}