2

我有一个带有按钮的自定义视图类,我让用户触摸屏幕,以便检索坐标。我想要做的是,每当他单击按钮时,将其文本设置为他的触摸坐标。我该怎么做呢?

public class TargetView extends RelativeLayout{
    .
    .
    .
    public float x=0;
    public float y=0;

    public TargetView(final Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    ((Activity)getContext())
        .getLayoutInflater()
        .inflate(R.layout.target_view, this, true);

    Target=findViewById(R.id.target);
    Undo=(Button)findViewById(R.id.undo_bt);

    Undo.setOnClickListener(new OnClickListener(){

        public void onClick(View v) {
            Log.d("x,y",(String.valueOf(x)+","+String.valueOf(y)));
            Undo.setText(String.valueOf(x)+","+String.valueOf(y));

        }

    });

        @Override
        public boolean onTouchEvent(MotionEvent event){

        switch (event.getAction()){
        case (MotionEvent.ACTION_DOWN): {

                 x = event.getX();
                 y = event.getY();
            }
            return false;
        } 
        . 
        .
        .
 }

编辑 我在按钮侦听器中添加了一个 Log.d ,似乎只有在用户触摸屏幕的其余部分并更改 x、y (文本更改为“0.0”)之前单击按钮。

我的 .xml 文件:

   <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

       <android.archer.test.TargetView
        android:id="@+id/myTargetView"
        android:layout_width="300dip"
        android:layout_height="300dip"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/target" >
       </android.archer.test.TargetView> 

      </LinearLayout>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

  <View
       android:id="@+id/target"
       android:layout_width="300dp"
       android:layout_height="350dip" />

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
      android:id="@+id/undo_bt"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_alignParentLeft="true"
          android:text="-" />

    </RelativeLayout>
4

2 回答 2

1

-super.onTouchEvent(event)在 onTouchEvent 方法结束时返回。

例如:

@Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return super.onTouchEvent(event);
    }

-此外,Android 维护视图的层次结构,并相应地处理事件。层次结构中的每个视图都会获取事件,但前提是父事件尚未使用它。含义 - 如果您有一个onTouchEvent()每次都处理并返回 true的父视图,那么子视图永远不会收到事件

于 2012-11-16T17:05:01.663 回答
0

更改return您的代码段:

   @Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return false;
    } 

return true;

如果可能的话,您可以将日志放入您的 onTouchEvent 以查看它是否可以返回坐标。

于 2012-11-16T16:35:58.680 回答