我在AbsoluteLayout动态添加了一些ImageView,用来表示批注,这些ImageView在相关事件中用layout改变位置。
但是改变了它们的位置后,再用addview方法添加一个新的ImageView后,所有ImageView都重新出现在原来addview时的位置上,没有移动,就像被重新初始化了。
问题来了:使用addView方法时,如何保持已有动态控件位置不初始化?
因为不知道布局中的addview是怎么实现的,所有没有想出直接解决问题的办法。
后来只好用了一种不是很好的办法:
要addView时,先将原来的ImageView全部删除,再按照新的位置重新添加到布局中。这样再addView新的ImageView时,原来的ImageView位置也是正确的。
不知道还有什么办法可以更好的达到这种效果?
经过一番尝试,终于解决这个问题,简单说就是,不能使用layout()方法,来改变位置。layout()虽然可以改变控件的位置, 但不会将位置信息保存到layoutparam中。而调用addView往布局添加新的控件时,是根据layoutparam来重新布局控件位置的。 因此另一种方法就是:先获取控件的layoutparam,改变其中相关的值后,再设置回去。 这样移动过的控件,就不会在addView时回到原来的位置了。
下面是主要代码:
MyViewActivity.java
-
packagecom.ckl.myview;
-
-
importandroid.app.Activity;
-
importandroid.os.Bundle;
-
importandroid.util.Log;
-
importandroid.view.MotionEvent;
-
importandroid.view.View;
-
importandroid.view.View.OnClickListener;
-
importandroid.widget.AbsoluteLayout;
-
importandroid.widget.AbsoluteLayout.LayoutParams;
-
importandroid.widget.Button;
-
importandroid.widget.ImageView;
-
-
publicclassMyViewActivityextendsActivity{
-
ImageViewmyImage;
-
AbsoluteLayoutmLayout;
-
AbsoluteLayout.LayoutParamsmParams;
-
ButtonmButton;
-
-
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
-
mLayout=(AbsoluteLayout)findViewById(R.id.myLayout);
-
-
mParams=newAbsoluteLayout.LayoutParams(
-
AbsoluteLayout.LayoutParams.WRAP_CONTENT,
-
AbsoluteLayout.LayoutParams.WRAP_CONTENT,
-
100,100);
-
-
myImage=newImageView(this);
-
myImage.setImageResource(R.drawable.a);
-
myImage.setLayoutParams(mParams);
-
mLayout.addView(myImage);
-
-
mButton=(Button)findViewById(R.id.myButton1);
-
mButton.setOnClickListener(newOnClickListener(){
-
publicvoidonClick(Viewv){
-
-
ImageViewicon=(ImageView)findViewById(1234);
-
if(icon!=null){
-
mLayout.removeView(icon);
-
}
-
addIcon(1234,200,200);
-
}
-
});
-
}
-
-
privateImageViewaddIcon(intid,intx,inty){
-
AbsoluteLayout.LayoutParamsparams=newAbsoluteLayout.LayoutParams(
-
AbsoluteLayout.LayoutParams.WRAP_CONTENT,
-
AbsoluteLayout.LayoutParams.WRAP_CONTENT,
-
x,y);
-
-
ImageViewicon=newImageView(this);
-
icon.setImageResource(R.drawable.b);
-
icon.setLayoutParams(params);
-
mLayout.addView(icon);
-
-
returnicon;
-
}
-
-
@Override
-
publicbooleanonTouchEvent(MotionEventevent){
-
intaction=event.getAction();
-
intmX=(int)event.getX();
-
intmY=(int)event.getY();
-
-
switch(action){
-
caseMotionEvent.ACTION_DOWN:
-
-
break;
-
caseMotionEvent.ACTION_MOVE:
-
-
break;
-
caseMotionEvent.ACTION_UP:
-
logd("ACTION_UPmX="+mX+",mY="+mY);
-
-
-
-
-
-
-
-
AbsoluteLayout.LayoutParamsparams=(LayoutParams)myImage.getLayoutParams();
-
params.x=mX;
-
params.y=mY;
-
myImage.setLayoutParams(params);
-
break;
-
default:
-
break;
-
}
-
returntrue;
-
}
-
-
privatestaticfinalStringTAG="MyViewActivity";
-
privatestaticfinalbooleandebugOn=true;
-
privateintlogd(Stringmsg){
-
intretVal=0;
-
if(debugOn){
-
retVal=Log.i(TAG,msg);
-
}
-
returnretVal;
-
}
-
}
工程代码:http://download.csdn.net/detail/victoryckl/3679107
分享到:
相关推荐
### Android控件动态使用与创建详解 #### 一、引言 在Android开发过程中,界面设计通常是通过XML布局文件来完成的。这种方式虽然方便快捷,但在某些场景下却显得不够灵活,例如需要根据用户操作或者数据变化实时...
- 要删除已添加的控件,我们可以使用`removeView()`或`removeViewAt()`方法。例如,删除上面创建的按钮: ```java parentLayout.removeView(button); ``` 3. **设置控件的大小和位置**: - **尺寸**:可以...
这可以通过直接实例化控件类并添加到已有的布局中来实现。例如: ```java Button button = new Button(context); button.setText("动态创建"); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams...
自定义继承控件是通过扩展已有控件的功能,自定义自绘View控件则允许开发者自由绘制复杂的图形,而自定义组合控件则方便地将多个控件组合成一个整体。理解并熟练掌握这些技巧,能极大地提高Android应用的定制化程度...
这篇博文(链接已提供)将介绍如何实现一个自定义的`RadioGroup`和`RadioButton`控件。 首先,我们需要理解`RadioGroup`和`RadioButton`的基本工作原理。`RadioGroup`是一个容器,它包含了多个`RadioButton`,并...
这种方式适用于在已有控件基础上进行扩展,例如增加触摸事件处理、改变默认样式等。在继承后,可以通过重写父类的方法,或者添加新的方法和成员变量来实现自定义功能。 比如,如果我们想要一个带有计数功能的按钮,...
本文将深入探讨如何自定义一个EditText控件,实现类似邮件或短信应用中添加联系人的效果,即将输入的人名或邮箱自动转化为带有联系人图片的文本控件。 首先,我们需要创建一个新的Java类,继承自EditText。这个类将...
接下来,我们创建一个新的Java类,继承自Android的Button或AppCompatButton,这样可以获得已有的按钮功能并进行扩展。在这个类中,我们可以重写构造函数,设置默认属性,以及添加额外的方法来处理自定义行为: ```...
为了确保每次加载新布局时能正确显示,需要先移除原有的子视图,通常使用 `removeAllViews()` 方法。 #### 三、具体实现 **1. 准备工作** - 创建包含按钮和空白区域的主布局文件,例如: ```xml android:...
接下来,你可以在需要的地方动态添加这个`BadgeView`到你的布局中,或者通过查找已存在的View并设置`BadgeView`作为其子View。使用`ViewGroup.addView()`方法来添加,记得传入适当的参数,比如布局参数。 ```java ...
这个自定义组件的实现并不复杂,但却能显著提升用户的使用体验。通过自定义EditText,开发者可以根据自己的需求进行更细致的定制,比如改变删除按钮的样式、动画效果等,进一步优化应用的交互设计。 如果你希望查看...