当前位置: 首页 > 知识库问答 >
问题:

Android setX()和setY()行为怪异

孟绪
2023-03-14

我试图在Android活动中动态创建并移动图像。然而,setX()和setY()方法似乎无法正常工作。第一次创建和放置图像时,它会正确设置图像的位置,但任何更新图像的尝试都会导致图像放置在错误的位置。例如,图像在以下代码上移动:

ImageView image;
RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_this);

if(action == MotionEvent.ACTION_DOWN){

    image = new ImageView(MyClass.this);                            
    layout.addView(image, width, height);   
    image.setX(206);
    image.setY(206);
}
else if(action == MotionEvent.ACTION_MOVE){

    if(image != null){
        image.setX(206);
        image.setY(206);
    }
}

在动作_MOVE时,即使x和y位置值保持不变,图像也会移动。图像的父对象保持不变。大小保持不变。如果我得到x和y值,它仍然会说206,但它不再位于活动的(206206)处。我不明白为什么会这样。我找不到任何迹象表明图像已经被改变,除了它实际改变了位置。

共有3个答案

许琛
2023-03-14

根据文档,setTranslationX是:

设置此视图相对于其左侧位置的水平位置。这将有效地定位对象的布局后位置,以及对象布局放置的位置。

setX是:

设置此视图的可视x位置(以像素为单位)。这等效于将平移X属性设置为传入的x值与当前左属性之间的差值。

因此,您可以将SetTranslsationX视为一个相对偏移:将3个像素移到正常位置的左侧。setX是一个固定的位置:移动任何你必须的东西,这样你就可以在坐标X处画图。

柳韬
2023-03-14

遇到同样的问题<代码>视图。setLeft(int)/视图。setTop(int)对我有用。

请注意,由于这个答案的原始帖子发生了变化,而且在较新的android版本上,它可能会产生意想不到的结果,而在较旧的版本上,它却为我带来了意想不到的效果。因此,如果你瞄准的是旧设备(Android 3和以下),这可能会有帮助,但是对于更通用的解决方案,请在这里考虑其他的答案。

周正真
2023-03-14

真的,这不应该发生。或者,试着设置另一个变量,并为其设置x和y,或者获取x和y,并在相同的位置上为每个变量添加0。

正如Android中所述——使用视图。setX()和setY在api 8中,如果您已经搜索过,还有另一个解决方案甚至在api 8之前也可以使用<代码>布局参数的工作原理如下-

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //WRAP_CONTENT param can be FILL_PARENT
params.leftMargin = 206; //XCOORD
params.topMargin = 206; //YCOORD
childView.setLayoutParams(params);

这里有更多的信息。我希望这有帮助

 类似资料:
  • 问题内容: 我有这个非常简单的课程: 在类路径中指定的此上下文文件不存在。我几乎可以输入任何想要的名称,并且代码不会中断。我的意思是测试运行正常,就好像该文件确实存在。 如果我从: classpath 到 classpath* 做了一个小的更改,它会发出喙,表示该文件不存在,这也是我在第一种情况下的预期行为。 春季版本3.2.3。 有人可以解释这种奇怪的行为吗? 编辑 建议的日志内容: 我什至尝试

  • 我正在设计一个网站,有一些h3标题和段落,包装在一个名为“featured-info”的div类中。此外,我还有一个footer元素,它位于主体中的主包装器中。各段用斜体字写成: 并且页脚有边框: 页脚文本也是一个h4向上感知: 主要的问题是我有一个设置:@media screen和(最小宽度:750px),它使一些导航按钮内联,并调整一些文本的大小,但是...当页面大小小于750px时,页脚样式

  • 问题内容: 这段代码: 在Chrome中产生以下输出: 这是为什么? 问题答案: 通过检查对象以异步方式进行。控制台同步接收到对对象的引用,但在对象被扩展之前不会显示对象的属性(在某些情况下,取决于浏览器以及日志发生时是否打开了开发工具)。如果在控制台中检查对象之前已对其进行了修改,则显示的数据将具有更新的值。 例如,Chrome会在一个方框中显示一点,悬停时说: 记录时左边的对象值已被快照,下面

  • 运行Spring Boot应用程序时,我遇到了一些奇怪的问题。它已配置为使用Log4J2作为其记录器(Logback记录器已被禁用)。 log4j2。xml: 主要问题 我在log4j2中有一些变量替换。xml文件,以允许变化,特别是日志文件名。当我运行应用程序时,日志文件被创建在正确的目录中,并且看起来确实有实际的日志内容。问题是它们的名字不正确。例如,而不是,文件名为${sys:service

  • 我有一些问题要执行。 我需要的: 发布来自用户的消息 将其广播给其他用户 将消息发送给将在下次连接时使用该消息的脱机用户 我实际上: 在index.html页上,我连接到套接字服务器 我有一个发送消息的按钮 我在索引页上打开两个不同的浏览器,我的用户都已连接起来 如果我向服务器发送消息,服务器就会将消息发送给其他用户 如果我向服务器发送第二条消息,它就会将该消息发送给发送该消息的用户。 它在切换,

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方