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;
        } 
        . 
        .
        .
 }

EDIT ボタンリスナー内に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 に答える