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

xiaoxiao2021-02-28  96

[java]  view plain  copy   

转自 http://blog.csdn.net/zhongwn/article/details/50519873

作者:小钟视野

这是主要代码: 保证其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 /**       *        * @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(0020218);           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(), 00);                       v.setLayoutParams(lpFeedback);                       break;                   }                   return isIntercept;               }           });       }  

demo:http://download.csdn.net/detail/zhongwn/9404411

转载请注明原文地址: https://www.6miu.com/read-34296.html

最新回复(0)