Android自己定义button实现长按功能

通过自己定义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", "自己定义button处理单击"); }
});
Btn1.setOnLongClickListener(new View.OnLongClickListener() { @Override
public boolean onLongClick(View v) {
Log.i("huahua", "自己定义button处理长按一次对应");
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; /**
* button长按时 间隔多少毫秒来处理 回调方法
*/
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; } /**
* 长按监听接口,使用button长按的地方应该注冊此监听器来获取回调。 */
public interface LongTouchListener { /**
* 处理长按的回调方法
*/
void onLongTouch();
}
}

Android自己定义button实现长按功能的更多相关文章

  1. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  2. C# 利用 Time 组件实现 Button 控件的长按功能

    参考链接:https://blog.csdn.net/yongh701/article/details/50134379 如果在C#窗体,单纯点击按钮,之后将鼠标长时间放在这个按钮上,不放开,双击按钮 ...

  3. Android自己定义控件而且使其能够在xml中自己定义属性

    为什么要自己定义View android开发中自己定义View的优点是显而易见的.比方说以下的这个顶部导航,它被设计出如今应用的每一个界面,但每次的内容却不尽同样.我们不能在每一个layout资源中都 ...

  4. ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量- ...

  5. 【Android】3.15 短串分享功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 短串分享是指,用户搜索查询后得到的每一个地理位置结果将会对应一条短串(短链接),用户可以通过短信.邮 ...

  6. 【Android】3.14 公交线路查询功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 利用BusLineSearch方法可查询公交线路的详情信息. 二.运行截图 简介:介绍查询公交线路功 ...

  7. Android自己定义View的实现方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了.回 ...

  8. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  9. 【Android自己定义View实战】之自己定义超简单SearchView搜索框

    [Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...

随机推荐

  1. python模拟鼠标和键盘操作

    import win32api import win32con import win32gui from ctypes import * import time VK_CODE = { 'backsp ...

  2. docker从零开始 存储(六)存储驱动如何选择

    Docker存储驱动程序 理想情况下,将非常少的数据写入容器的可写层,并使用Docker卷来写入数据.但是,某些工作负载要求您能够写入容器的可写层.这是存储驱动程序的用武之地. Docker使用可插拔 ...

  3. python2.7.12自带pip吗?

    是的,在安装python2.7.12时自带pip安装包,可以在python安装包Scripts下面可以看到.

  4. MATLAB求函数零点与极值

    1.      roots函数 针对多项式求零点(详见MATLAB多项式及多项式拟合) 2.      fzero函数 返回一元函数在某个区间内的的零点. x0 = fzero(@(x)x.^2-3* ...

  5. Java通过jedis操作redis(增删改查)

    package sgh.main.powersite; import java.util.ArrayList; import java.util.HashMap; import java.util.I ...

  6. LayerDate渲染多个class出现闪现问题的解决

    填写表单的时候有时候会需要添加一行表单的业务逻辑,而表单要用到LayerDate的话便不可避免的出现多个class的情况 这种情况下后面的class是无法渲染的,layerDate官网提出了解决方法: ...

  7. 内存可见性,指令重排序,JIT。。。。。。从一个知乎问题谈起

    在知乎上看到一个问题<java中volatile关键字的疑惑?>,引起了我的兴趣 问题是这样的: package com.cc.test.volatileTest; public clas ...

  8. Mysql错误:Every derived table must have its own alias

    Mysql报错:Every derived table must have its own alias    <缺少一个别名> 在子查询中经常会犯的错误 .这个别名其实没啥用途....  ...

  9. redhat 安装 setuptools【成功】

    1. wget --no-check-certificate http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py ...

  10. HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)

    6326.Problem H. Monster Hunter 题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP.求从 1 号点出 ...