这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图

这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是只有一个Button的,另一份就是像上图,就是多了一个imagview!先看下代码吧,比较简单:

  1. public class DraftTest extends Activity implements OnTouchListener{
  2. /** Called when the activity is first created. */
  3. int screenWidth;
  4. int screenHeight;
  5. int lastX;
  6. int lastY;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. DisplayMetrics dm = getResources().getDisplayMetrics();
  12. screenWidth = dm.widthPixels;
  13. screenHeight = dm.heightPixels - 50;
  14. Button button=(Button)findViewById(R.id.btn);
  15. ImageView imageView=(ImageView)findViewById(R.id.btn2);
  16. imageView.setOnTouchListener(this);
  17. button.setOnTouchListener(this);
  18. }
  19. @Override
  20. public boolean onTouch(View v, MotionEvent event) {
  21. // TODO Auto-generated method stub
  22. int action=event.getAction();
  23. Log.i("@@@@@@", "Touch:"+action);
  24. //Toast.makeText(DraftTest.this, "λ�ã�"+x+","+y, Toast.LENGTH_SHORT).show();
  25. switch(action){
  26. case MotionEvent.ACTION_DOWN:
  27. lastX = (int) event.getRawX();
  28. lastY = (int) event.getRawY();
  29. break;
  30. /**
  31. * layout(l,t,r,b)
  32. * l  Left position, relative to parent
  33. t  Top position, relative to parent
  34. r  Right position, relative to parent
  35. b  Bottom position, relative to parent
  36. * */
  37. case MotionEvent.ACTION_MOVE:
  38. int dx =(int)event.getRawX() - lastX;
  39. int dy =(int)event.getRawY() - lastY;
  40. int left = v.getLeft() + dx;
  41. int top = v.getTop() + dy;
  42. int right = v.getRight() + dx;
  43. int bottom = v.getBottom() + dy;
  44. if(left < 0){
  45. left = 0;
  46. right = left + v.getWidth();
  47. }
  48. if(right > screenWidth){
  49. right = screenWidth;
  50. left = right - v.getWidth();
  51. }
  52. if(top < 0){
  53. top = 0;
  54. bottom = top + v.getHeight();
  55. }
  56. if(bottom > screenHeight){
  57. bottom = screenHeight;
  58. top = bottom - v.getHeight();
  59. }
  60. v.layout(left, top, right, bottom);
  61. Log.i("@@@@@@", "position��" + left +", " + top + ", " + right + ", " + bottom);
  62. lastX = (int) event.getRawX();
  63. lastY = (int) event.getRawY();
  64. break;
  65. case MotionEvent.ACTION_UP:
  66. break;
  67. }
  68. return false;
  69. }
  70. }

高度减去50是减去状态栏和标题栏的高度。

  1. case MotionEvent.ACTION_DOWN:
  2. lastX = (int) event.getRawX();
  3. lastY = (int) event.getRawY();
  4. break;

然后获取控件一开始的位置,然后在ACTION_MOVIE中:

  1. int dx =(int)event.getRawX() - lastX;
  2. int dy =(int)event.getRawY() - lastY;
  3. int left = v.getLeft() + dx;
  4. int top = v.getTop() + dy;
  5. int right = v.getRight() + dx;
  6. int bottom = v.getBottom() + dy;
  7. if(left < 0){
  8. left = 0;
  9. right = left + v.getWidth();
  10. }
  11. if(right > screenWidth){
  12. right = screenWidth;
  13. left = right - v.getWidth();
  14. }
  15. if(top < 0){
  16. top = 0;
  17. bottom = top + v.getHeight();
  18. }
  19. if(bottom > screenHeight){
  20. bottom = screenHeight;
  21. top = bottom - v.getHeight();
  22. }
  23. v.layout(left, top, right, bottom);
  24. Log.i("@@@@@@", "position��" + left +", " + top + ", " + right + ", " + bottom);
  25. lastX = (int) event.getRawX();
  26. lastY = (int) event.getRawY();

getLeft()方法得到的是控件左边坐标距离父控件原点(左上角,坐标(0,0))的y轴距离,getRight()是控件右边距离父控件原点的y轴距离,同理,getTop和getButtom是距离的x轴距离。

  1. if(left < 0){
  2. left = 0;
  3. right = left + v.getWidth();
  4. }
  5. if(right > screenWidth){
  6. right = screenWidth;
  7. left = right - v.getWidth();
  8. }
  9. if(top < 0){
  10. top = 0;
  11. bottom = top + v.getHeight();
  12. }
  13. if(bottom > screenHeight){
  14. bottom = screenHeight;
  15. top = bottom - v.getHeight();
  16. }

这里的判断是为了是控件不超出屏幕以外,即:到达边界以后,不能再移动。

  1. v.layout(left, top, right, bottom);

设置View的位置。

有一点忘记说了,就是像ImageView和TextView这些控件,要想实现拖动,要在xml文件中设置它的clickable为true。

  1. android:clickable="true"

就这样,这些就是这个demo的全部内容。

最后,是代码的下载地址:

http://download.csdn.net/detail/aomandeshangxiao/4187376,

http://download.csdn.net/detail/aomandeshangxiao/4189910

Android控件拖动的实现的更多相关文章

  1. android控件拖动,移动、解决父布局重绘时控件回到原点

    这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置 // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷 ...

  2. Android控件介绍

    1. 介绍 Android控件大多位于android.widget, android.view.View为他们的父类对于Dialog系列, android.app.Dialog为父类 Android的 ...

  3. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  4. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  5. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  6. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

  7. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...

  8. UIAutomator定位Android控件的方法

    UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...

  9. 从Android系统出发,分析Android控件构架

    从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ...

随机推荐

  1. sqlserver 分页查询总结

    sqlserver2008不支持关键字limit ,所以它的分页sql查询语句将不能用mysql的方式进行,幸好sqlserver2008提供了top,rownumber等关键字,这样就能通过这几个关 ...

  2. C#学习之------委托

    1.向窗体中添加控件的最少步骤:                 窗体的句柄为this private System.Windows.Forms.Button button1;             ...

  3. 2013移动APP界面设计趋势与设计理念

    用户是上帝,一切还得从应用说起.为此,国外著名的应用设计师Gannon Burgett结合自己多年实战经验归纳总结了2013年App设计发展的13大趋势.我们应该时刻记着这13点. 1.扁平化设计—— ...

  4. 应用之间进行跳转,ComponentName的方式

    从应用A跳转到应用B, 关键代码如下: 有以下几个注意点: 1.ComponentName cn = new ComponentName("com.terry", "co ...

  5. Codeforces 489A SwapSort

    这题第一次看的时候以为是区间替换,后来发现看错了,只是单纯的元素替换. 解题思路: 先对输入的序列加个数组排个序 遍历下来,如果和排序后的结果当前元素不同,设当前位置为 i, 则往下面找,设查找位置为 ...

  6. Week3(9月23日):例子更Powerful更完整了,哇咔咔

    Part I:提问  =========================== 1.控制器中动作方法的返回类型有哪些? 2.如果控制器代码如下,请问浏览器中如何输入什么路由访问? public clas ...

  7. 创建.NET Core项目

    创建.NET Core项目 ? 对于.NET开发人员来说,我们已经习惯了VS这个世界上最强大的IDE,所以对他们来说,项目的创建直接利用安装到VS中相应的项目模板即可.当.NET Core跨出了Win ...

  8. 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    WS_CLIPCHILDREN,使得父窗体在绘制时留出其上的子窗体的位置不去画它,而那片区域留着子窗体去画.WS_CLIPSIBLINGS,必须用于子窗体,使得该子窗体在收到WM_PAINT时同时令其 ...

  9. HTTP 301 跳转和302跳转的区别

    常用的重定向方式有: 301 redirect, 302 redirect 与 meta fresh: 301 redirect::301代表永久性转移(Permanently Moved),301重 ...

  10. Mybatis3 框架理解

    最近工作比较闲,维护一个政府机关的短信发送平台,大部分业务逻辑都在Oracle数据库上,但自己明明应聘的是Java开发啊!!!整天写存储过程的我还是有一颗写高级语言的心啊!!!好吧!!!先找个数据库方 ...