android自定义view的长按事件的执行时间

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;  
    // 长按的runnable  
    private Runnable mLongPressRunnable;  
    // 移动的阈值  
    private static final int TOUCH_SLOP = 20;  
  
    public LongPressView1(Context context) {  
        super(context);  
        mLongPressRunnable = new Runnable() {  
  
            @Override  
            public 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;  
    }  
}  

[html] view plain copy print?
public class LongMainActivity extends Activity {  
  
    @Override  
    public 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() {  
  
            @Override  
            public boolean onLongClick(View v) {  
                Toast.makeText(LongMainActivity.this, "abcdef",  
                        Toast.LENGTH_SHORT).show();  
                return false;  
            }  
        });  
    }  
  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值