10

I am trying to dynamically create and then move an image in an Android activity. However, the setX() and setY() methods seem to not work correctly. It correctly sets the position of an image when it is first created and placed, but any attempt to update it results in the image being placed in the wrong spot. For instance, the image moves on the following code:

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

On ACTION_MOVE the image is moved even though the x and y position values remain the same. The parent of the image remains the same. The size remains the same. If I get the x and y values it will still say 206, but it is not placed at (206, 206) on the activity anymore. I am lost as to why this is happening. I can't find any indication that the image has been altered except for it physically changing location.

6 Answers 6

16

Really, this shouldn't be happening. Alternatively, try setting another variable and setting x and y to it, or get x and get y and add a 0 to each one of them for same location.

As stated in Android - Use of view.setX() and setY in api 8, if you have searched, there is another solution that also works even before api 8. LayoutParams works like this -

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

There is more information there. I hope this helps

3
  • 1
    Tyvm for the answer. Using params works for me. I'm still curious as to what is going on with setX and Y though. I've tried everything but anytime I set a value after its already been set in the down event(no matter how I set the new value) the image is moved to the wrong location. Its off by a constant value around 30 pixels too far up and to the left on the emulator I'm testing with. I thought it had to be changing the view's parent or something but that's not it. There's literally nothing different that I can find. Commented May 28, 2013 at 2:45
  • 1
    Could it be density? When setting numbers programatically, you should multiply by getResources().getDisplayMetrics().density to change px values to dp values
    – marmor
    Commented Nov 26, 2013 at 10:08
  • it seems that the canvas needs to be invalidated - as sometimes the "view.setX(206)" is ignored. I have made it VISIBLE (from GONE) and it was shown correctly Commented Feb 24, 2020 at 10:00
4

Run into the same issue. View.setLeft(int)/View.setTop(int) worked for me.

Note that since the original post of this answer things changed and on the more recent android versions it may produce unexpected results while it did the trick for me on older versions. So if you are targeting older devices (android 3.0 and below) this may help but for a more generic solution please consider other answers here as well.

1
  • Didn't work for me. Just stretched my view vertically Commented Jan 7, 2017 at 21:59
1

From the docs, setTranslationX is:

Sets the horizontal location of this view relative to its left position. This effectively positions the object post-layout, in addition to wherever the object's layout placed it.

And setX is:

Sets the visual x position of this view, in pixels. This is equivalent to setting the translationX property to be the difference between the x value passed in and the current left property.

Thus you can think of setTranlsationX as a relative offset: move 3 pixels left of where you normally would be. And setX is a fixed position: move whatever you have to so that you end up drawing at coordinate X.

0

Is your activity in full screen mode? If no try to make it to full screen and it should solve your problem.

0

Pretty late to answer, but if someone else is facing the same problem. This fixed it for me it was the paddings in the layout file:

android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
1
  • 3
    This answer isnt very helpful as it doesnt have enough information.
    – user9599745
    Commented Sep 4, 2019 at 12:11
0

As someone who actually facing this problem, I have solve this issue by removing any padding in the parentView. The padding seem cause a change in the layout size

0

Not the answer you're looking for? Browse other questions tagged or ask your own question.