OnTouchListener和OnCliskListener

在Android App应用中,OnTouch事件表示触摸事件,本章我们通过滑过图像获取当前位置理解其具体用法。

单击事件很简单,这里只说一个问题:isPressed()方法。

 /** 
 * 点击事件 
 *  
 * @author mark 
 *  
 */  
final class ClickListener implements OnClickListener {    
    @Override  
    public void onClick(View v) {  
        switch (v.getId()) {  
        case BTN:  
            if (v.isPressed()) {  
                btn.setText("单击按钮成功!");  
            } else {  
                btn.setBackgroundColor(Color.BLUE);  
            }  
            /*if (!v.isPressed()) { 
                btn.setBackgroundColor(Color.BLUE); 
            }*/  
            break;  
        }  
    }  
}  

点击Button可以触发该事件,if (v.isPressed()) 下面的代码可以执行,但是如 else 后面的或者注释掉的 if(! v.isPressed()) 代码不会被执行。

如果你想捕捉Button的按下与弹起的动作,需要实现OnTouchListener接口。最后再说这个问题

在开发中需要将长按事件如单击事件一起使用,现在我们去实现。写长按事件的代码

 /** 
 * 长按事件 
 *  
 * @author mark 
 *  
 */  
final class LongListener implements OnLongClickListener {    
    @Override  
    public boolean onLongClick(View v) {  
        btn.setText("长按按钮成功!");  
        return false;  
    }  
}  

为Button设置事件监听:

btn.setOnClickListener(new ClickListener());  
btn.setOnLongClickListener(new LongListener()); 

  运行之后会发现,长按该Button不仅可以触发长按事件,而且还会触发单击事件,怎么办?

很简单,那就是在OnLongClickListener 事件中处理事件之后,告诉其它事件(这里是单击事件onClick)不要再来参与即可。修改代码如下:

 /** 
 * 长按事件 
 *  
 * @author mark 
 *  
 */  
final class LongListener implements OnLongClickListener {    
    @Override  
    public boolean onLongClick(View v) {  
        btn.setText("长按按钮成功!");  
        // return false;  
        return true;  
    }  
}  

可以看出,单击事件与长按事件分开了。
最后,我们讨论一下如何捕捉Button 的按下与弹起事件。实现代码:

/** 
 * 触摸事件 
 *  
 * @author mark 
 *  
 */  
final class TouchListener implements OnTouchListener {    
    @Override  
    public boolean onTouch(View v, MotionEvent event) {  
        if (event.getAction() == KeyEvent.ACTION_DOWN) {  
            btn.setText("已经按下按钮");  
        }  
        if (event.getAction() == KeyEvent.ACTION_UP) {  
            btn.setText("按钮已经弹起");  
        }  
        return true;// 返回true的话,单击事件、长按事件不可以被触发  
        // return false;  
    }  
}  

完整代码实例:

package mark.zhang;    
import android.app.Activity;  
import android.graphics.Color;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Gravity;  
import android.view.KeyEvent;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.View.OnLongClickListener;  
import android.view.View.OnTouchListener;  
import android.widget.Button;  
import android.widget.LinearLayout;   
public class TestActivity extends Activity {  
    private static final int BTN = 0x10;   
    private Button btn = null;    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        // 必须先装载该布局文件,否则报空指针异常  
        setContentView(R.layout.main);  
        LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
        // 布局参数设定  
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(120, 50);  
        lp.gravity = Gravity.CENTER;  
        // 创建Button并设置参数  
        btn = new Button(this);  
        btn.setText("Click me");  
        btn.setId(BTN);  
        btn.setLayoutParams(lp);  
        // 加入当前视图  
        ll.addView(btn);  
        // 为Button设置监听器  
        btn.setOnClickListener(new ClickListener());  
        btn.setOnTouchListener(new TouchListener());  
        btn.setOnLongClickListener(new LongListener());  
    }    
    /** 
     * 点击事件 
     *  
     * @author mark 
     *  
     */  
    final class ClickListener implements OnClickListener {    
        @Override  
        public void onClick(View v) {  
            switch (v.getId()) {  
            case BTN:  
                if (v.isPressed()) {  
                    btn.setText("单击按钮成功!");  
                    Log.d("mark", "onclick");  
                } else {  
                    btn.setBackgroundColor(Color.BLUE);  
                }  
                /* 
                 * if (!v.isPressed()) { btn.setBackgroundColor(Color.BLUE); } 
                 */  
                break;  
            }  
        }  
    }    
    /** 
     * 长按事件 
     *  
     * @author mark 
     *  
     */  
    final class LongListener implements OnLongClickListener {    
        @Override  
        public boolean onLongClick(View v) {  
            btn.setText("长按按钮成功!");  
            // return false;  
            return true;  
        }  
    }    
    /** 
     * 触摸事件 
     *  
     * @author mark 
     *  
     */  
    final class TouchListener implements OnTouchListener {    
        @Override  
        public boolean onTouch(View v, MotionEvent event) {  
            if (event.getAction() == KeyEvent.ACTION_DOWN) {  
                btn.setText("已经按下按钮");  
            }  
            if (event.getAction() == KeyEvent.ACTION_UP) {  
                btn.setText("按钮已经弹起");  
            }  
            return true;// 返回true的话,单击事件、长按事件不可以被触发  
            // return false;  
        }  
    }  
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值