亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現view拖動到任意位置的方法

發布時間:2021-04-14 14:05:28 來源:億速云 閱讀:670 作者:小新 欄目:開發技術

小編給大家分享一下Android實現view拖動到任意位置的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

本文實現:將圖片任意拖動,如果拖動到正確位置則成功,若抬起手時時錯誤位置則自動回到原位。

定義

private ImageView img;
private ImageView imageView;

//容器的寬高,需要在屏幕繪制好之后才能獲取
private int containerWidth;
    private int containerHeight;
    
    private float lastX, lastY;

//獲取需要拖動到的正確位置
 private int[] imgPosition = new int[2];
    private int height;
    private int width;

在屏幕繪制好之后獲取寬高和位置

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        // 這里來獲取容器的寬和高
        if (hasFocus) {
            containerHeight = sunPage.getHeight();
            containerWidth = sunPage.getWidth();
        }
        
        //獲取需要拖動到的正確位置,img處
        img.getLocationInWindow(imgPosition);
        height = img.getMeasuredHeight();
        width = img.getMeasuredWidth();
    }

手勢事件

imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                     //手指在屏幕位置getRawX() getRawY()
                        lastX = event.getRawX();
                        lastY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                    // 不要直接用getX和getY,這兩個獲取的數據已經是經過處理的,容易出現圖片抖動的情況
            float distanceX = xx - event.getRawX();
            float distanceY = yy - event.getRawY();

            float nextY = imageView.getY() - distanceY;
            float nextX = imageView.getX() - distanceX;

            // 不能移出屏幕
            if (nextY < 0) {
                nextY = 0;
            } else if (nextY > containerHeight - imageView.getHeight()) {
                nextY = containerHeight - imageView.getHeight();
            }
            if (nextX < 0)
                nextX = 0;
            else if (nextX > containerWidth - imageView.getWidth())
                nextX = containerWidth - imageView.getWidth();

            // 屬性動畫移動
            ObjectAnimator y = ObjectAnimator.ofFloat(imageView, "y", imageView.getY(), nextY);
            ObjectAnimator x = ObjectAnimator.ofFloat(imageView, "x", imageView.getX(), nextX);

            animatorSet.playTogether(x, y);
            animatorSet.setDuration(0);
            animatorSet.start();
                        lastX = event.getRawX();
                        lastY = event.getRawY();
                        if (correct(lastX, lastY, imgPosition, m)) {
                            //正確后的事情
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                     //抬起手后自動彈回原處,監聽animatorSet
                        animatorSet.cancel();
                        break;
                }
                return true;
            }
        });

判斷拖動是否正確,m是img的半徑,拖動結合的難易可以自己調劑算法

//判斷拖動是否正確,m是img的半徑,拖動結合的難易可以自己調劑算法
private boolean correct(float x, float y, int[] a, int m) {
        float s = (float) Math.sqrt((x - a[0]) * (x - a[0]) + (y - a[1]) * (y - a[1]) - (x - a[0]) * (y - a[1]));
        if (s <= ActivityUtils.dip2px(HomeGameActivity.this, m)) {
            return true;
        }
        return false;
    }

監聽animatorSet,cancle時imageview返回原處

animatorSet.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                imageView.setTranslationY(0);
          imageView.setTranslationX(0);
            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
 });

以上是“Android實現view拖動到任意位置的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陇南市| 巴林左旗| 浙江省| 西青区| 营口市| 兴城市| 五原县| 海林市| 潞城市| 涿州市| 都安| 蚌埠市| 同心县| 普陀区| 绿春县| 葫芦岛市| 阿坝县| 红桥区| 七台河市| 郎溪县| 开阳县| 格尔木市| 托克托县| 东辽县| 木兰县| 泰兴市| 尚志市| 灌云县| 汪清县| 肃宁县| 永善县| 德格县| 商河县| 客服| 秦皇岛市| 开远市| 万载县| 高邑县| 南澳县| 大同市| 嘉善县|