这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置

// 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷新时)则移动的view会回到原来的位置
RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lpFeedback.leftMargin = v.getLeft();
lpFeedback.topMargin = v.getTop();
lpFeedback.setMargins(v.getLeft(), v.getTop(), 0, 0);
v.setLayoutParams(lpFeedback);

思路是:当view的位置发生改变时,也要相应改变其layoutparams,否则父布局重绘时,由于view的layoutparams没发生改变导致重绘的时候会回到原点,所以只要改变其params就好了

  1. /**
  2. *
  3. * @description 设置意见反馈,用以灰度发布
  4. * @author zhongwr
  5. * @params
  6. * @update 2016年1月12日 下午5:36:07
  7. */
  8. private ImageView getFeedBackView() {
  9. ImageView ivFeedback = new ImageView(BaseActivity.this);
  10. ivFeedback.setImageResource(R.drawable.fuli_feedback);
  11. RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams(
  12. RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  13. lpFeedback.setMargins(0, 0, 20, 218);
  14. lpFeedback.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
  15. lpFeedback.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  16. ivFeedback.setLayoutParams(lpFeedback);
  17. ivFeedback.setOnClickListener(new OnClickListener() {
  18. @Override
  19. public void onClick(View v) {// 意见反馈
  20. FeedBackActivity.startInstance(BaseActivity.this);
  21. }
  22. });
  23. return ivFeedback;
  24. }
  25. private boolean isIntercept = false;
  26. /** 按下时的位置控件相对屏幕左上角的位置X */
  27. private int startDownX;
  28. /** 按下时的位置控件距离屏幕左上角的位置Y */
  29. private int startDownY;
  30. /** 控件相对屏幕左上角移动的位置X */
  31. private int lastMoveX;
  32. /** 控件相对屏幕左上角移动的位置Y */
  33. private int lastMoveY;
  34. /**
  35. *
  36. * @description 拖动意见反馈位置
  37. * @author zhongwr
  38. * @params
  39. * @update 2016年1月14日 下午5:08:26
  40. */
  41. private void setFeedBackViewDragTouch(ImageView ivFeedBack) {
  42. ivFeedBack.setOnTouchListener(new OnTouchListener() {
  43. @Override
  44. public boolean onTouch(View v, MotionEvent event) {
  45. int action = event.getAction();
  46. switch (action) {
  47. case MotionEvent.ACTION_DOWN:
  48. startDownX = lastMoveX = (int) event.getRawX();
  49. startDownY = lastMoveY = (int) event.getRawY();
  50. break;
  51. case MotionEvent.ACTION_MOVE:
  52. int dx = (int) event.getRawX() - lastMoveX;
  53. int dy = (int) event.getRawY() - lastMoveY;
  54. int left = v.getLeft() + dx;
  55. int top = v.getTop() + dy;
  56. int right = v.getRight() + dx;
  57. int bottom = v.getBottom() + dy;
  58. if (left < 0) {
  59. left = 0;
  60. right = left + v.getWidth();
  61. }
  62. if (right > mScreenWidth) {
  63. right = mScreenWidth;
  64. left = right - v.getWidth();
  65. }
  66. if (top < 0) {
  67. top = 0;
  68. bottom = top + v.getHeight();
  69. }
  70. if (bottom > mScreenHeight) {
  71. bottom = mScreenHeight;
  72. top = bottom - v.getHeight();
  73. }
  74. v.layout(left, top, right, bottom);
  75. lastMoveX = (int) event.getRawX();
  76. lastMoveY = (int) event.getRawY();
  77. break;
  78. case MotionEvent.ACTION_UP:
  79. int lastMoveDx = Math.abs((int) event.getRawX() - startDownX);
  80. int lastMoveDy = Math.abs((int) event.getRawY() - startDownY);
  81. if (0 != lastMoveDx || 0 != lastMoveDy) {
  82. isIntercept = true;
  83. } else {
  84. isIntercept = false;
  85. }
  86. // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷新时)则移动的view会回到原来的位置
  87. RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams(
  88. RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  89. lpFeedback.leftMargin = v.getLeft();
  90. lpFeedback.topMargin = v.getTop();
  91. lpFeedback.setMargins(v.getLeft(), v.getTop(), 0, 0);
  92. v.setLayoutParams(lpFeedback);
  93. break;
  94. }
  95. return isIntercept;
  96. }
  97. });
  98. }

demo:demo

android控件拖动,移动、解决父布局重绘时控件回到原点的更多相关文章

  1. winform控件大小改变是防止背景重绘导致的闪烁(转载)

    在工作中需要做一个伸缩控件,这个自定义控件继承于Panel.这个伸缩控件分为两个部分,头部是一个自定义组件,伸缩控件的背景为灰色,头部背景要求白色.伸缩控件在点击按钮时会重绘,同时他内部的控件也会重绘 ...

  2. 重绘MenuStrip 控件

    重绘MenuStrip控件 效果如图: 首先添加 CustomProfessionalRenderer类 用于重绘控件菜单样式 /// <summary> /// 自定义MenuStrip ...

  3. iOS - 布局重绘机制相关方法的研究

    iOS View布局重绘机制相关方法 布局 - (void)layoutSubviews - (void)layoutIfNeeded- (void)setNeedsLayout —————————— ...

  4. 重绘panel控件,实现panel的阴影效果

    最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...

  5. Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题

    本文涉及的代码案例可以在下方的链接中找到,如果对你有帮助,请给个Star(#^.^#) https://github.com/CodeTillDoom/StaggeredRcl 问题分析 这段时间业务 ...

  6. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  7. Android学习Scroller(五)——具体解释Scroller调用过程以及View的重绘

    PS: 该篇博客已经deprecated,不再维护.详情请參见  站在源代码的肩膀上全解Scroller工作机制  http://blog.csdn.net/lfdfhl/article/detail ...

  8. Android 布局中 如何使控件居中

    首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...

  9. 【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸

    以下利用一个app来说明怎样利用自己定义View的重绘实现拖动移动.获取组件的尺寸. 例如以下图,触摸拖动,或者轻轻点击屏幕都能移动图片.假设碰到文字,则会弹出提示. 这里是利用自己定义View的重绘 ...

随机推荐

  1. maven中的snapshot来源与注意事项

    maven中的snapshot来源与注意事项 (2012-04-23 15:37:48) 转载▼ 标签: 杂谈 分类: java maven的依赖管理是基于版本管理的,在maven2之后,把版本管理细 ...

  2. dynamic(2) – ExpandoObject的使用

    一,ExpandoObject使用场合 在传递对象,但是又不想创建一个class或者struct的时候,ExpandoObject就是一个非常好的选择. 假如我们有一个SendMail的函数,功能是发 ...

  3. 【树莓派】服务配置相关3:基于Ubuntu Server的服务配置

    该文接续之前写过的两篇: [树莓派]服务配置相关 [树莓派]服务配置相关2:基于RPi Desktop的服务配置 这是我个人用来进行树莓派盒子安装配置的脚本,对于外部其他博友,可以部分参考,但不需要逐 ...

  4. Web Storage与Cookie相比存在的优势:

    (1).存储空间更大:IE8下每个独立的存储空间为10M,其他浏览器实现略有不同,但都比Cookie要大很多. (2).存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一 ...

  5. Docker 命令导图

  6. PhpStorm 2017.1安装及破解过程

    1.下载原安装文件和破解文件:magnet:?xt=urn:btih:7FD357910B7AFBFC8FBA3647A2FAC8F15F0D02F0  (直接放到迅雷里下载) 2.Licence S ...

  7. jqPlot图表插件学习之轴说明和label属性

    一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...

  8. OPML文件

    # -*- coding: cp936 -*-#python 27#xiaodeng#OPML文件 #大纲处理标记语言其实建立在颗脱战标记语言之上的标记语言#也叫文件扩展名#是建立在XML之上的一种文 ...

  9. grep命令-v参数过滤以井号、分号开头的注释信息行及空白行

    grep命令-v参数(反向选择)分别去掉所有以#(井号)和;(分号)开头的注释信息行,对于剩余的空白行可以再用^$来表示并反选过滤 [root@rhel7 samba]# cat smb.conf | ...

  10. data1是字符串?需要加上引号

    07-22 15:55:29.832: E/AndroidRuntime(23914): FATAL EXCEPTION: main 07-22 15:55:29.832: E/AndroidRunt ...