buttonをドラッグして境界を出ない

3171 ワード

ネットで調べたドラッグbuttonのコードを改善しました.の
画面を超えることはありません.
 DisplayMetrics dm = getResources().getDisplayMetrics();
 final int screenWidth = dm.widthPixels;
 final int screenHeight = dm.heightPixels - 50;
setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.btn);
        btn.setOnTouchListener(new View.OnTouchListener() {
            int[] temp = new int[]{0, 0};
            public boolean onTouch(View v, MotionEvent event) {
                int eventaction = event.getAction();
                //getRawX()--> x 
                int x = (int) event.getRawX();
                //getRawY()--> y , (50), getRawY() 50
                int y = (int) event.getRawY();
                switch (eventaction) {
                    case MotionEvent.ACTION_DOWN: 
                        //getX()--> x , x ,
                        //  getY(), (50 ),
                        temp[0] = (int) event.getX();
                        temp[1] = y - v.getTop();
                        Log.d(TAG, "x->" + x + ", y->" + y + ", v.getTop()->" + v.getTop());
                        Log.d(TAG, "temp[0]->" + temp[0] + ", temp[1]->" + temp[1]);
                        break;
                    case MotionEvent.ACTION_MOVE: 
                        int ll = x - temp[0];
                        int tt = y - temp[1];
                        int rr = x + v.getWidth() - temp[0];
                        int bb = y - temp[1] + v.getHeight();
                        Log.i(TAG, "ll->" + ll + ", rr->" + rr + ", tt->" + tt + ", bb->" + bb + ", temp[0]->" + temp[0] + ", temp[1]->" + temp[1]);
                        if (ll < 0) {
                            ll = 0;
                            rr = v.getWidth();
                        }
                        if (rr > screenWidth) {
                            rr = screenWidth;
                            ll = rr - v.getWidth();
                        }
                        if (tt < 0) {
                            tt = 0;
                            bb = v.getHeight();
                        }
                        if (bb > screenHeight) {
                            bb = screenHeight;
                            tt = bb - v.getHeight();
                        }
                        v.layout(ll, tt, rr, bb);
                        Log.d(TAG, "ll->" + ll + ", rr->" + rr + ", tt->" + tt + ", bb->" + bb + ", temp[0]->" + temp[0] + ", temp[1]->" + temp[1]);
                        v.postInvalidate();
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return false;
            }
        });

注釈の点に注意