android控件拖动,移动、解决父布局重绘时控件回到原点
这是主要代码: 保证其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就好了
- /**
- *
- * @description 设置意见反馈,用以灰度发布
- * @author zhongwr
- * @params
- * @update 2016年1月12日 下午5:36:07
- */
- private ImageView getFeedBackView() {
- ImageView ivFeedback = new ImageView(BaseActivity.this);
- ivFeedback.setImageResource(R.drawable.fuli_feedback);
- RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
- lpFeedback.setMargins(0, 0, 20, 218);
- lpFeedback.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
- lpFeedback.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
- ivFeedback.setLayoutParams(lpFeedback);
- ivFeedback.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {// 意见反馈
- FeedBackActivity.startInstance(BaseActivity.this);
- }
- });
- return ivFeedback;
- }
- private boolean isIntercept = false;
- /** 按下时的位置控件相对屏幕左上角的位置X */
- private int startDownX;
- /** 按下时的位置控件距离屏幕左上角的位置Y */
- private int startDownY;
- /** 控件相对屏幕左上角移动的位置X */
- private int lastMoveX;
- /** 控件相对屏幕左上角移动的位置Y */
- private int lastMoveY;
- /**
- *
- * @description 拖动意见反馈位置
- * @author zhongwr
- * @params
- * @update 2016年1月14日 下午5:08:26
- */
- private void setFeedBackViewDragTouch(ImageView ivFeedBack) {
- ivFeedBack.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- int action = event.getAction();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- startDownX = lastMoveX = (int) event.getRawX();
- startDownY = lastMoveY = (int) event.getRawY();
- break;
- case MotionEvent.ACTION_MOVE:
- int dx = (int) event.getRawX() - lastMoveX;
- int dy = (int) event.getRawY() - lastMoveY;
- 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 > mScreenWidth) {
- right = mScreenWidth;
- left = right - v.getWidth();
- }
- if (top < 0) {
- top = 0;
- bottom = top + v.getHeight();
- }
- if (bottom > mScreenHeight) {
- bottom = mScreenHeight;
- top = bottom - v.getHeight();
- }
- v.layout(left, top, right, bottom);
- lastMoveX = (int) event.getRawX();
- lastMoveY = (int) event.getRawY();
- break;
- case MotionEvent.ACTION_UP:
- int lastMoveDx = Math.abs((int) event.getRawX() - startDownX);
- int lastMoveDy = Math.abs((int) event.getRawY() - startDownY);
- if (0 != lastMoveDx || 0 != lastMoveDy) {
- isIntercept = true;
- } else {
- isIntercept = false;
- }
- // 每次移动都要设置其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);
- break;
- }
- return isIntercept;
- }
- });
- }
demo:demo
android控件拖动,移动、解决父布局重绘时控件回到原点的更多相关文章
- winform控件大小改变是防止背景重绘导致的闪烁(转载)
在工作中需要做一个伸缩控件,这个自定义控件继承于Panel.这个伸缩控件分为两个部分,头部是一个自定义组件,伸缩控件的背景为灰色,头部背景要求白色.伸缩控件在点击按钮时会重绘,同时他内部的控件也会重绘 ...
- 重绘MenuStrip 控件
重绘MenuStrip控件 效果如图: 首先添加 CustomProfessionalRenderer类 用于重绘控件菜单样式 /// <summary> /// 自定义MenuStrip ...
- iOS - 布局重绘机制相关方法的研究
iOS View布局重绘机制相关方法 布局 - (void)layoutSubviews - (void)layoutIfNeeded- (void)setNeedsLayout —————————— ...
- 重绘panel控件,实现panel的阴影效果
最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...
- Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题
本文涉及的代码案例可以在下方的链接中找到,如果对你有帮助,请给个Star(#^.^#) https://github.com/CodeTillDoom/StaggeredRcl 问题分析 这段时间业务 ...
- Android控件进阶-自定义流式布局和热门标签控件
技术:Android+java 概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...
- Android学习Scroller(五)——具体解释Scroller调用过程以及View的重绘
PS: 该篇博客已经deprecated,不再维护.详情请參见 站在源代码的肩膀上全解Scroller工作机制 http://blog.csdn.net/lfdfhl/article/detail ...
- Android 布局中 如何使控件居中
首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...
- 【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸
以下利用一个app来说明怎样利用自己定义View的重绘实现拖动移动.获取组件的尺寸. 例如以下图,触摸拖动,或者轻轻点击屏幕都能移动图片.假设碰到文字,则会弹出提示. 这里是利用自己定义View的重绘 ...
随机推荐
- 结构体指针之 段错误 具体解释(segmentation fault)
一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3 ...
- JS与Jquery的事件委托
参考:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委 ...
- Jquery 中的CheckBox、 RadioButton、 DropDownList的取值赋值
1.获取选中值,三种方法都可以: $('input:radio:checked').val(): $("input[type='radio']:checked").val(); $ ...
- 【树莓派】树莓派Android相关资料
树莓派完美运行最新 Android 7.0 牛轧糖: https://linuxstory.org/android-7-0-nougat-on-raspberry-pi/ Raspberry Pi 3 ...
- To LACP or not to LACP (on a 5.1 vDS)
http://www.poppingclouds.com/2012/12/20/to-lacp-or-not-to-lacp-on-a-5-1-vds-2/ I have been recently ...
- Linux中使用GoAccess进行日志实时监控
一.用法命令: goaccess access_log -o /var/www/html/report.html --real-time-html 说明:请先安装Httpd和Goaccess 二.效果 ...
- sql assist字符匹配智能提示
- oracle 快速复制表结构、表数据
1.情景展示 根据现有的表,建一个新的表,要求:新表的结构与原有表的表结构一模一样,如何快速实现? 根据现有的表,建一个新的表,要求:新表的结构.数据与原表一模一样,如何实现快速复制旧表? 2.解 ...
- SQL Manager Lite可视化工具部分中英对照
.Refresh //刷新表数据 .compile,//提交数据. .connect to host //链接到服务器 .disconnect from all databases //断开链接 . ...
- Ubuntu18.04使用f3probe检测U盘实际容量
项目主页 https://fight-flash-fraud.readthedocs.io/ 使用f3probe 能快速检测出被测U盘的实际容量, 命令 $ sudo f3probe --destru ...