zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味
    打包场景出错
    探讨 .NET 4 新增的 SortedSet 类
    error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
    安卓机在按HOME键时,UNITY触发的APPLICATION_PAUSE事件
    有几个Pass,对象就会绘制几次
    华东师范大学2017年高等代数考研试题
    华东师范大学2017年数学分析考研试题
    无穷级数的收敛性
    南开大学2017年数学分析高等代数考研试题
  • 原文地址:https://www.cnblogs.com/xgjblog/p/8722992.html
Copyright © 2011-2022 走看看