Android 如何在relativeLayout中将文本视图移动到x和y
我有一个relativelayout,其中包含一些个人文本视图。我需要将这些文本视图放置为x和y,所以我这样做:Android 如何在relativeLayout中将文本视图移动到x和y,android,android-layout,android-widget,textview,android-relativelayout,Android,Android Layout,Android Widget,Textview,Android Relativelayout,我有一个relativelayout,其中包含一些个人文本视图。我需要将这些文本视图放置为x和y,所以我这样做: RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations); TextViewAnnotation tvAnno = new TextViewAnnotation(this,this,anno.getTexte(),anno.getFon
RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations);
TextViewAnnotation tvAnno = new TextViewAnnotation(this,this,anno.getTexte(),anno.getFontSize());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = x;
params.topMargin = y;
layoutAnnotations.addView(tvAnno, params);
问题是,我给出的x和y将是textView的左上角,而它应该是中心
为了使其成为中心,我覆盖了TextViewAnnotation中的onSizeChanged,并将height/2和width/2减为当前的y填充和x填充:
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Log.d("TextViewAnnotation", "onSizeChanged");
super.onSizeChanged(w, h, oldw, oldh);
if (w ==0 || h==0) return;
RelativeLayout.LayoutParams old_params = (RelativeLayout.LayoutParams)getLayoutParams();
int old_x = old_params.leftMargin;
int old_y = old_params.topMargin;
Log.d("AffFiche", "Ancien : x:"+old_x+" y:"+old_y+" w:"+w+" h:"+h);
RelativeLayout.LayoutParams new_params = new RelativeLayout.LayoutParams(w, h);
new_params.leftMargin = old_x - w/2;
new_params.rightMargin = old_y - h/2;
Log.d("AffFiche", "Nouveau : x:"+new_params.leftMargin+" y:"+new_params.rightMargin+" w:"+w+" h:"+h);
setLayoutParams(new_params);
但它什么也没做。。。我认为这是因为setlayoutParams采用ViewGroup.LayoutParams而不是RelativeLayout.LayoutParams
我怎样才能修好它
好的,我有一些消息 我尝试使用RelativeLayout的addView(view,params)方法更改LayoutParams。 为此,我在TextViewAnnotation中创建了一个“控制器”,以便在启动onSizeChanged方法时调用此对象的方法:
//in TextViewAnnotation class
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Log.d("TextViewAnnotation", "onSizeChanged");
super.onSizeChanged(w, h, oldw, oldh);
if (w ==0 || h==0) return;
controller.ajusterAnnotation(this,w,h);
}
//in my controller class
public void ajusterAnnotation(TextViewAnnotation annotation,int w,int h){
Log.d("AffFiche", "AjusterAnnotation "+annotation);
RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations);
RelativeLayout.LayoutParams old_params = (RelativeLayout.LayoutParams)annotation.getLayoutParams();
int old_x = old_params.leftMargin;
int old_y = old_params.topMargin;
Log.d("AffFiche", "Ancien : x:"+old_x+" y:"+old_y+" w:"+w+" h:"+h);
RelativeLayout.LayoutParams new_params = new RelativeLayout.LayoutParams(w, h);
new_params.leftMargin = old_x - w/2;
new_params.rightMargin = old_y - h/2;
Log.d("AffFiche", "Nouveau : x:"+new_params.leftMargin+" y:"+new_params.rightMargin+" w:"+w+" h:"+h);
layoutAnnotations.removeView(annotation);
//layoutAnnotations.addView(annotation, new_params);
annotation.setLayoutParams(new_params);
layoutAnnotations.addView(annotation);
}
如您所见,我尝试了该函数的两个版本:一个使用带参数的addView,另一个没有:未更改
这次:
- 我有两个textViewAnnotation,每个调用函数“onSizeChanged”,但只有一个调用“AjusterAnnotation”函数,为什么
- 唯一调用“AjusterAnnotation”的textView未绘制,即使x、y、w和h都正常
请帮助我,这似乎是一种非常复杂的布局处理方式 为什么要使用x和y坐标,而不只是将重心设置为中心
AbsoluteLayout被弃用是有原因的,但你可能已经读过了。但是首先,你读过或其他任何布局教程吗?我知道不同的布局,但我正在使用x和y,因为我有一些文本视图要放在带有中心坐标的imageView上。要堆叠视图,我相信你需要使用Framelayout。。。也许这可以通过您的方式实现,但听起来像是一种可能会跨平台崩溃的黑客行为。问题不在于知道这样做是好是坏(我不能通过其他方式实现…),我想知道是否可以直接在其中将新的RelativeLayout.LayoutParams应用到我的textView?或者我绝对需要用addView(view,params)在relativeLayout中完成它?明白了-我不知道,但给了你+1,希望这里有人能做到。 07-13 18:05:18.086: DEBUG/TextViewAnnotation(980): onSizeChanged 07-13 18:05:18.086: DEBUG/AffFiche(980): AjusterAnnotation affichageFiche.TextViewAnnotation@407405a0 07-13 18:05:18.106: DEBUG/AffFiche(980): Ancien : x:117 y:236 w:87 h:10 07-13 18:05:18.106: DEBUG/AffFiche(980): Nouveau : x:74 y:231 w:87 h:10 07-13 18:05:18.115: DEBUG/TextViewAnnotation(980): onSizeChanged