拖动视图时设置自定义锚点

2023-11-22

我正在使用 Android Drag&Drop API,并尝试将拖动阴影的锚点设置为触摸发生的点View。默认行为是将锚点放在中间View.

我做了一些研究,看来这可以通过覆盖来完成onProvideShadowMetrics (Point shadowSize, Point shadowTouchPoint)方法中的DragShadowBuilder班级。据我了解,如果我改变 x,y 坐标shadowTouchPoint它应该修改拖动锚点的坐标。

我所做的就是延长DragShadowBuilder像这样的类:

class EventDragShadowBuilder extends DragShadowBuilder {

    int touchPointXCoord, touchPointYCoord;

    public EventDragShadowBuilder() {
        super();
    }

    public EventDragShadowBuilder(View view, int touchPointXCoord,
            int touchPointYCoord) {

        super(view);
        this.touchPointXCoord = touchPointXCoord;
        this.touchPointYCoord = touchPointYCoord;
    }

    @Override
    public void onProvideShadowMetrics(Point shadowSize,
            Point shadowTouchPoint) {

        shadowTouchPoint.set(touchPointXCoord, touchPointYCoord);

        super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
    }
}

In the Fragment在我使用拖放的地方,我创建了两个侦听器来启动拖动事件View:

mEventLongClickListener = new OnLongClickListener() {

    @Override
    public boolean onLongClick(View view) {

        EventDragShadowBuilder shadowBuilder = new EventDragShadowBuilder(
            view, mEventTouchXCoord, mEventTouchYCoord);

        view.startDrag(null, shadowBuilder, view, 0);

        return true;
    }
};

// We need this listener in order to get the corect coordinates for the
// drag shadow
mEventTouchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        final int action = event.getAction();

        switch (action & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: {
            mEventTouchXCoord = (int) event.getX();
            mEventTouchYCoord = (int) event.getY();
            break;
        }
        }
        return false;
    }
};

我设置了两个听众:

itemView.setOnLongClickListener(mEventLongClickListener);
itemView.setOnTouchListener(mEventTouchListener);

到这里一切都好。但是当我测试应用程序并开始拖动过程​​时,拖动阴影位于触摸点下方的中心。因此它使用默认行为。我尝试调试,我发现mEventTouchXCoord and mEventTouchYCoord设置正确。方法shadowTouchPoint.set(touchPointXCoord, touchPointYCoord);获得正确的坐标,但仍然以阴影为中心。

我不知道我做错了什么。也许我误解了API。任何帮助或提示将不胜感激。


好的,就像斯库普所说的,问题出在onProvideShadowMetrics()方法。事实是,如果我删除超级构造函数,super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);,它将不再显示拖动阴影。

仔细查看 API 方法,我发现:

public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
    final View view = mView.get();
    if (view != null) {
        shadowSize.set(view.getWidth(), view.getHeight());
        shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
    } else {
        Log.e(View.VIEW_LOG_TAG, "Asked for drag thumb metrics but no view");
    }
}

所以确实,它重置了shadowTouchPoint到拖动的中间View。但它也会将拖动阴影初始化为正确的尺寸。虽然我希望正确设置拖动阴影尺寸,但我不想重置shadowTouchPoint.

实现此目的最简单的方法是调用超级构造函数before初始化shadowTouchPoint使用自定义值,如下所示:

@Override
public void onProvideShadowMetrics(Point shadowSize,
    Point shadowTouchPoint) {

    super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);

    shadowTouchPoint.set(touchPointXCoord, touchPointYCoord);    
}

另一种解决方案是处理拖动阴影View你自己并完全跳过超级构造函数。我会回来提供详细的更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拖动视图时设置自定义锚点 的相关文章

  • 即使我单击“运行”,Eclipse 也会运行调试模式

    Eclipse 总是在调试模式下启动我的应用程序 即使我单击常规的 运行 按钮 有任何想法吗 我发现我必须重新启动 Xoom 才能使其再次正常工作
  • 使用 ColorMatrix 调整亮度

    我正在尝试使用 ColorMatrix 调整图像的亮度 当尝试调整色相时 您可以在 Photoshop 中看到此选项 亮度和亮度也是两个不同的功能 但我不知道要更改哪些值才能实现此目的 目前我可以使用此代码更改色调 public stati
  • 如何在Android上获取当前播放曲目的路径[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想编写一个应用程序将当前播放的音乐流式传输到另一台设备 两个设备之间的连接确实有效 我还可以通过 wifi 传输一些字符串 但在获取
  • 如何以编程方式判断蓝牙设备是否已连接?

    我了解如何获取已配对设备的列表 但如何判断它们是否已连接 这一定是可能的 因为我看到它们列在我手机的蓝牙设备列表中 并且它说明了它们的连接状态 将蓝牙权限添加到您的AndroidManifest中
  • ndk-build error.opencv2/core/core.hpp:没有这样的文件或目录

    我在 Android 中使用 OpenCV Nonfree 模块时遇到问题 我读了这个教程https sites google com site wghsite technical notes sift surf opencv androi
  • 如何从Slog中查看日志

    如何查看 Slog API 生成的日志 是否有任何选项可以查看系统缓冲区中的日志 我的意思是查看我们使用的无线电缓冲区的日志 adb logcat b 无线电 而这个日志是由Android的Log类生成的 Slog API 的输出在哪里 怎
  • Android 中图像字节表示的每像素字节数

    我目前正在编写一个Android应用程序 需要在其中使用OCR 为了实现这一点 我将 Tesseract 与tesseract android tools 项目 http code google com p tesseract androi
  • 如何连接到Google Play服务并加载排行榜

    我想将我的游戏与 Google Play 服务连接 我已阅读有关 Android 开发人员的文档 并尝试遵循输入数字示例 但仍然无法加载排行榜 我有导入baseGameUtils 但我使用andengine 所以我没有使用来自谷歌的exte
  • 使用 jQuery 的 .trigger('dragstart') 实现 HTML5 的拖放功能时如何 .setData/.getData

    当使用 jQuery 的 trigger dragstart 在具有 ondragstart drag event 属性的元素上触发函数时 如何使用 setData getData 实现 HTML5 在触摸设备上的拖放 流程示例 用户通过
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • Android - 使用 SAX 解析器解析大文件

    我正在尝试使用 SAX 解析器解析来自 webservice 的 xml 数据 当我尝试使用 URL 解析数据 大小 7 4MB 时 它工作正常 但是当我从 URL 复制 xml 数据并放置 xml 文件时 size 7 4MB 在raw文
  • 旋转 Google 地图中的两层标记图标

    在我的应用程序中 我向地图添加了一定数量的标记 如下所示 private fun addMarker googleMap GoogleMap location Location val options MarkerOptions optio
  • Fresco:滚动 RecyclerView 后图像消失

    我有一个 Horizo ntal RecyclerView 每个项目都有一个使用 Facebook Fresco 图像库加载到其中的图像 然而 虽然正确的图像最初是在屏幕上滚动一点时加载的 但当 RecyclerView 进一步滚动时 它就
  • 如何让surfaceview透明

    大家好 我想让我的 DrawingSurface 视图透明 我尝试了很多东西 但它不起作用 这是我的 xml 代码 使我的表面视图透明
  • Android:从 PhoneGap 应用打开 Play 商店链接

    我想从我的phonegap 3 4 应用程序打开一个指向Google Play 商店的链接 呼唤market details id com google android apps maps导致 ActivityNotFoundExcepti
  • Android 两个 Activity 之间的共享元素转换不起作用

    在我的应用程序中 我尝试使用新引入的活动之间共享的元素 如果共享元素具有固定位置 例如 android layout gravity top 但是当视图被锚定时问题就出现了 我的第一个活动如下所示
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • 如何从另一个活动更新 Recyclerview 数据

    我有两个活动 MainActivity 和 Addlogactivity 我正在更新 Addlogactivity 中的数据 该数据应显示在 mainactivity recyclerview 中 数据未在数据库中更新 MianActivi
  • 将主题应用到 v7 支持操作栏

    我正在使用support v7库来实现ActionBar在我的应用程序中 我的styles xml file
  • Android Webview隐私浏览

    我在我的 Android 应用程序中使用 webview 从多个站点获取一些网页 我对 webview 行为有一些疑问 webview 是否存储历史记录 cookie 表单自动填充信息 如果是的话 我们可以阻止它这样做吗 如果 Webvie

随机推荐

  • FindFirstChangeNotification 两次通知更改

    我想监视文件系统中的文件夹 假设我想监视文件夹 C MyNewFolder 我有这个代码来做到这一点 HANDLE ChangeHandle FindFirstChangeNotification T C MyNewFolder FALSE
  • 我应该使用 JavaScript 还是服务器渲染此模板?

    我正在渲染新闻提要 我计划使用 Backbone js 来处理我的 javascript 内容 因为我厌倦了使用 JQuery 进行手动 DOM 绑定 所以现在我正在考虑两个选择 当用户加载页面时 新闻源 容器是空白的 但该页面会触发 Ja
  • 数据库 [dbName] 不可访问。 (对象资源管理器)

    我在使用 SQL Server 2008 R2 时遇到问题 我最近遇到了计算机问题 因此我必须重新启动 Windows 并且必须将一个用户的权限授予另一用户 使用属性中的安全功能 但最初授予权限时 会显示 访问被拒绝 消息 经过大量研究后
  • 当 jac=False 时不使用雅可比行列式进行近似时,“牛顿 CG 方法需要雅可比行列式”?

    我正在使用 scipy optimize minimize 进行优化 并尝试使用以下方法 Newton CG dogleg 和 trust ncg 据我了解 对于这些方法 需要目标函数的雅可比行列式 但是 那文档表明如果 jac 设置为 F
  • iOS 7 中的静默推送通知不起作用

    在 WWDC 2013 的 多任务处理的新增功能 演示中 有一个关于静默推送通知的部分 看起来很简单 根据演示 如果发送 APS 负载时仅将 content available 设置为 1 则用户将不会收到通知 A This doesn t
  • TFS 2017 Build 自动启动并不断失败

    我有一个 TFS 2017 服务器版本 它链接到一个位存储桶 Git 存储库 构建设置为当主控更改时自动启动 这工作得很好 如果我手动启动 master 或分支的构建也工作得很好 但我不断收到这些随机启动的失败构建项目收集服务帐户 他们总是
  • Python / Scipy - 将optimize.curve_fit的sigma实现到optimize.leastsq中

    我正在使用逻辑模型拟合数据点 由于有时我的数据存在 ydata 错误 因此我首先使用 curve fit 及其 sigma 参数在拟合中包含我个人的标准差 现在我切换到leastsq 因为我还需要一些curve fit无法提供的拟合优度估计
  • 如何在我的页面操作弹出窗口中获取当前打开的选项卡的 URL?

    我想创建一个扩展来自动登录我的服务器 因此 我创建了一个后台页面来检查当前 URL 如果它符合我的 URL 正则表达式 我将显示页面操作图标 单击页面操作后 我将打开一个包含一些字段的弹出窗口 我需要获取当前打开的 URL 并将其填充到弹出
  • C++ CSV 解析(引号内包含逗号)

    我正在构建一个 C CSV 数据解析器 我正在尝试访问文件的第一列和第十五列 并使用以下命令将它们读入两个数组getline命令 例如 for int j 0 j
  • php pdo准备重复变量

    在编写pdo语句时 是否可以重复变量的值 我是说 query UPDATE users SET firstname name WHERE firstname name stmt dbh gt prepare query stmt gt ex
  • Spring/Hibernate 异常:createCriteria 在没有活动事务的情况下无效

    我花了几天时间研究 spring hibernate transaction 问题 我使用 jaxws spring hibernate 创建一个简单的 web 服务 它工作正常 但是当我调用使用事务 bean spring 的 web 方
  • spring boot 2 + feign + eureka 客户端不会将服务名称解析为 URL

    我正在尝试使用 spring cloud Finchley SR1 来启动 spring boot 2 0 5 并尝试使用 Eureka 作为发现服务器和 Feign Ribbon 作为客户端来设置两个服务之间的通信 设置非常简单 尽管我尝
  • 遍历一个c#方法并分析方法体

    在 C 中遍历 methodinfo 最简单的方法是什么 我想遍历方法体并查找字段引用等并检索类型 在 System Reflection 中有 mi GetMethodBody GetILAsByteArray 这有点低级 在我能够遍历身
  • 为什么 HttpWebResponse 上没有 Dispose 方法

    HttpWebReponse实施IDisposable界面 但是为什么没有Dispose方法 它只包含Close方法 将using这门课还可以使用模式吗 HttpWeb响应实施明确的 IDisposable 接口 所以你可以打电话Dispo
  • 我的 WPF 自定义控件 Datacontext 正在取代父控件

    在我的主窗口中 我尝试绑定到bool 但它正在寻找我的自定义控件DataContext反而 如果我不分配DataContext在用户控件中 则主窗口的绑定可以工作 但是 显然 这会阻止用户控件中的绑定 这是错误 System Windows
  • 将图像置于 div 中居中?

    我在 div 中有一个像这样的图像 div img div 图像是动态的 没有固定的大小 div 的大小200px by 200px 图像尺寸事先未知 如果图像的大小大于190px by 190px 将其设置为190px by 190px
  • 无法加载类型“System.Web.Mvc.ViewUserControl

    我正在尝试将 ASP NET MVC 2 项目 VS2010 部署到 Win Server 2008 R2 它在开发机器上完美运行 但是在Server 2008 R2上出现了奇怪的错误 当 ascx 文件具有使用泛型类型的标头时 服务器报告
  • QString 到 char* 的转换

    我试图通过以下方法将 QString 转换为 char 类型 但它们似乎不起作用 QLineEdit line new QLineEdit just to describe what is line here QString temp li
  • 将字符串列表转换为空格分隔的字符串

    我使用下划线来表示未知单词的长度 如何只打印下划线而不使用代表列表的括号 基本上 如果我有一个表格列表 我想打印下划线而不用列表语法将它们打印为 这对你有用吗 gt gt gt my dashes gt gt gt print join m
  • 拖动视图时设置自定义锚点

    我正在使用 Android Drag Drop API 并尝试将拖动阴影的锚点设置为触摸发生的点View 默认行为是将锚点放在中间View 我做了一些研究 看来这可以通过覆盖来完成onProvideShadowMetrics Point s