package com.example.longpress;/** * @author 作者 E-mail: chenshaohua2012@126.com * @version 建立時間:2013-1-15 下午12:07:32 * 類說明 */import android.content.Context;import android.view.MotionEvent;import android.view.View;public class LongPressView1 extends View {private int mLastMotionX, mLastMotionY;// 是否移動了private boolean isMoved;// 是否釋放了private boolean isReleased;// 計數器,防止多次點擊導致最後一次形成longpress的時間變短private int mCounter;// 長按的runnableprivate Runnable mLongPressRunnable;// 移動的閾值private static final int TOUCH_SLOP = 20;public LongPressView1(Context context) {super(context);mLongPressRunnable = new Runnable() {@Overridepublic void run() {System.out.println("thread");System.out.println("mCounter--->>>"+mCounter);System.out.println("isReleased--->>>"+isReleased);System.out.println("isMoved--->>>"+isMoved);mCounter--;// 計數器大於0,說明當前執行的Runnable不是最後一次down產生的。if (mCounter > 0 || isReleased || isMoved)return;performLongClick();// 回調長按事件}};}public boolean dispatchTouchEvent(MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastMotionX = x;mLastMotionY = y;mCounter++;isReleased = false;isMoved = false;postDelayed(mLongPressRunnable, 3000);// 按下 3秒後調用線程break;case MotionEvent.ACTION_MOVE:if (isMoved)break;if (Math.abs(mLastMotionX - x) > TOUCH_SLOP|| Math.abs(mLastMotionY - y) > TOUCH_SLOP) {// 移動超過閾值,則表示移動了isMoved = true;}break;case MotionEvent.ACTION_UP:// 釋放了isReleased = true;break;}return true;}}
public class LongMainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout.LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);View v = new LongPressView1(LongMainActivity.this);v.setLayoutParams(layout);setContentView(v);v.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Toast.makeText(LongMainActivity.this, "abcdef",Toast.LENGTH_SHORT).show();return false;}});}}