将数据从类传递到活动

时间:2012-11-10 16:39:53

标签: java android interface touch getter

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

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

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

编辑:正如所建议的那样,我尝试使用公共界面而不是更改,而不是getter练习。这是我的代码:

我的自定义课程:

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>

3 个答案:

答案 0 :(得分: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,所以只需将它添加到接口定义中。

答案 1 :(得分:0)

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

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

   int xPoint = event.getX();
   int yPoint = event.getY();
   return true;
   }

答案 2 :(得分: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);

    }