У меня есть этот код (для Android):
handler.post(new MyRunnable());
....
static public class MyRunnable implements Runnable {
public void run() {
text.setText("Hi");
imageV.layout(imageV.getLeft()+y, 218, imageV.getLeft()+150+y, 464);
}
}
Текст установлен, но положение изображения imageV
не изменяется. Когда я не пишу text.setText("Hi");
, позиция будет изменена. У меня есть AbsoluteLayout
.
Вам нужно использовать setLayoutParams
handler.post(new MyRunnable());
....
static public class MyRunnable implements Runnable {
public void run() {
text.setText("Hi");
final ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) imageV.getLayoutParams();
params.left += y;
params.top = 218;
params.right = params.left + 150;
params.bottom = 464;
imageV.setLayoutParams(params);
}
}
Имейте в виду, что вы можете использовать view.getLeft()
и т.д. После того, как был сделан хотя бы один макет. До этого это вернет 0. Если вы хотите сделать это с помощью макета, который не будет делать. Вы также должны вызвать requestLayout(). Но вызов layout + requestLayout() в значительной степени зависит от реализации setLayoutParams, поэтому вам лучше использовать его.
canvas.translate(x,y)
перед вызовомsuper.dispatchDraw()
. Тогда представление будет «перемещено», но это будет только визуально. Представление будет продолжать получать события касания в своем старом месте (месте его левого и верхнего полей). Почему вы не хотите использовать setLayoutParams?