標籤: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值
擷取移動的距離
發送廣播