使用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. package com.ckl.myview;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.AbsoluteLayout;  
  10. import android.widget.AbsoluteLayout.LayoutParams;  
  11. import android.widget.Button;  
  12. import android.widget.ImageView;  
  13.   
  14. public class MyViewActivity extends Activity {  
  15.     ImageView myImage;  
  16.     AbsoluteLayout mLayout;  
  17.     AbsoluteLayout.LayoutParams mParams;  
  18.     Button mButton;  
  19.   
  20.     /** Called when the activity is first created. */  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.           
  26.         mLayout = (AbsoluteLayout)findViewById(R.id.myLayout);  
  27.           
  28.         mParams = new AbsoluteLayout.LayoutParams(  
  29.                 AbsoluteLayout.LayoutParams.WRAP_CONTENT,   
  30.                 AbsoluteLayout.LayoutParams.WRAP_CONTENT,  
  31.                 100100);  
  32.           
  33.         myImage = new ImageView(this);  
  34.         myImage.setImageResource(R.drawable.a);  
  35.         myImage.setLayoutParams(mParams);  
  36.         mLayout.addView(myImage);  
  37.           
  38.         mButton = (Button)findViewById(R.id.myButton1);  
  39.         mButton.setOnClickListener(new OnClickListener() {  
  40.             public void onClick(View v) {  
  41.                   
  42.                 ImageView icon = (ImageView)findViewById(1234);  
  43.                 if (icon != null) {  
  44.                     mLayout.removeView(icon);  
  45.                 }  
  46.                 addIcon(1234200200);  
  47.             }  
  48.         });  
  49.     }  
  50.       
  51.     private ImageView addIcon(int id, int x, int y) {  
  52.         AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(  
  53.                 AbsoluteLayout.LayoutParams.WRAP_CONTENT,   
  54.                 AbsoluteLayout.LayoutParams.WRAP_CONTENT,  
  55.                 x, y);  
  56.           
  57.         ImageView icon = new ImageView(this);  
  58.         icon.setImageResource(R.drawable.b);  
  59.         icon.setLayoutParams(params);  
  60.         mLayout.addView(icon);  
  61.           
  62.         return icon;  
  63.     }  
  64.   
  65.     @Override  
  66.     public boolean onTouchEvent(MotionEvent event) {  
  67.         int action = event.getAction();  
  68.         int mX = (int)event.getX();  
  69.         int mY = (int)event.getY();  
  70.           
  71.         switch (action) {  
  72.         case MotionEvent.ACTION_DOWN:  
  73.             //logd("ACTION_DOWN");  
  74.             break;  
  75.         case MotionEvent.ACTION_MOVE:  
  76.             //logd("ACTION_MOVE");  
  77.             break;  
  78.         case MotionEvent.ACTION_UP:  
  79.             logd("ACTION_UP mX = " + mX + ", mY = " + mY);  
  80.             /** 
  81.              * 不能使用myImage.layout()方法,来改变位置。 
  82.              * layout()虽然可以改变控件的位置, 但不会将位置信息保存到layoutparam中。 
  83.              * 而调用addView往布局添加新的控件时,是根据layoutparam来重新布局控件位置的。 
  84.              * 这里需要用另一种方法:先获取控件的layoutparam,改变其中相关的值后,再设置回去。 
  85.              */  
  86. //          myImage.layout(mX, mY, mX + myImage.getWidth(), mY + myImage.getHeight());  
  87.             AbsoluteLayout.LayoutParams params = (LayoutParams) myImage.getLayoutParams();  
  88.             params.x = mX;  
  89.             params.y = mY;  
  90.             myImage.setLayoutParams(params);  
  91.             break;  
  92.         default:  
  93.             break;  
  94.         }  
  95.         return true;  
  96.     }  
  97.   
  98.     private static final String TAG = "MyViewActivity";  
  99.     private static final boolean debugOn = true;  
  100.     private int logd(String msg) {  
  101.         int retVal = 0;  
  102.         if (debugOn) {  
  103.             retVal = Log.i(TAG, msg);  
  104.         }  
  105.         return retVal;  
  106.     }  
  107. }  


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值