`

android:自定义长按/长点击事件

 
阅读更多
自定义的长按事件。

public class LongPressView extends View{

	private static final String TAG = "LongPressView";
	
	private int mLastMotionX, mLastMotionY;
	private boolean isMoved;
	//长按的runnable
	private Runnable mLongPressRunnable;
	//移动的阈值
	private static final int TOUCH_SLOP = 20;

	public LongPressView(final Context context) {
		super(context);
		
		mLongPressRunnable = new Runnable() {
			@Override
			public void run() {
				
				Log.i(TAG, "mLongPressRunnable excuted");
				
				performLongClick();	// 执行长按事件(如果有定义的话)
			}
		};
	}
	
	
	/*
	 * 
	 * 1)在down的时候,让一个Runnable在设定时间后执行,
	 * 	     如果设定时间到了,没有移动超过定义的阈值,也没有释放,则触发长按事件
	 * 
	 * 2)在移动超过阈值和释放之后,会将Runnable从事件队列中remove掉,长按事件也就不会再触发了
	 * 
	 */

	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;
			isMoved = false;
			/*
			 * 将mLongPressRunnable放进任务队列中,到达设定时间后开始执行
			 * 这里的长按时间采用系统标准长按时间
			 */
			postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());
			break;
		case MotionEvent.ACTION_MOVE:
			
			if( isMoved ) break;
			
			if( Math.abs(mLastMotionX-x) > TOUCH_SLOP 
					|| Math.abs(mLastMotionY-y) > TOUCH_SLOP ) {
				//移动超过阈值,则表示移动了
				isMoved = true;
				removeCallbacks(mLongPressRunnable);
			}
			break;
		case MotionEvent.ACTION_UP:
			//释放了
			removeCallbacks(mLongPressRunnable);
			break;
		}
		return true;
	}
	
}

Activity调用。
public class MainActivity extends Activity {
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        View mLongPressView = new LongPressView(this);
        mLongPressView.setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {

				Toast.makeText(MainActivity.this,
						"I got a long press!", Toast.LENGTH_SHORT).show();
				return false;
			}
		});
        setContentView(mLongPressView);
    }
}
分享到:
评论

相关推荐

    Android自定义按钮实现长按功能

    通过这种方式,我们就成功地实现了Android自定义按钮的长按功能。这种方法允许我们在不改变原有按钮样式的情况下,轻松添加长按行为,为用户提供更多的交互可能性。同时,自定义按钮类也可以根据需求扩展其他功能,...

    Android自定义TextView链接点击和长按事件

    // 自定义长按事件的逻辑 return true; } }); ``` 四、自定义链接样式 除了点击和长按事件,我们还可以自定义链接的样式,例如颜色、下划线等。这可以通过设置`SpannableString`实现: ```java String text = ...

    WebView 自定义长按选择,实现收藏 / 分享选中文本

    总之,实现WebView自定义长按选择并提供收藏和分享选中文本的功能,涉及到WebView的事件监听、JavaScript与Java的交互、自定义菜单的创建以及Android的分享和存储机制。这需要开发者具备扎实的Android基础和一定的...

    android自定义长按事件

    在Android开发中,自定义长按事件是一项基本且重要的技能,尤其在设计交互式用户界面时。本知识点主要探讨如何在Android应用中实现自定义的长按事件,并结合实际的项目代码进行解析。 首先,我们需要了解Android中...

    RecyclerView的长按事件和点击事件

    综上所述,通过自定义Adapter、设置监听器以及使用接口回调,我们可以在RecyclerView中实现点击和长按事件。这个过程不仅涉及到事件监听,还涉及到组件交互和业务逻辑处理,是Android开发中的常见实践。

    Android 自定义按钮点击事件和长按事件对比

    Android 自定义按钮点击事件和长按事件对比 一个按钮同时实现点击和长按事件,有时候会有冲突,我们针对这一现象来自定义按钮来区分点击和长按事件 1.xml中 <LinearLayout xmlns:android=...

    android listview长按,单击各种事件捕捉

    本示例着重讲解如何在ListView中实现长按和单击事件的捕捉。 首先,我们要创建一个自定义的Adapter,这个Adapter是ListView与数据源之间的桥梁,负责将数据转化为ListView可显示的View。在适配器中,我们需要重写`...

    长按菜单响应

    在Android开发中,"长按菜单响应"是一个常见的交互功能,允许用户通过长时间按下屏幕上的元素来触发特定的上下文操作或菜单。本教程将深入探讨如何实现这一功能,主要涉及以下几个方面: 1. **监听长按事件**: 在...

    Android自定义二维码生成

    Android二维码生成,包括一般二维码、彩色二维码、带logo二维码或带logo的彩色二维码、黑色色块用图片代替的二维码。可拍照和相册选取图片,二维码长按保存至本地。具体效果请看:...

    ExpandableListView 点击和长按事件

    在`ExpandableListViewDemo`项目中,开发者通常会创建一个自定义的`ExpandableListAdapter`,在这个适配器中实现上述的点击和长按事件处理逻辑。同时,还需要在主活动中设置`ExpandableListView`并绑定适配器。 ...

    Android解决文本链接长按事件与短按事件冲突的demo

    在Android开发中,处理文本链接的交互是一个常见的需求。用户可能会点击链接来跳转到其他页面,也可能希望长按链接来触发更多...这种方法既保留了链接的默认外观,又允许我们自定义长按事件,从而提供更好的用户体验。

    android中button长按效果的demo

    在Android开发中,Button是用户界面(UI)中不可或缺的组件,用于接收用户的点击事件,通常用于触发一些操作。然而,除了单击之外,Button还可以响应长按事件,以实现更多的交互功能。本Demo旨在展示如何在Android...

    Android ListView长按删除

    综上所述,实现Android ListView的长按删除功能,主要涉及以下几个步骤:设置适配器、添加长按监听器、处理长按事件、删除数据源中的项并更新适配器,以及可选地提供删除确认提示。通过这些步骤,你可以为你的...

    android长按水波纹扩散效果

    在Android开发中,实现“长按水波纹扩散效果”是一种增强用户交互体验的设计手法,它使得用户在长时间按下屏幕时,触摸位置会出现类似水波纹的动态扩散效果。这种效果通常用于按钮、列表项或其他可点击的界面元素,...

    Android MenuItem 自定义长按事件的实现

    有的时候我们不需要这个Toast,或者说长按MenuItem的时候需要做一些其他的事情,该怎么办呢? 实现过程 首先我们先获取该MenuItem的View: View menu_more = findViewById(R.id.menu_more); 然后给它设置一个长按...

    Android长按屏幕事件

    在Android中,事件处理主要通过事件监听器(Event Listeners)来实现,包括点击事件、触摸事件等。对于长按事件,我们通常使用`View.OnLongClickListener`接口。当用户对某个视图(View)进行长按时,系统会触发该...

Global site tag (gtag.js) - Google Analytics