Android控件的拖动

Android控件的拖动,主要是通过设置控件的setOnTouchListener()方法,重写它的onTouch()方法。然后通过MotionEvent的不同事件,进行判断,主要是在MotionEvent.ACTION_MOVE中不断重绘控件在画布中的位置,而实现拖动的效果。

  

public class DragViewActivity extends AppCompatActivity {
    private Button btn_drag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drag_view);


        // 获取屏幕的宽高
        DisplayMetrics dm = getResources().getDisplayMetrics();
        final int screenWith = dm.widthPixels;
        final int screenHeight = dm.heightPixels;

        btn_drag = (Button) findViewById(R.id.btn_drag);
        btn_drag.setOnTouchListener(new View.OnTouchListener() {
                int lastX;
                int lastY;
                boolean isDraging = false;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int ee = event.getAction();
                switch (ee){
                    case MotionEvent.ACTION_DOWN:
                        isDraging = true;
                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (isDraging){
                            // x轴方向的位移差
                            int dx = (int) event.getRawX() - lastX;
                            //  y轴方向的位移差
                            int dy = (int) event.getRawY() - lastY;

                            int l = v.getLeft() + dx;
                            int t = v.getTop() + dy;
                            int r = v.getRight() + dx;
                            int b = v.getBottom() + dy;

                            // 判断超出屏幕
                            if (l < 0){
                                l = 0;
                                r = l + v.getWidth();
                            }
                            if (t < 0){
                                t = 0;
                                b = t + v.getHeight();
                            }
                            if (r > screenWith){
                                r = screenWith;
                                l = r - v.getWidth();
                            }
                            if (b > screenHeight){
                                b = screenHeight;
                                t = b - v.getHeight();
                            }

                            // 重绘view
                            v.layout(l, t, r, b);
                            v.postInvalidate();

                            lastX = (int) event.getRawX();
                            lastY = (int) event.getRawY();
                        }
                        break;

                    case  MotionEvent.ACTION_UP:
                        isDraging = false;
                        break;
                    default:
                        break;
                }
                return false;
            }
        });
    }

你可能感兴趣的:(Android控件的拖动)