from: http://my.oschina.net/castusz/blog/66338

下面是activity的代码:

  1. public class DraftTest extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_draft_test);
  6. DisplayMetrics dm = getResources().getDisplayMetrics();
  7. final int screenWidth = dm.widthPixels;
  8. final int screenHeight = dm.heightPixels - 50;
  9. // 拖动的按钮
  10. final Button b = (Button) findViewById(R.id.startBtn);
  11. // 添加触摸事件
  12. b.setOnTouchListener(new OnTouchListener() {
  13. int lastX, lastY; // 记录移动的最后的位置
  14. public boolean onTouch(View v, MotionEvent event) {
  15. // 获取Action
  16. int ea = event.getAction();
  17. Log.i("TAG", "Touch:" + ea);
  18. switch (ea) {
  19. case MotionEvent.ACTION_DOWN: // 按下
  20. lastX = (int) event.getRawX();
  21. lastY = (int) event.getRawY();
  22. break;
  23. /**
  24. * layout(l,t,r,b) l Left position, relative to parent t Top
  25. * position, relative to parent r Right position, relative to
  26. * parent b Bottom position, relative to parent
  27. * */
  28. case MotionEvent.ACTION_MOVE: // 移动
  29. // 移动中动态设置位置
  30. int dx = (int) event.getRawX() - lastX;
  31. int dy = (int) event.getRawY() - lastY;
  32. int left = v.getLeft() + dx;
  33. int top = v.getTop() + dy;
  34. int right = v.getRight() + dx;
  35. int bottom = v.getBottom() + dy;
  36. if (left < 0) {
  37. left = 0;
  38. right = left + v.getWidth();
  39. }
  40. if (right > screenWidth) {
  41. right = screenWidth;
  42. left = right - v.getWidth();
  43. }
  44. if (top < 0) {
  45. top = 0;
  46. bottom = top + v.getHeight();
  47. }
  48. if (bottom > screenHeight) {
  49. bottom = screenHeight;
  50. top = bottom - v.getHeight();
  51. }
  52. v.layout(left, top, right, bottom);
  53. Log.i("aaa", "position:" + left + ", " + top + ", " + right
  54. + ", " + bottom);
  55. // 将当前的位置再次设置
  56. lastX = (int) event.getRawX();
  57. lastY = (int) event.getRawY();
  58. break;
  59. case MotionEvent.ACTION_UP: // 脱离
  60. break;
  61. }
  62. return false;
  63. }
  64. });
  65. }
  66. @Override
  67. public boolean onCreateOptionsMenu(Menu menu) {
  68. // Inflate the menu; this adds items to the action bar if it is present.
  69. getMenuInflater().inflate(R.menu.activity_draft_test, menu);
  70. return true;
  71. }
  72. }

配置文件activity_draft_test.xml的内容:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:padding="0px"
  6. tools:context=".DraftTest" >
  7. <Button
  8. android:id="@+id/startBtn"
  9. android:text="tuodongdeanniu"
  10. android:layout_centerInParent="true"
  11. android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  12. </RelativeLayout>

转载于:https://blog.51cto.com/memory/1087179

Android下图片或按钮等可拖动到任意位置的效果实现源码相关推荐

  1. 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )

    文章目录 一. 使用前台 Service 提高应用进程优先级 1. 前台 Service 代码 2. 前台 Service 代码 3. 启动服务 二.效果展示 三.源码资源 一. 使用前台 Servi ...

  2. 自定义Android带图片的按钮

    自定义Android带图片的按钮 前言 现在移动设备的按钮设计讲究大图标小文字,希望用户只要一看到图标便能知道这个按钮是干嘛的,但又要有必要的文字提示,最常见的就数搜索按钮了,上面一个大大的放大镜图标 ...

  3. android毕业设计——基于Android+XAMPP+MySQL的家校互动平台设计与实现(毕业论文+程序源码)——家校互动平台

    基于Android+XAMPP+MySQL的家校互动平台设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+XAMPP+MySQL的家校互动平台设计与实现,文章末尾附有本毕业设 ...

  4. android毕业设计——基于Android+Java+Python的手机端办公自动化OA系统设计与实现(毕业论文+程序源码)——办公自动化OA系统

    基于Android+Java+Python的手机端办公自动化OA系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+Java+Python的手机端办公自动化OA系统设计与实 ...

  5. VC/MFC拖动窗口任意位置移动窗口

    除了拖动标题栏移动窗口以外,我们也可以拖动窗口任意位置(除控件)位置而使对话框移动. 这里只讲述基于对话框的程序 class c**dlg:public CDialog { //Constructio ...

  6. Android列表收缩与展开仿QQ好友列表(非常详细,附源码)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同 ...

  7. 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】

    javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...

  8. Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码

    Android录屏并利用FFmpeg转换成gif(二) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...

  9. android studio增加一个界面,Android Studio在同一个窗口中打开多个Project【附效果图附源码...

    Android Studio在同一个窗口中打开多个Project[附效果图附源码 Android Studio在同一个窗口中打开多个Project[附效果图附源码]

  10. 教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中。(附源码)

    教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中.(附源码) 代码展示: 保存在各自的文件夹中 美么? 让我们开始爬虫之路 开发环境 windows 10 python3. ...

最新文章

  1. OpenCV | OpenCV将图像转换成黑白图像(二进制)
  2. eclipse启动出错的解决方案:org.osgi.framework.BundleExcep...
  3. spring-servlet.xml与applicationContext.xml
  4. 使用C#开发ActiveX控件[Obsolete]
  5. SELECT TOP column FROM table [ORDER BY column [DESC]]
  6. 【深度学习torch——error】——“xxx.pt is a zip archive(did you mean to use torch.jit.load()?)
  7. [你必须知道的.NET]第十六回:深入浅出关键字---using全接触
  8. LeetCode 1835. 所有数对按位与结果的异或和(位运算 (ab)^(ac) = a(b^c) )
  9. 富文本编辑器 java_HtmlBox富文本编辑器的使用
  10. 每日小记 2017 2.9
  11. LeetCode最长回文子串
  12. 用python生成密码本(不同模式不同密码)
  13. 如何判断Activity是否在前台显示
  14. 远程访问计算机硬盘,60秒远程访问路由器硬盘!瞬间变NAS!
  15. 第三方网络广告平台窘境
  16. indesign怎么查找拼音_Indesign中怎么给汉字加拼音
  17. MATLAB-修改图片的背景颜色
  18. 程序员的选择,技术or管理
  19. java 判断一个数是否是素数详解
  20. BLE蓝牙的广播类型

热门文章

  1. matlab条形图颜色矩阵,Matlab条形图 – 根据符号和大小填充不同颜色的条形图
  2. 写的网页标题乱码,怎么办?
  3. LINUX右键打开方式,如何同时存在多种应用?
  4. 分析华为毕昇JDK8:一个性能开关
  5. 不续签合同,凭什么要求别人紧急加班
  6. 少谈设计模式,多谈基本功
  7. Python3中Dict不能在循环中删除元素
  8. OpenCV绘制文字的代码及Mat/IplImage的转换
  9. 高速路上车辆组队链接的想法
  10. iOS锁屏代码注意使用新接口