所有的View都可以实现onTouchListener,我们可以监听此方法去获取控件的坐标,

然后重绘控件的位置

上个图:

import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageButton; import android.widget.Toast; public class DraftButtonActivity extends Activity {        @Override       public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.main);            DisplayMetrics dm = getResources().getDisplayMetrics();            final int screenWidth = dm.widthPixels;            final int screenHeight = dm.heightPixels - 50;            final ImageButton btn = (ImageButton) findViewById(R.id.btn);            btn.setOnTouchListener(new OnTouchListener() {                int lastX, lastY;                @Override               public boolean onTouch(View v, MotionEvent event) {                    // TODO Auto-generated method stub                   int ea = event.getAction();                    Log.i("TAG", "Touch:" + ea);                    switch (ea) {                    case MotionEvent.ACTION_DOWN:                        lastX = (int) event.getRawX();// 获取触摸事件触摸位置的原始X坐标                        lastY = (int) event.getRawY();                        break;                    case MotionEvent.ACTION_MOVE:                       int dx = (int) event.getRawX() - lastX;                        int dy = (int) event.getRawY() - lastY;                       int l = v.getLeft() + dx;                       int b = v.getBottom() + dy;                        int r = v.getRight() + dx;                        int t = v.getTop() + dy;                       // 下面判断移动是否超出屏幕                        if (l < 0) {                            l = 0;                           r = l + v.getWidth();                        }                        if (t < 0) {                          t = 0;                            b = t + v.getHeight();                        }                        if (r > screenWidth) {                            r = screenWidth;                            l = r - v.getWidth();                       }                        if (b > screenHeight) {                            b = screenHeight;                           t = b - v.getHeight();                       }                        v.layout(l, t, r, b);                        lastX = (int) event.getRawX();                       lastY = (int) event.getRawY();                        Toast.makeText(DraftButtonActivity.this,                                "当前位置:" + l + "," + t + "," + r + "," + b,                                Toast.LENGTH_SHORT).show();                       v.postInvalidate();                        break;                                       case MotionEvent.ACTION_UP:                      break;                   }                   return false;                }            });        }    }

转载于:https://www.cnblogs.com/android-html5/archive/2011/07/26/2534125.html

可拖拽的ImageButton相关推荐

  1. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...

    Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮 前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP) ...

  2. Android 可拖拽悬浮按钮

    转自http://www.jianshu.com/p/ba3e5fc5cff1 实现思路 通过重写控件的onTouchEvent方法监听触摸效果. 通过View的setX()和setY()方法实现移动 ...

  3. Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理...

    我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来 ...

  4. vant组件实现上传图片裁剪_如何用 120 行代码,实现交互完整的拖拽上传组件?...

    作者 | 前端劝退师 责编 | 伍杏玲 你将在该篇学到: 如何将现有组件改写为 React Hooks函数组件 useState.useEffect.useRef是如何替代原生命周期和Ref的. 一个 ...

  5. Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)

    为用户提供的拖曳功能很直观,在很多桌面应用程序中,复制或移动对象都可以通过拖曳来完成. 基于MIME类型的拖曳数据传输是基于QDrag类的.QMimeData对象将关联的数据与其对应的MIME类型相关 ...

  6. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  7. 【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)

    <divclass='dragged':index="$index"draggable='true'@dragstart="dragstart"@drag ...

  8. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)

    <div class='dragged'></div> //初始化需要拖拽的列initDrags() {var arr = document.querySelectorAll( ...

  9. 【墙裂推荐】【原生基础版】js原生实现拖拽效果,注意不要忘了div的cursor用grab和grabbing 还是古法炮制、传统工艺的原生代码兼容性最好,推荐

    以下方式的劣势就是在放弃拖拽那一刻会触发click事件,通常如果被拖拽元素还有其他点击事件,会重复触发,往往并非业务需求.优势就是-额-貌似这段代码没什么屌优势! <div class='dra ...

最新文章

  1. Linux C编程--临时文件
  2. php星期和时间获取
  3. python opencv 摄像头截图_python opencv捕获摄像头并显示内容
  4. WPS 2000使用技巧点滴
  5. ZC公司员工评分系统——后台查询合成DataTable
  6. 安装Oracle XE 18c
  7. (48)性能测试——聚合报告
  8. Flutter-防京东商城项目-提交订单、去支付页面制作-44
  9. c++头文件iomanip.h中的setw、setprecision、setfill和setbase函数的使用
  10. 创业篇之七:利益法则
  11. Java 二进制与十六进制字符串相互转换
  12. IO流 输入流、输出流、字节流、字符流、转换流、及Properties类
  13. java 日期加减天数、月数、年数的计算方式
  14. anu - proptypes
  15. 十代服务器芯片组,【十代处理器主板芯片组个人整理汇总一览】包含总结和分析...
  16. RTX3090 windows cuda11.0 cudnn pytorch nightly试用版
  17. 【Github】fatal: remote error: You can't push to git 解决办法
  18. 这是一个盗版和强盗的社会
  19. 在这里!修练成一个值得托付的人,焦虑会顿减......
  20. html表格怎么拆分

热门文章

  1. Python中纠结处之其一—— 静态方法、类方法
  2. FCKeditor使用详解
  3. 【LuKS】Vba if not c is nothing
  4. post传参部分数据丢失
  5. 63. Unique Paths II
  6. 使用 UIWebView 来播放视频
  7. CSS中的EM属性-弹性布局
  8. freemarker入门教程
  9. mysql导入导出.sql数据
  10. python字符串split_「干货」Python字符串中的split方法