Android項目---TouchListener

來源:互聯網
上載者:User

標籤:android   des   style   blog   class   code   

public static interface

View.OnTouchListener
android.view.View.OnTouchListener
Known Indirect Subclasses AutoScrollHelper, ListViewAutoScrollHelper, ZoomButtonsController
Class Overview

Interface definition for a callback to be invoked when a touch event is dispatched to this view. The callback will be invoked before the touch event is given to the view.

Summary
Public Methods
abstract boolean onTouch(View v, MotionEvent event) Called when a touch event is dispatched to a view.  

 

用到這個類,一般就是在Android項目中,擷取手點擊螢幕的焦點。

如果實在控制項上操作的話,一般將TouchListener事件單獨提出來,寫成一個工具類。

一、定義TouchListener工具類

 
public class TouchListener implements OnTouchListener {    Context context;    float oldDist;    float newDist;    float oldY;    float newY;    List<Float> list = new ArrayList<Float>();    boolean on_off;    public TouchListener(Context context) {        this.context = context;    }    @Override    public boolean onTouch(View v, MotionEvent event) {        float f2 = event.getRawX();        list.add(f2);        oldDist = list.get(0);// 存集合裡 又因為onTouch方法會不斷會掉 這個值會不斷加入集合中        switch (event.getAction() & MotionEvent.ACTION_MASK) {        case MotionEvent.ACTION_DOWN:            System.out.println("DOWN");            oldY = event.getY();            break;        case MotionEvent.ACTION_UP:            System.out.println("UP");            newDist = event.getRawX();            if (oldDist < 100 && newDist - oldDist > 200) {                Intent intent = new Intent();                intent.setAction("open");                context.sendBroadcast(intent);                HomeActivity.isopen = true;            }            if (newDist - oldDist < -200                    || (newDist - oldDist > 0 && newDist - oldDist < 200 && oldDist < 100)) {                Intent intent = new Intent();                intent.setAction("back");                context.sendBroadcast(intent);            }            if (newDist - oldDist < 0 && newDist - oldDist > -200                    && HomeActivity.isopen) {                Intent intent = new Intent();                intent.setAction("open");                context.sendBroadcast(intent);                HomeActivity.isopen = true;            } else {                list = new ArrayList<Float>();                newY = event.getY();                if (Math.abs(newY - oldY) < 40                        && Math.abs(newDist - oldDist) > 40) {return true;                } else {return false;                }            }            break;         case MotionEvent.ACTION_MOVE:            System.out.println("MOVE");            newDist = event.getRawX();            float distance = newDist - oldDist;            Intent intent = new Intent();            intent.putExtra("distance", distance);            intent.putExtra("old", oldDist);            intent.setAction("move");            context.sendBroadcast(intent);            Log.i("info", "MOVE");            break;        }        return true;    }}

註:一定要給每個case寫break。。。

 

 ACTION_MASK在Android中是應用於多點觸摸操作,字面上的意思大概是動作掩碼的意思吧。

在onTouchEvent(MotionEvent event)中

使用switch (event.getAction())可以處理ACTION_DOWN和ACTION_UP事件

使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以處理處理多點觸摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。

ACTION_DOWN和ACTION_UP就是單點觸控螢幕幕,按下去和放開的操作;
ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多點觸控螢幕幕,當有一隻手指按下去的時候,另一隻手指按下和放開的動作捕捉;
ACTION_MOVE就是手指在螢幕上移動的操作;

TouchListener中有一個問題,在重寫onTouch方法的時候,傳回值false和true的不同。

如果是false,則出了按鈕控制項會正常顯示down,up,move的值,其他控制項都只能顯示down的事件

如果是true,則就會不斷的取值。

event.getX();//指的是控制項的x座標

event.getRawX();//指的是螢幕的X座標

二、接收廣播

BroadcastReceiver receiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            if (intent.getAction().equals("open")) {                new AsyncMove2().execute();            }            if (intent.getAction().equals("back")) {                isopen = false;                new AsyncMove2().execute();            }            if (intent.getAction().equals("move")) {                float f = intent.getFloatExtra("distance", 0);                float old = intent.getFloatExtra("old", 0);                LinearLayout.LayoutParams lp = (LayoutParams) left_menu                        .getLayoutParams();                if (isopen && f < 0) {                    lp.leftMargin = (int) f;                } else if (!isopen && f > 0 && old < 100) {                    lp.leftMargin = (int) (-left_menu.getWidth() + f);                }                left_menu.setLayoutParams(lp);            }        }    };

三、註冊廣播

IntentFilter inf = new IntentFilter();        inf.addAction("open");        inf.addAction("back");        inf.addAction("move");        registerReceiver(receiver, inf);

 

關於onTouch事件的演算法思想:
擷取動作 多點觸控
如果是按下
得到按下時控制項的Y軸值
如果是抬起
擷取手指抬起時獲得的螢幕新的X的值
如果手指按下的位置靠近螢幕左邊100像素內,並且新位置的值減去舊位置的值大於200(從左向右滑動)
開啟功能表列(向Activity中發送開啟廣播)
如果新位置值減去舊位置值小於200(從右向左滑動)或者<新舊位置值差值大於0 並且新減舊小於200(從左向右滑動距離太短)並且是在距離螢幕100像素內>
關閉功能表列(向Activity中發送關閉廣播)
如果現在菜單是開啟著的並且是從右向左滑動 且滑動距離很短(小於200) 則將菜單重新彈出
開啟功能表列
否則如果控制項Y軸的變化大於50就認為他是要上下滑動listview不去執行左右開關操作
如果手勢是弧形 且弧形平緩就理解為是左右滑動
開啟菜單
如果手勢是弧形 且弧形陡峭就理解為是上下滑動 不在執行開啟關閉菜單操作 認為使用者是在滑動listview
關閉菜單
如果是移動
擷取螢幕的x值
擷取移動的距離
發送廣播

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.