目前想到的最好的解决方法,大家有更好的欢迎告知。

问题:在一个view中有一个按钮,要求可以通过点按移动这个按钮,同时单纯的点击而不移动这个按钮的话可以跳转到新的Activity。

遇到的困难:按钮的移动好实现,通过OnTouch的MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE以及MotionEvent.ACTION_UP可以实现,但是如果同时实现OnTouch和OnClick方法,会导致冲突。关于这方面的理论网上回答的很好,下面我写出我的解决方法。

按钮移动示例代码如下(转自网友):

public boolean onTouch(View v, MotionEvent event) {
int action=event.getAction();
Log.i("@@@@@@", "Touch:"+action); switch(action){
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY(); break;
/**
* layout(l,t,r,b)
* l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent
* */
case MotionEvent.ACTION_MOVE: int dx = (int)event.getRawX() - lastX;
int dy = (int)event.getRawY() - lastY; move(v, dx, dy);
break; case MotionEvent.ACTION_UP: break;
}
return false;
} private void move(View v, int dx, int dy){
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
if(left < 0){
left = 0;
right = left + v.getWidth();
}
if(right > screenWidth){
right = screenWidth;
left = right - v.getWidth();
}
if(top < 0){
top = 0;
bottom = top + v.getHeight();
}
if(bottom > screenHeight){
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
Log.i("@@@@@@", "position��" + left + ", " + top + ", " + right + ", " + bottom);
}

解决问题的核心方法是:

不要为这个按钮提供OnClick的方法,也就是不添加OnClickListener,OnClick的方法调用在OnTouch方法中实现。

具体描述:

添加一个boolean的全局变量初始化为false(表示按钮不移动),一旦触发了OnTouch中的MotionEvent.ACTION_MOVE,那么就表示按钮发生了移动,不触发点击动作,待触发了MotionEvent.ACTION_UP,就不发生动作并且把这个全局变量变为初始化的false;反之,如果没有移动,那么就触发点击动作。

最新文章

  1. java-通过JDBC操作数据库
  2. HTTP协议—— 简单认识TCP/IP协议
  3. 使用JQuery UI selectmenu, onchange事件失效
  4. WebService 生成类的命令语句
  5. Android总结篇系列:Android Service
  6. LVS + Keepalived + Nginx安装及配置
  7. AndroidPn
  8. 【BZOJ-1853&amp;2393】幸运数字&amp;Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝
  9. css中的定位和框模型问题
  10. C语言和数据结构的书单-再次推荐
  11. u盘安装centos
  12. UVALive - 3938:&quot;Ray, Pass me the dishes!&quot;
  13. ActiveMQ系列之三:理解和掌握JMS
  14. python 捕获异常顺序
  15. Python_线程、线程效率测试、数据隔离测试、主线程和子线程
  16. jmeter counter函数问题
  17. vue 组件发布记录
  18. 福布斯最佳雇主榜:谷歌母公司Alphabet再登榜首 微软次之
  19. VS2012智能感知变英文解决办法
  20. Excel查看某列的重复值

热门文章

  1. 【Android端APP 安装包检查】安装包检查具体内容及实现方法
  2. db2 重启
  3. XCode 7.3.1(dmg) 官方直接下载地址
  4. Linux 流程控制语句 if else、for、while、until
  5. geoServer 发布geoTiff格式的DEM数据
  6. 数据库执行sql报错Got a packet bigger than &#39;max_allowed_packet&#39; bytes及重启mysql
  7. Maven web项目三种运行方式
  8. IOS开发之网络图片处理
  9. VS 快捷键(待完善)
  10. nginx新增绑定域名