我在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使用addView动态添加组件,自定义添加列表项,添加LinearLayout
主要为大家详细介绍了Android使用addView动态添加组件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
通过addview 实现三层listview动态嵌套
拖动view 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷新时)则移动的view会回到原来的位置
安卓使用WindowManager.addView()简单实现悬浮窗口播放视频
原需求,在一个伸缩列表中,自定义LinearLayout继承LinearLayout动态添加布局。 然而实现的时候:一共遍历了30条数据,却只显示了一条 断点查看代码:遍历addView()这个过程是正常的30次循环。那是布局的问题? ...
CheckBox复选框控件使用方法,具体内容如下 一、简介 1、 2、类结构图 二、CheckBox复选框控件使用方法 这里是使用java代码在LinearLayout里面添加控件 1、新建LinearLayout布局 2、建立CheckBox的XML的Layout文件...
而该案例不需要改变你之前的任何代码,只是需要按照步骤即可设置红点。设置红点view到你的控件的逻辑操作代码如下所示。如果控件父布局是帧布局,则直接添加;如果控件父布局是ViewGroup,则创建一个帧布局,然后...
addview.jsp
//直到当前控件改变在做事情 if (currentPosition != position) { Toast.makeText(v.getContext(), ((TextView) currentView).getText().toString(), Toast.LENGTH_SHORT).show(); currentPosition ...
调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,...
它只需使用addView方法添加几个View,每个View对应的是一个页面,即可完成对于多页面的管理,,, 在android上实现手势的识别也比较简单,可以实现OnTouchListener和OnGuestureListener接口, 然后在OnTouch函数中...
原理使用RelativeLayout任意定位位置 核心方法 private void addViewByMargins(RelativeLayout layout, View view, int x, int y, int width, int height) { RelativeLayout.LayoutParams layout_params = null; ...
【上滑停靠顶端的悬浮框】里的实现方法是使用两个控件,滑动时,监听ScrollView的滚动Y值,从而通过对两个控件的显示隐藏来实现控件的顶部悬浮。但是实际应用场景中,有可能需要悬浮的控件里面的内容是比较多的,...
1.避免在xml直接写webview控件,这样会引用activity,所以在xml写一个LinearLayout,然后 linearLayout.addView(new MyWebview(getApplicationContext())); 这样动态生成webview就能避免内存泄漏,可是这样会导致...
下面小编就为大家带来一篇基于Android在布局中动态添加view的两种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
前几年的Android应用源码Demo,主要面向的是学生毕业设计学习。
这是我自己写的一个控件,...用法:需要在xml布局文件中指定一个LinearLayout或者与之同级的布局,在代码中获取到他,然后在代码中通过addView(自定义控件view)这样加入我的这个自定义控件,可以指定字体颜色,字体大小