码迷,mamicode.com
首页 > 移动开发 > 详细

Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

时间:2018-04-05 01:21:00      阅读:336      评论:0      收藏:0      [点我收藏+]

标签:margin   case   范围   drag   控制   事件冲突   getheight   getrawx   pre   

以自定义ImageView为例:

 

/**
 * 可拖拽ImageView
 * Created by admin on 2017/2/21.
 */
public class FloatingImageView extends ImageView{


    public FloatingImageView(Context context) {
        super(context);
    }

    public FloatingImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FloatingImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public FloatingImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    

    int startX;
    int startY;
    int left;
    int top;
    int[] temp = new int[]{ 0, 0 };
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean isMove = false;
        int x = (int) event.getRawX();
        int y = (int) event.getRawY();
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN: // touch down so check if the
                startX = x;
                startY = y;
                temp[0] = (int) event.getX();
                temp[1] = y - getTop();
                break;
            case MotionEvent.ACTION_MOVE: // touch drag with the ball
                left = x - temp[0];
                top = y - temp[1];
                if(left < 0){//控制左边界不超出
                    left = 0;
                }
                layout(left, top, left + getWidth(),top + getHeight());//自由拖拽
                break;
            case MotionEvent.ACTION_UP:
                if (Math.abs(x - startX) > 2 || Math.abs(y - startY) > 2){//判断是否移动,再一定范围内不算是移动,解决触发事件冲突
                    //将最后拖拽的位置定下来,否则页面刷新渲染后按钮会自动回到初始位置
                    //注意父容器
                    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
                    lp.setMargins(left, top,0,0);
                    setLayoutParams(lp);
                    //确定是拖拽
                    isMove = true;
                 }
                break;
        }
        return isMove ? true : super.onTouchEvent(event);
     }
}

Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

标签:margin   case   范围   drag   控制   事件冲突   getheight   getrawx   pre   

原文地址:https://www.cnblogs.com/xgjblog/p/8719508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!