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

通过自定义BUTTON,写一个LongTouchBtn类,在按下的时候执行onTouchEvent事件,通过这个事件使用回调函数来实现长按功能!

XML:

 <huahua.btnlongtouch.LongTouchBtn
        android:id="@+id/btn2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="自定义Btn" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        />

activity:

public class MainActivity extends Activity {
	private TextView Tv1;
	private LongTouchBtn Btn1;
	private int num=0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Tv1 = (TextView)findViewById(R.id.tv1);
		Btn1 = (LongTouchBtn)findViewById(R.id.btn2);
		Btn1.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Log.i("huahua", "自定义按钮处理单击");

			}
		});
		Btn1.setOnLongClickListener(new View.OnLongClickListener() {

			@Override
			public boolean onLongClick(View v) {
				Log.i("huahua", "自定义按钮处理长按一次相应");
				return false;
			}
		});

		/**
		 * 这是一个自定义的接口 专门负责处理长按逻辑
		 * 	 @param listener
		 *            监听器。
		 * @param time
		 *            第2个参数传入1000 ,表示1秒处理一次onLongTouch()方法
		 */
		Btn1.setOnLongTouchListener(new LongTouchListener() {

			@Override
			public void onLongTouch() {
				num++;
				Tv1.setText(num+"");
				Log.i("huahua", "正在长按");

			}
		},1000);
	}
}

huahua.btnlongtouch.LongTouchBtn:

public class LongTouchBtn extends Button{

	/**
	 * 记录当前自定义Btn是否按下
	 */
	private boolean clickdown = false;

	/**
	 * 下拉刷新的回调接口
	 */
	private LongTouchListener mListener;

	/**
	 * 按钮长按时 间隔多少毫秒来处理 回调方法
	 */
	private int mtime;

	/**
	 * 构造函数
	 * @param context
	 * @param attrs
	 */
	public LongTouchBtn(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 处理touch事件
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction() == MotionEvent.ACTION_DOWN)
		{
			clickdown = true;
			new LongTouchTask().execute();

			Log.i("huahua", "按下");
		}
		else if(event.getAction() == MotionEvent.ACTION_UP)
		{
			clickdown = false;
			Log.i("huahua", "弹起");
		}
		return super.onTouchEvent(event);
	}

	/**
	 * 使当前线程睡眠指定的毫秒数。
	 *
	 * @param time
	 *            指定当前线程睡眠多久,以毫秒为单位
	 */
	private void sleep(int time) {
		try {
			Thread.sleep(time);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 处理长按的任务
	 */
	class  LongTouchTask extends AsyncTask<Void, Integer, Void>{

		@Override
		protected Void doInBackground(Void... params) {
			while(clickdown)
			{
				sleep(mtime);
				publishProgress(0);
			}
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {

		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			mListener.onLongTouch();
		}

	}

	/**
	 * 给长按btn控件注册一个监听器。
	 *
	 * @param listener
	 *            监听器的实现。
	 * @param time
	 *            多少毫秒时间间隔 来处理一次回调方法
	 */
	public void setOnLongTouchListener(LongTouchListener listener, int time) {
		mListener = listener;
		mtime = time;

	}

	/**
	 * 长按监听接口,使用按钮长按的地方应该注册此监听器来获取回调。
	 */
	public interface LongTouchListener {

		/**
		 * 处理长按的回调方法
		 */
		void onLongTouch();
	}
}

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

时间: 2024-11-05 19:12:24

Android自定义按钮实现长按功能的相关文章

ListView自定义按钮实例-标记删除功能

.aspx代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1

vue 使用element-ui中的Notification自定义按钮并实现关闭功能以及如何处理多个通知

使用element-ui中的Notification,只有一个message属性是有很大的操作空间,其余的都是写死的,无法进行扩展,达不到想要的效果.所以只能在message上下功夫. 在element-ui官方文档中可以看到Notification中的message属性是可以处理VNode的所以我们可以使用VNode来达到我们需要的效果. 如何关闭通知呢? 当创建通知的时候,会返回该通知的实例,通过该实例的close方法可以将通知关闭. 那么当有多个通知显示在屏幕上时,如何关闭特定弹窗的呢?

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

android自定义View-------滑动按钮

源码和测试例子已经放到github https://github.com/Leaking/SlideSwitch 效果图如下,传不了gif图片,暂且截一个静态图片.其中按钮滑动时颜色有渐变效果. 先说说大概思路:按钮绘制了三个图层,最下面是覆盖整个View的灰色,第二个是覆盖整个View的自定义的颜色,它可以改变透明度.第三个是白色.当白色部分移动时,修改第二个图层的透明度即可. 大概记录一下重写一个组件的实现过程. 1,定义属性 2,,在Java代码中的构造器获取属性的值 3,重写onMeas

Android:自定义DialogFragment的内容和按钮

小问题,记录下~ Android4.0以后开始推荐使用DialogFragment代替Dialog.Android的官方文档中给了两个示例: 一个Basic Dialog 示例了如何自定义窗口内容--重写onCreateView方法. 一个Alert Dialog 示例了如何自定义弹窗的正负按钮--重写onCreateDialog方法. 好的,那么问题来了 在实际应用中经常是需要既自定义窗口内容.又需要自定义按钮的. 这时候如果我们按图索骥,把DialogFragment的onCreateVie

Android 自定义UI圆角按钮

Android实际开发中我们一般需要圆角的按钮,一般情况下我们可以让美工做出来相应的按钮图片,然后放上去即可,另外我们可以在布局文件中直接设置,也可以达到一样的效果.下面讲解在布局文件中自定义圆角按钮的小Demo. 代码很简单,实现效果图: 源代码: 源代码: 这里主要是xml布局文件实现: MainActivity: package com.android_drawableresource; import android.app.Activity; import android.os.Bund

android开发最常用例子整理----(1)自定义按钮实现

android开发最常用例子整理----(1)自定义按钮实现 一.Activity MainActivity.java源码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

Android 自定义EditText输入框 带清空按钮

总结  Android 自定义EditText输入框 带清空按钮 当用户输入字符后  EditText会自动在输入框的内部右侧出现删除按钮 重写EditText达到简化布局的效果 效果图: 继承EditText package com.example.myedittexttest; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; imp

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,