使用addView方法时,如何保持已有动态控件位置不被改变

我在AbsoluteLayout动态添加了一些ImageView,用来表示批注,这些ImageView在相关事件中用layout改变位置。

但是改变了它们的位置后,再用addview方法添加一个新的ImageView后,所有ImageView都重新出现在原来addview时的位置上,没有移动,就像被重新初始化了。


问题来了:使用addView方法时,如何保持已有动态控件位置不初始化?

因为不知道布局中的addview是怎么实现的,所有没有想出直接解决问题的办法。


后来只好用了一种不是很好的办法:

要addView时,先将原来的ImageView全部删除,再按照新的位置重新添加到布局中。这样再addView新的ImageView时,原来的ImageView位置也是正确的。


不知道还有什么办法可以更好的达到这种效果?


经过一番尝试,终于解决这个问题,简单说就是,不能使用layout()方法,来改变位置。layout()虽然可以改变控件的位置, 但不会将位置信息保存到layoutparam中。而调用addView往布局添加新的控件时,是根据layoutparam来重新布局控件位置的。 因此另一种方法就是:先获取控件的layoutparam,改变其中相关的值后,再设置回去。 这样移动过的控件,就不会在addView时回到原来的位置了。


下面是主要代码:

MyViewActivity.java

[java] view plain copy
  1. packagecom.ckl.myview;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.util.Log;
  5. importandroid.view.MotionEvent;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.AbsoluteLayout;
  9. importandroid.widget.AbsoluteLayout.LayoutParams;
  10. importandroid.widget.Button;
  11. importandroid.widget.ImageView;
  12. publicclassMyViewActivityextendsActivity{
  13. ImageViewmyImage;
  14. AbsoluteLayoutmLayout;
  15. AbsoluteLayout.LayoutParamsmParams;
  16. ButtonmButton;
  17. /**Calledwhentheactivityisfirstcreated.*/
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. mLayout=(AbsoluteLayout)findViewById(R.id.myLayout);
  23. mParams=newAbsoluteLayout.LayoutParams(
  24. AbsoluteLayout.LayoutParams.WRAP_CONTENT,
  25. AbsoluteLayout.LayoutParams.WRAP_CONTENT,
  26. 100,100);
  27. myImage=newImageView(this);
  28. myImage.setImageResource(R.drawable.a);
  29. myImage.setLayoutParams(mParams);
  30. mLayout.addView(myImage);
  31. mButton=(Button)findViewById(R.id.myButton1);
  32. mButton.setOnClickListener(newOnClickListener(){
  33. publicvoidonClick(Viewv){
  34. ImageViewicon=(ImageView)findViewById(1234);
  35. if(icon!=null){
  36. mLayout.removeView(icon);
  37. }
  38. addIcon(1234,200,200);
  39. }
  40. });
  41. }
  42. privateImageViewaddIcon(intid,intx,inty){
  43. AbsoluteLayout.LayoutParamsparams=newAbsoluteLayout.LayoutParams(
  44. AbsoluteLayout.LayoutParams.WRAP_CONTENT,
  45. AbsoluteLayout.LayoutParams.WRAP_CONTENT,
  46. x,y);
  47. ImageViewicon=newImageView(this);
  48. icon.setImageResource(R.drawable.b);
  49. icon.setLayoutParams(params);
  50. mLayout.addView(icon);
  51. returnicon;
  52. }
  53. @Override
  54. publicbooleanonTouchEvent(MotionEventevent){
  55. intaction=event.getAction();
  56. intmX=(int)event.getX();
  57. intmY=(int)event.getY();
  58. switch(action){
  59. caseMotionEvent.ACTION_DOWN:
  60. //logd("ACTION_DOWN");
  61. break;
  62. caseMotionEvent.ACTION_MOVE:
  63. //logd("ACTION_MOVE");
  64. break;
  65. caseMotionEvent.ACTION_UP:
  66. logd("ACTION_UPmX="+mX+",mY="+mY);
  67. /**
  68. *不能使用myImage.layout()方法,来改变位置。
  69. *layout()虽然可以改变控件的位置,但不会将位置信息保存到layoutparam中。
  70. *而调用addView往布局添加新的控件时,是根据layoutparam来重新布局控件位置的。
  71. *这里需要用另一种方法:先获取控件的layoutparam,改变其中相关的值后,再设置回去。
  72. */
  73. //myImage.layout(mX,mY,mX+myImage.getWidth(),mY+myImage.getHeight());
  74. AbsoluteLayout.LayoutParamsparams=(LayoutParams)myImage.getLayoutParams();
  75. params.x=mX;
  76. params.y=mY;
  77. myImage.setLayoutParams(params);
  78. break;
  79. default:
  80. break;
  81. }
  82. returntrue;
  83. }
  84. privatestaticfinalStringTAG="MyViewActivity";
  85. privatestaticfinalbooleandebugOn=true;
  86. privateintlogd(Stringmsg){
  87. intretVal=0;
  88. if(debugOn){
  89. retVal=Log.i(TAG,msg);
  90. }
  91. returnretVal;
  92. }
  93. }


工程代码:http://download.csdn.net/detail/victoryckl/3679107

你可能感兴趣的:(view)