博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android控件拖动,移动、解决父布局重绘时控件回到原点
阅读量:6217 次
发布时间:2019-06-21

本文共 3314 字,大约阅读时间需要 11 分钟。

 

这是主要代码: 保证其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就好了

 

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

 

demo:

转载地址:http://opoja.baihongyu.com/

你可能感兴趣的文章
【游船费问题 - 动态规划】
查看>>
C语言基础第四次作业
查看>>
Nginx reverse proxy NSQAdmin
查看>>
linux的安装和克隆
查看>>
Linux软连接和硬链接(摘录)
查看>>
git 简介
查看>>
spring applicationContext.xml和hibernate.cfg.xml设置
查看>>
Balanced Binary Tree
查看>>
# 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描
查看>>
操作系统常见面试笔试题目
查看>>
UVA 489 Hangman Judge
查看>>
nuxt https
查看>>
Linux运维之系统性能---vmstat工具分析内存的瓶颈
查看>>
(转) android UI进阶之布局的优化(二)
查看>>
PHP Strict standards:Declaration of … should be compatible with that of…(转)
查看>>
打卡2
查看>>
js实现3D切换效果
查看>>
西安拟制定羊肉泡馍肉夹馍制作标准
查看>>
对Java平台的理解
查看>>
JavaWeb网上图书商城完整项目--过滤器解决中文乱码
查看>>