Android Api 8. 从 View 中获取 x 和 y,并在 Button 上设置 x 和 y
Posted
技术标签:
【中文标题】Android Api 8. 从 View 中获取 x 和 y,并在 Button 上设置 x 和 y【英文标题】:Android Api 8. Get x and y from a View, and Set x and y on a Button 【发布时间】:2011-10-23 22:11:43 【问题描述】:我正在使用 API 8 进行编码。 我需要从视图中获取坐标 X 和 Y,并将它们设置为新按钮的坐标。 我尝试了不同的方法,但没有任何效果....
setX 和 getX 方法仅适用于 api 级别 11,我需要一种方法在 API8 上执行此操作。
这是我的方法,它允许创建一个按钮的可拖动副本(这个副本是一个图像视图,当我放下它时它变成了一个新按钮)
public boolean dragCopy(View view, MotionEvent me, Button bt)
int x,y,w,h,id,t,l;
int cont=-1;
int coord[] = new int[2];
bt2=new Button(this);
id = bt.getId();
bt2.setId(id);
Resources res = getResources();
cont = FindCont(bt, vector);
dr = getLetter(bt, dr, res, vector, cont);
w=dr.getIntrinsicWidth();
h=dr.getIntrinsicHeight();
if (me.getAction() == MotionEvent.ACTION_DOWN)
//clicked on the button. DRAG START
status = START_DRAGGING;
image = new ImageView(this);
//set image drawable
image.setImageDrawable(dr);
image.setPadding((int)bt.getLeft(),(int)bt.getTop(), 0, 0);
layout.addView(image, params);
if (me.getAction() == MotionEvent.ACTION_UP)
//button released. DROP
status = STOP_DRAGGING;
x = (int) me.getRawX();
y = (int) me.getRawY();
//create button compy from image
bt2.setBackgroundDrawable(dr);
bt2.setVisibility(View.VISIBLE);
//PROBLEMS
t= image.getTop();
l= image.getLeft();
bt2.setPadding(l, t, 0, 0);
System.out.println("**************** T: "+t +"--- L: "+l);
image.setVisibility(View.GONE);
bt2.setLayoutParams(image.getLayoutParams());
bt2.setWidth(w);
bt2.setHeight(h);
layout.addView(bt2);
bt2.setDrawingCacheEnabled(true);
bt2.setOnTouchListener(this);
bt2.invalidate();
image.invalidate();
else if (me.getAction() == MotionEvent.ACTION_MOVE)
//i'm moving the image
if (status == START_DRAGGING)
image.setPadding((int) me.getRawX(), (int) me.getRawY(), 0, 0);
image.invalidate();
return false;
【问题讨论】:
只是好奇,你为什么需要这样做?我认为像这样设置 View 的位置在 android 中通常是不受欢迎的,因为很难让它适用于所有屏幕。 我需要模拟 api 8 未提供的拖放监听器 我仍然需要一个解决方案,可能没有自定义布局,或者如果这是唯一的方法,请告诉我如何 【参考方案1】:你可以试试 getTop() 和 getLeft() 吗?
【讨论】:
我将如何在按钮上设置这个值?【参考方案2】:我还没有尝试过,但我认为它会起作用:
int buttonX = 50; // Arbitrary values - use whatever you want
int buttonY = 100;
int viewX = myView.getLeft();
int viewY = myView.getTop();
Button newButton = new Button();
newButton.setPadding(buttonX - viewX, buttonY - viewY, 0, 0);
// Other button setup
这会将其设置为屏幕上 (50,100) 的绝对位置。如果您希望它相对于布局的角为 (50,100),请使用:
int buttonX = 50; // Arbitrary values - use whatever you want
int buttonY = 100;
Button newButton = new Button();
newButton.setPadding(buttonX, buttonY, 0, 0);
// Other button setup
这仅适用于不会自动定位其子内容的布局,例如 RelativeLayout。
【讨论】:
我遇到了这个错误“方法 setTop(int) 未定义按钮类型” 哦,你是对的。在 setX 和 setY 出现之前,这也是不可用的。对不起。 我已经更新了我认为对你有用的技术的答案。 我使用框架布局,并使用您的方法,按钮出现在上角。我做过类似t= image.getTop(); l= image.getLeft(); bt2.setPadding(l, t, 0, 0); System.out.println("**************** T: "+t +"--- L: "+l);
的事情,其中“bt2”是一个按钮,“image”是一个图像视图。但系统输出总是返回等于 0 的值。我将在上面添加整个方法。
在您到达顶部和左侧时,它们可能尚未计算。您可能必须创建一个扩展 FrameLayout 的自定义布局。在您的自定义布局中,您可以覆盖 onLayout()
来设置子视图的位置。【参考方案3】:
我已经使用 andengine 重新创建了我的拖放操作。效果更好,比以前更好
【讨论】:
以上是关于Android Api 8. 从 View 中获取 x 和 y,并在 Button 上设置 x 和 y的主要内容,如果未能解决你的问题,请参考以下文章
从 ListView 获取孩子会导致 android.view.View android.view.View.findViewById(int) 在空对象引用上
Android 从 View 中获取 Activity 时遇到 TintContextWrapper cannot be cast to 的问题
Android 从 View 中获取 Activity 时遇到 TintContextWrapper cannot be cast to 的问题
Android 从 View 中获取 Activity 时遇到 TintContextWrapper cannot be cast to 的问题
Android 从 View 中获取 Activity 时遇到 TintContextWrapper cannot be cast to 的问题