1

我有一个活动和一个扩展的 View 类,它们都使用相同的 xml 布局。在扩展视图中,我通过触摸在屏幕上进行了一些绘图,并且希望在用户点击屏幕时将触摸的坐标 x 传递给 Activity。

到目前为止,我已经使用了一个 getter 方法并从 Activity 内部调用它,但它只传递了构造函数 X 的初始化值,而不是用户触摸的实际 X 坐标。

我很确定我错过了一些东西。你能给我一些方向吗?

编辑: 正如建议的那样,我尝试使用公共接口,而不是 getter 实践,但 X 仍然没有改变。这是我的代码:

我的自定义类:

public class ImageView1 extends View  {

 Context context;

 ArrayList<ViewWasTouchedListener> listeners = new 
                                   ArrayList<ViewWasTouchedListener>();
 ImageView1 img = (ImageView1) findViewById (R.id.imageView1);

 public float x=0;
 public float y=0;

 public ImageView1(Context context) {
        super(context);
        this.context=context;
        setFocusable(true);
    }


public ImageView1(Context context, AttributeSet attrs) {
    super(context, attrs); 
    this.context=context;
    setFocusable(true);

} 

@Override
public boolean onTouchEvent(MotionEvent event){
        switch (event.getAction()){
        case (MotionEvent.ACTION_DOWN): {

                 x = event.getX();
                 y = event.getY();
     for (ViewWasTouchedListener listener:listeners){
         Log.d("Touchpoint", String.valueOf(x) +"," + String.valueOf(y));
         listener.onViewTouched(x);
        }
    }

    return true;

   }  

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    ....
}

public void setWasTouchedListener(ViewWasTouchedListener listener){
    listeners.add(listener);
}   
}

我的主要活动:

 public class TargetPractise extends Activity implements ViewWasTouchedListener  {
 @Override

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.target_form);

    ImageView1 value = new ImageView1(TargetPractise.this);
    value.setWasTouchedListener(TargetPractise.this);   

 }

  public void onViewTouched(float x){
     Log.d("x",String.valueOf(x));

  }   
  }

我的界面:

  public interface ViewWasTouchedListener {
void onViewTouched(float x);
 }

我的xml布局:

<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.ImageView1
  android:id="@+id/imageView1"
  android:layout_width="300dip"
  android:layout_height="300dip"
  android:layout_gravity="center_horizontal"
  android:background="@drawable/target" >
</android.archer.test.ImageView1>
4

3 回答 3

4

定义一个接口并使用回调让活动知道 x 已更改。我喜欢这种方法,因为它适用于任何有兴趣知道 x 何时发生变化的班级,而不仅仅是您的活动。想象一下,您添加了一种新类型的视图类,但它还需要知道您的自定义视图何时被触摸(我使用图形以及可以拖动的水平和垂直刻度来执行此操作 - 刻度告诉任何感兴趣的人他们已经改变) .

public Interface ViewWasTouchedListener {
    void onViewTouched(float x);
}

在您的自定义视图中

ArrayList<ViewWasTouchedListener> listeners = new ArrayList<ViewWasTouchedListener>();

...

public void setWasTouchedListener(ViewWasTouchedListener listener){
    listeners.add(listener);
}

在你的触摸事件中

for (ViewWasTouchedListener listener:listeners){
   listener.onViewTouched(x);
}

在您的活动中:

public class Test extends Activity implements ViewWasTouchedListener {

...

@Override
public void onCreate(Bundle savedInstanceState) 
{
    ...
    MyExtendedView customView = (MyExtendedView)findViewById(R.id.myCustomeView);
    customView.setWasTouchedListener(this);
    ...
}

public void onViewTouched(float x){
   // do whatever you need to do
}

全部来自记忆,所以请原谅拼写错误,您应该通过添加 removeViewWasTouchedListener 并检查您没有在 setViewWasTouchedListener 中添加两次相同的侦听器来改进视图类。

您可能也需要 y ,因此只需将其添加到接口定义中。

于 2012-11-10T16:56:26.643 回答
0

你应该覆盖 onTouch() 试试这个,

   @Overrride
   public boolean onTouch(View v, MotionEvent event) {

   int xPoint = event.getX();
   int yPoint = event.getY();
   return true;
   }
于 2012-11-10T16:48:07.267 回答
0

在获得一些帮助并改变了一些事情之后,我的代码可以做我想做的事情:

我的活动:

 public class TargetPractice extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            final View viewMain; 

            setContentView((viewMain = View.inflate(this, R.layout.main, null))); 

            new MyImageView(this, viewMain,
                            new TargetInterface() {

                                    @Override
                                    public void OnTouchEventDown(float x, float y) {                                                
                                            Log.w("MYPRG", String.format("%f, %f", x, y));
                                    }
                            });
    }        
 }

我的自定义类:

  public class MyImageView extends View implements View.OnTouchListener {

    Context context;

            private TargetInterface iTarget = null;

            public float x=0;
            public float y=0;                       

            public float getx() { 
              return this.x;
                             }

            public MyImageView(Context context, View view, TargetInterface iTarget) 
            {
                            super(context);
                            this.context=context;                           
                            this.iTarget=iTarget;   // bind TargetInterface

                            setFocusable(true);
                            view.setOnTouchListener(this);
            }               

            @Override               
            public boolean onTouchEvent(MotionEvent event)  
            {
                    switch (event.getAction())
                    {
                              case MotionEvent.ACTION_DOWN: 
                              {
                                            x = event.getX();
                                            y = event.getY();



                                            return true;
                              }                               
                    }

               return false;
            }
                @Override
                public void onDraw(Canvas canvas){
                super.onDraw(canvas);

                 ....
              }
          public boolean onTouch(View v, MotionEvent event) {
              x = event.getX();
              y = event.getY();
             iTarget.OnTouchEventDown(x, y);
            return false;
}                               
   }

我的界面:

    public interface TargetInterface {

          public void OnTouchEventDown(float x, float y);

    }   
于 2012-11-11T10:52:34.600 回答