最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現(xiàn)view拖動到任意位置

 更新時間:2021年04月14日 17:36:08   作者:yabayaoya  
這篇文章主要為大家詳細介紹了Android實現(xiàn)view拖動到任意位置,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

定義

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,這兩個獲取的數(shù)據(jù)已經(jīng)是經(jīng)過處理的,容易出現(xiàn)圖片抖動的情況
            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:
                     //抬起手后自動彈回原處,監(jiān)聽animatorSet
                        animatorSet.cancel();
                        break;
                }
                return true;
            }
        });

判斷拖動是否正確,m是img的半徑,拖動結(jié)合的難易可以自己調(diào)劑算法

//判斷拖動是否正確,m是img的半徑,拖動結(jié)合的難易可以自己調(diào)劑算法
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;
    }

監(jiān)聽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) {

            }
 });

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android自定義View實現(xiàn)隨機驗證碼

    Android自定義View實現(xiàn)隨機驗證碼

    這篇文章主要介紹了Android自定義View實現(xiàn)隨機驗證碼的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android實現(xiàn)原生分享功能

    Android實現(xiàn)原生分享功能

    這篇文章主要介紹了Android實現(xiàn)原生分享功能,只能分享文字和圖片,不能單獨分享圖片或者文字,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳解Android Service 使用時的注意事項

    詳解Android Service 使用時的注意事項

    這篇文章主要介紹了詳解Android Service 使用時的注意事項,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • flutter Toast實現(xiàn)消息提示框

    flutter Toast實現(xiàn)消息提示框

    這篇文章主要為大家詳細介紹了flutter Toast實現(xiàn)消息提示框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 2013年 移動App設(shè)計13項注意細節(jié)總結(jié)

    2013年 移動App設(shè)計13項注意細節(jié)總結(jié)

    在過去的一年里,移動成主流也讓眾多的移動應(yīng)用如雨后春筍般層出不窮,在眾多開發(fā)者從中獲利的同時競爭也愈演愈烈,如何才能保證自己立于不敗之地接下來介紹移動App設(shè)計的13大精髓感興趣的朋友可以了解下啊
    2013-01-01
  • Android自定義圓角ImageView

    Android自定義圓角ImageView

    這篇文章主要介紹了Android自定義圓角ImageView的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android開發(fā)框架MVC-MVP-MVVM-MVI的演變Demo

    Android開發(fā)框架MVC-MVP-MVVM-MVI的演變Demo

    這篇文章主要為大家介紹了Android開發(fā)框架MVC-MVP-MVVM-MVI的演變Demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • android RecycleView實現(xiàn)下拉刷新和上拉加載

    android RecycleView實現(xiàn)下拉刷新和上拉加載

    這篇文章主要為大家詳細介紹了android RecycleView實現(xiàn)下拉刷新和上拉加載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Android使用Handler實現(xiàn)View彈性滑動

    Android使用Handler實現(xiàn)View彈性滑動

    這篇文章主要介紹了Android使用Handler實現(xiàn)View彈性滑動,介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Kotlin中協(xié)程的創(chuàng)建過程詳析

    Kotlin中協(xié)程的創(chuàng)建過程詳析

    使用協(xié)程的專業(yè)開發(fā)者中有超過 50% 的人反映使用協(xié)程提高了工作效率,下面這篇文章主要給大家介紹了關(guān)于Kotlin中協(xié)程創(chuàng)建過程的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01

最新評論

芷江| 瑞丽市| 阿克陶县| 尼木县| 莱西市| 陇川县| 伊宁市| 黄石市| 乌兰县| 突泉县| 漠河县| 和林格尔县| 花莲市| 南阳市| 甘泉县| 栾川县| 革吉县| 永川市| 象山县| 阿克苏市| SHOW| 宝应县| 安康市| 潜山县| 洛隆县| 额济纳旗| 六枝特区| 池州市| 大渡口区| 南和县| 旬阳县| 白城市| 犍为县| 昌黎县| 岳阳市| 新和县| 安化县| 鞍山市| 宿迁市| 鹰潭市| 莆田市|