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就好了

 

[java] view plain copy
 
  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:demo

posted @ 2018-04-05 16:06  新感觉  阅读(1099)  评论(0编辑  收藏  举报