热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现view拖动到任意位置

这篇文章主要为大家详细介绍了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) {

            }
 });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 直播带货系统中的推流技术详解
    本文介绍了RTMP(实时消息传输协议)及其在直播带货系统中的应用,并详细探讨了带货直播系统的连麦方案,包括服务端合流和客户端合流的优势与劣势。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文介绍了Memcached分布式集群中的取模算法和一致性哈希算法的原理及其对缓存命中率的影响。通过详细分析,探讨了如何优化这些算法以提高系统的稳定性和性能。 ... [详细]
  • 单片机编程为何偏爱C语言
    尽管现代有许多高级编程语言如Java、Python等,但单片机编程依然广泛使用C语言。本文将探讨C语言在单片机编程中的优势及其原因。 ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • 短暂的人生中,IT和技术只是其中的一部分。无论换工作还是换行业,最终的目标是成功、荣誉和收获。本文探讨了技术人员如何跳出纯技术的局限,实现更大的职业发展。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 专业人士如何做自媒体 ... [详细]
  • 本文总结了《编程珠玑》第12章关于采样问题的算法描述与改进,并提供了详细的编程实践记录。参考了其他博主的总结,链接为:http://blog.csdn.net/neicole/article/details/8518602。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • PHP实现汉诺塔算法
    昨天研究了一天汉诺塔算法都没搞懂,感觉自己智商被碾压了,还不如《猩球崛起》中的那一只猩猩!!!起源传说最早发明这个问题的人是法国数学家『爱德华·卢卡斯』。在世界中心贝拿勒斯(在印度 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
author-avatar
英英2502927137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有