1

アクティビティと拡張Viewクラスがあり、どちらも同じxmlレイアウトを使用しています。拡張ビューでは、タッチを使用して画面上でいくつかの描画を行い、ユーザーが画面をタップするたびに、タッチの座標xをアクティビティに渡したいと考えています。

これまで、getterメソッドを使用してアクティビティ内から呼び出してきましたが、これは、ユーザーが触れた実際のX座標ではなく、コンストラクターのXの初期値のみを渡します。

私は何かが足りないと確信しています。道順を教えていただけますか?

編集: 提案されたように、ゲッターの練習の代わりに、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に同じリスナーを2回追加しないことを確認して、ビュークラスを改善する必要があります。

おそらく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 に答える