【问题标题】:Android setX() and setY() behaving weirdAndroid setX() 和 setY() 行为怪异
【发布时间】:2013-05-22 20:56:43
【问题描述】:

我正在尝试在 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);
    }
}

在 ACTION_MOVE 上,即使 x 和 y 位置值保持不变,图像也会移动。图像的父级保持不变。大小保持不变。如果我得到 x 和 y 值,它仍然会显示 206,但它不再位于活动的 (206, 206) 处。我不知道为什么会这样。除了物理位置发生变化之外,我找不到任何迹象表明图像已被更改。

【问题讨论】:

    标签: android imageview setx


    【解决方案1】:

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

    Android - Use of view.setX() and setY in api 8 中所述,如果您搜索过,还有另一种解决方案,即使在 api 8 之前也可以使用。 LayoutParams 是这样工作的 -

    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);
    

    那里有更多信息。我希望这会有所帮助

    【讨论】:

    • Tyvm 的答案。使用参数对我有用。我仍然很好奇 setX 和 Y 发生了什么。我已经尝试了所有方法,但是每当我在向下事件中设置了一个值之后(无论我如何设置新值),图像都会移动到错误的位置。在我正在测试的模拟器上,它偏离了一个大约 30 像素的常数值。我认为它必须改变视图的父级或其他东西,但事实并非如此。从字面上看,我找不到任何不同的地方。
    • 可能是密度吗?以编程方式设置数字时,应乘以 getResources().getDisplayMetrics().density 以将 px 值更改为 dp 值
    • 似乎需要使画布无效 - 因为有时会忽略“view.setX(206)”。我已将其设为可见(从 GONE 开始)并且显示正确
    【解决方案2】:

    遇到同样的问题。 View.setLeft(int)/View.setTop(int) 为我工作。

    请注意,由于此答案的原始帖子发生了变化,并且在较新的 android 版本上,它可能会产生意想不到的结果,而它在旧版本上对我有用。因此,如果您针对的是较旧的设备(android 3.0 及更低版本),这可能会有所帮助,但对于更通用的解决方案,请在此处考虑其他答案。

    【讨论】:

    • 对我不起作用。只是垂直拉伸了我的视野
    • @tieorange 否决票?我相信你应该对每一个不适合你的答案做同样的事情。但总的来说,不同的答案越多,你就越有可能在其他人的帮助下解决问题,因为类似的问题实际上可以有不同的解决方案,并且一个可以为你工作。或者可能不会。在这种情况下继续挖掘。因此,如果它不适用于您的特定情况,我实际上看不出有任何实际理由拒绝投票,因为它仍然可以对其他人有所帮助。鼓励通过投票来分享不同的解决方案对你有用,而不是相反
    【解决方案3】:

    您的活动是否处于全屏模式?如果没有尝试使其全屏,它应该可以解决您的问题。

    【讨论】:

      【解决方案4】:

      很晚才回答,但如果其他人也面临同样的问题。这为我修复了它是布局文件中的填充:

      android:paddingBottom="16dp"
      android:paddingLeft="16dp"
      android:paddingRight="16dp"
      android:paddingTop="16dp"
      

      【讨论】:

      • 这个答案不是很有帮助,因为它没有足够的信息。
      【解决方案5】:

      作为一个真正面临这个问题的人,我已经通过删除 parentView 中的任何填充来解决这个问题。填充似乎会导致布局大小发生变化

      【讨论】:

        【解决方案6】:

        从文档中,setTranslationX 是:

        设置此视图相对于其左侧位置的水平位置。除了对象的布局放置它的位置之外,这有效地定位了布局后的对象。

        而 setX 是:

        设置此视图的视觉 x 位置,以像素为单位。这相当于将translationX属性设置为传入的x值与当前left属性的差值。

        因此,您可以将 setTranlsationX 视为一个相对偏移:将您通常所在的位置向左移动 3 个像素。而 setX 是一个固定位置:移动任何你需要的东西,这样你最终会在坐标 X 处绘制。

        【讨论】:

          猜你喜欢
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 1970-01-01
          • 2021-05-29
          • 2017-08-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多