97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android觸摸事件處理  
 
Android觸摸事件處理
分享到:

Android界面框架支持對觸摸事件的監(jiān)聽,并能夠將觸摸事件的詳細信息傳遞給處理方法,不過需要設置觸摸事件的監(jiān)聽器,并重載onTouch ()方法。

設置觸摸事件的監(jiān)聽器,并重載onTouch ()方法的代碼如代碼清單1所示。

代碼清單1 設置觸摸事件的監(jiān)聽器,并重載onTouch ()方法

touchView.setOnTouchListener(new View.OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //過程代碼…
        return true/false;
    }

在上述代碼中,第1行代碼是設置控件的觸摸事件監(jiān)聽器;在第3行的onTouch()方法中,第1個參數(shù)View表示產(chǎn)生觸摸事件的界面控件;第2個參數(shù)MontionEvent表示觸摸事件的詳細信息,如產(chǎn)生時間、坐標和觸點壓力等;第5行是onTouch()方法的返回值。

TouchEventDemo是一個說明如何處理觸摸事件的示例,TouchEventDemo用戶界面如圖1所示。


圖1 TouchEventDemo用戶界面

由圖1可以看出,上半部分的淺藍色區(qū)域是可以接受觸摸事件的區(qū)域,用戶可以在Android模擬器中使用鼠標點擊屏幕用以模擬觸摸手機屏幕;下方黑色區(qū)域是顯示區(qū)域,用來顯示觸摸事件類型、相對坐標、絕對坐標、觸點壓力、觸點尺寸和歷史數(shù)據(jù)量等信息。

在用戶界面中使用了線性布局,并加入了3個TextView控件:第1個TextView(ID為touch_area)用來標識觸摸事件的測試區(qū)域;第2個TextView(ID為history_label)用來顯示觸摸事件的歷史數(shù)據(jù)量;第3個TextView(ID為event_label)用來顯示觸摸事件的詳細信息,包括類型、相對坐標、絕對坐標、觸點壓力和觸點尺寸。

XML文件的代碼如代碼清單2所示。

代碼清單2 XML文件

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:id="@+id/touch_area"
        android:layout_width="match_parent"
        android:layout_height="300dip"
        android:background="#80A0FF "
        android:textColor="#FFFFFF"
        android:text="觸摸事件測試區(qū)域">
    </TextView>
        <TextView android:id="@+id/history_label"
                            android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="歷史數(shù)據(jù)量:" >
    </TextView>
    <TextView android:id="@+id/event_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="觸摸事件:" >
    </TextView>
    </LinearLayout>

在上述代碼中,第9行代碼定義了TextView的背景顏色,#80A0FF是顏色代碼;第10行代碼定義了TextView的字體顏色。

在代碼中為了能夠引用XML文件中聲明的界面元素,使用了代碼清單3所示的代碼。

代碼清單3 在代碼中引用XML文件中聲明的界面元素

TextView labelView = null;
    labelView = (TextView)findViewById(R.id.event_label);
    TextView touchView = (TextView)findViewById(R.id.touch_area);
    final TextView historyView = (TextView)findViewById(R.id.history_label);

當手指接觸到觸摸屏、在觸摸屏上移動或離開觸摸屏時,分別會引發(fā)ACTION_DOWN、ACTION_UP和ACTION_MOVE觸摸事件,而無論是哪種觸摸事件,都會調用onTouch()方法進行處理。事件類型包含在onTouch()方法的MotionEvent參數(shù)中,可以通過getAction()方法獲取到觸摸事件的類型,然后根據(jù)觸摸事件的不同類型進行不同的處理。為了能夠使屏幕上方的TextView處理觸摸事件,需要使用setOnTouchListener()方法在代碼中設置觸摸事件監(jiān)聽器,并在onTouch()方法添加觸摸事件的處理過程。代碼如代碼清單4所示。

代碼清單4 onTouch()

touchView.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            switch (action) {
                case (MotionEvent.ACTION_DOWN):
                Display("ACTION_DOWN",event);
                break;
                case (MotionEvent.ACTION_UP):
                int historySize = ProcessHistory(event);
                historyView.setText("歷史數(shù)據(jù)量:"+historySize);
                Display("ACTION_UP",event);
                break;
                case (MotionEvent.ACTION_MOVE):
                Display("ACTION_MOVE",event);
                break;
            }
            return true;
        }
    });

第7行代碼的Display()是一個自定義方法,主要用來顯示觸摸事件的詳細信息,方法的代碼和含義將在后面進行介紹;第10行代碼的ProcessHistory()也是一個自定義方法,用來處理觸摸事件的歷史數(shù)據(jù);第11行代碼是使用TextView顯示歷史數(shù)據(jù)的數(shù)量。

MotionEvent參數(shù)中不僅有觸摸事件的類型信息,還有觸點的坐標信息,獲取方式是使用getX()和getY()方法,這兩個方法獲取到的是觸點相對于父界面元素的坐標信息。如果需要獲取絕對坐標信息,則可使用getRawX()和getRawY()方法。

觸點壓力是一個介于0和1之間的浮點數(shù),用來表示用戶對觸摸屏施加壓力的大小,接近0表示壓力較小,接近1表示壓力較大,獲取觸摸事件觸點壓力的方式是調用getPressure()方法。

觸點尺寸指用戶接觸觸摸屏的接觸點大小,也是一個介于0和1之間的浮點數(shù),接近0表示尺寸較小,接近1表示尺寸較大,可以使用getSize()方法獲取。

Display()將MotionEvent參數(shù)中的事件信息提取出來,并顯示在用戶界面上。代碼如代碼清單5所示。

代碼清單5 Display()

private void Display(String eventType, MotionEvent event){
        int x = (int)event.getX();
        int y = (int)event.getY();
        float pressure = event.getPressure();
        float size = event.getSize();
        int RawX = (int)event.getRawX();
        int RawY = (int)event.getRawY();
        String msg = "";
        msg += "事件類型:" + eventType + "\n";
        msg += "相對坐標:"+String.valueOf(x)+","+String.valueOf(y)+"\n";
        msg += "絕對坐標:"+String.valueOf(RawX)+","+String.valueOf(RawY)+"\n";
        msg += "觸點壓力:"+String.valueOf(pressure)+", ";
        msg += "觸點尺寸:"+String.valueOf(size)+"\n";
        labelView.setText(msg);
    }

一般情況下,如果用戶將手指放在觸摸屏上,但不移動,然后抬起手指,應先后產(chǎn)生ACTION_DOWN和ACTION_UP兩個觸摸事件。但如果用戶在屏幕上移動手指,然后再抬起手指,則會產(chǎn)生這樣的事件序列:ACTION_DOWN → ACTION_MOVE → ACTION_MOVE → ACTION_MOVE → …→ ACTION_UP。

在手機上運行的應用程序,效率是非常重要的。如果Android界面框架不能產(chǎn)生足夠多的觸摸事件,則應用程序就不能夠很精確地描繪觸摸屏上的觸摸軌跡。如果Android界面框架產(chǎn)生了過多的觸摸事件,雖然能夠滿足精度的要求,但也降低了應用程序效率。

針對以上問題Android界面框架使用了“打包”的解決方法。在觸點移動速度較快時會產(chǎn)生大量的數(shù)據(jù),每經(jīng)過一定的時間間隔便會產(chǎn)生一個ACTION_MOVE事件,在這個事件中,除了有當前觸點的相關信息外,還包含這段時間間隔內觸點軌跡的歷史數(shù)據(jù)信息,這樣既能夠保持精度,又不至于產(chǎn)生過多的觸摸事件。

通常情況下,在ACTION_MOVE的事件處理方法中,都先處理歷史數(shù)據(jù),然后再處理當前數(shù)據(jù),代碼如代碼清單6所示。

代碼清單6 ProcessHistory(MotionEvent event)

private int ProcessHistory(MotionEvent event)
    {
        int historySize = event.getHistorySize();
        for (int i = 0; i < historySize; i++) {
            long time = event.getHistoricalEventTime(i);
            float pressure = event.getHistoricalPressure(i);
            float x = event.getHistoricalX(i);
            float y = event.getHistoricalY(i);
            float size = event.getHistoricalSize(i);
            // 處理過程…
        }
        return historySize;
    }

在上述代碼中,第3行代碼獲取了歷史數(shù)據(jù)的數(shù)量;然后在第4行至12行中循環(huán)處理這些歷史數(shù)據(jù);第5行代碼獲取了歷史事件的發(fā)生時間;第6行代碼獲取歷史事件的觸點壓力;第7行和第8行代碼獲取歷史事件的相對坐標;第9行獲取歷史事件的觸點尺寸;在第14行返回歷史數(shù)據(jù)的數(shù)量,主要是用于界面顯示。

注:Android模擬器并不支持觸點壓力和觸點尺寸的模擬,所有觸點壓力恒為1.0,觸點尺寸恒為0.0。同時,Android模擬器上也無法產(chǎn)生歷史數(shù)據(jù),因此歷史數(shù)據(jù)量一直顯示為0。

 更多相關文章

·Android按鍵事件處理過程詳解
·Android系統(tǒng)菜單之快捷菜單
·Android系統(tǒng)菜單之子菜單
·Android系統(tǒng)菜單之選項菜單
·Android系統(tǒng)控件TabHost