• 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

  • 相关阅读:
    unity3d-----Collider 组件参考
    Activity使用Dialog样式导致点击空白处自动关闭的问题
    Android中fragment之间和Activity的传值、切换
    android获取屏幕宽高与获取控件宽高
    SQL表两列取一列唯一值的记录
    android addJavascriptInterface 不能生效 解决办法
    Android用ImageView显示本地和网上的图片
    调用webservice时,产生android.os.NetworkOnMainThreadException错误
    EditText输入小数
    ListView 删除item删除不了的问题解决办法
  • 原文地址:https://www.cnblogs.com/xgjblog/p/8722992.html
Copyright © 2020-2023  润新知