Android Ui控件的拖動實現


實現思路

  • 1 獲取當前window窗體的height /width
  • 2 ui控件的滑動觸摸監聽事件(OnTouchListener())(action_down/action_move/action_up)
  • 3 獲取手勢按下控件的坐標
  • 4 在移動move監聽時算出坐標差 控件原始的坐標加上坐標差就是移動過后的新坐標值

 public classTouchButtonActivityextendsAppCompatActivity{

    privateImageViewicon;

    private intscreenHegiht ;//高度

    private intscreenWidth ;//寬度

    privateSharedPreferencessp;//存儲文件的方式

@Override

protected voidonCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_toch_button);

    //獲取window寬度和高度(sdk13版本使用的方法官方已經廢棄)
    
    /* this.screenHegiht = this.getWindowManager().getDefaultDisplay().getHeight();
    
    this.screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();*/
    
    //官方推薦的方法

    DisplayMetrics metrics = newDisplayMetrics();

    this.getWindowManager().getDefaultDisplay().getMetrics(metrics);

    this.screenHegiht = metrics.heightPixels;

    this.screenWidth = metrics.widthPixels;

    icon = (ImageView) findViewById(R.id.icon_imag);

    //在存儲文件中讀取坐標數據

    sp = this.getSharedPreferences("config", MODE_PRIVATE);//獲取文件存儲方式

    intlastx = this.sp.getInt("lastx", 0);

    intlasty = this.sp.getInt("lasty", 0);

//設置坐標數據到ImageView控件上

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) this.icon

            .getLayoutParams();

    params.leftMargin = lastx;

    params.topMargin = lasty;

    this.icon.setLayoutParams(params);

/**

 * ImageView的滑動監聽事件

 */

    this.icon.setOnTouchListener(newView.OnTouchListener() {

        intstartX;

        intstartY;

@Override

public booleanonTouch(View v, MotionEvent event) {

            switch (event.getAction()) {

                caseMotionEvent.ACTION_DOWN://按下

                this.startX = (int) event.getRawX();

                this.startY = (int) event.getRawY();

                break;

                caseMotionEvent.ACTION_MOVE://移動

                intnewX = (int) event.getRawX();

                intnewY = (int) event.getRawY();

                intdx = newX - this.startX;

                intdy = newY - this.startY;

                intl = TouchButtonActivity.this.icon.getLeft();

                intr = TouchButtonActivity.this.icon.getRight();

                intt = TouchButtonActivity.this.icon.getTop();

                intb = TouchButtonActivity.this.icon.getBottom();

                intnewt = t + dy;

                intnewb = b + dy;

                intnewl = l + dx;

                intnewr = r + dx;

                if ((newl < 0) || (newt < 0)

                        || (newr > TouchButtonActivity.this.screenWidth)

                        || (newb > TouchButtonActivity.this.screenHegiht)) {

                    break;

                }

                TouchButtonActivity.this.icon.layout(newl, newt, newr, newb);

                this.startX = (int) event.getRawX();

                this.startY = (int) event.getRawY();

                break;

                caseMotionEvent.ACTION_UP://手指抬起

                intlastx = TouchButtonActivity.this.icon.getLeft();

                intlasty = TouchButtonActivity.this.icon.getTop();

                SharedPreferences.Editor editor = TouchButtonActivity.this.sp.edit();

                editor.putInt("lastx", lastx);

                editor.putInt("lasty", lasty);

                editor.commit();

                break;

                default:

                    break;

            }

            return true;//true事件傳遞OnTouch消費不再向上一級傳遞false在一次傳遞到上一級操作頁面

        }

    });

}

}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容