zoukankan      html  css  js  c++  java
  • Android自己定义button实现长按功能

                                                   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(); } }


     

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6757682.html
Copyright © 2011-2022 走看看