2016-07-09 26 views
1

Es gibt ein Bild vorhanden. Ich versuche, den oberen Teil des Bildes zu drücken. Der Wert i erhalten, ist von Bewegungsereignis:Get Y Koordinate der Bewegung berühren Ereignis android

e.getY() 

Der Wert nicht gleich dem Wert I von GetTop bekam();

textview.getTop(); 

Unten ist mein Code:

public class level1 extends AppCompatActivity { 

    private final float TOUCH_SCALE_FACTOR = 180.0f/320; 
    private float mPreviousX; 
    private float mPreviousY; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_level1); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     Intent intent = getIntent(); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent e) { 
     MyDBHandler dbHandler = new MyDBHandler(this, null, null, 1); 
     String firstWord = dbHandler.getWord(1); 
     String[] firstWordArray = firstWord.split("-"); 
     ArrayList<String[]> finalWord = new ArrayList<>(); 

     for (int i = 0; i < firstWordArray.length; i++) { 
      finalWord.add(firstWordArray[i].split(",")); 
     } 

     TextView textview = (TextView) findViewById(R.id.textView2); 

     int x1 = textview.getLeft(); 
     int y1 = textview.getTop(); 

     int x2 = textview.getRight(); 
     int y2 = textview.getBottom(); 

     float width = x2 - x1; 
     float height = y2 - y1; 

     Log.i("Height",""+y1); 
     Log.i("Height",""+y2); 
     Log.i("Height",""+e.getY()); 
     Log.i("Height",""+textview.getY()); 
     Log.i("Height",""+textview.getHeight()); 
     Log.i("Height",""+height); 
     Log.i("Width",""+x1); 
     Log.i("Width",""+x2); 
     Log.i("Width",""+e.getX()); 
     Log.i("Width",""+textview.getWidth()); 
     Log.i("Width",""+width); 

     final Dialog dialog = new Dialog(level1.this); 
     dialog.setContentView(R.layout.custom); 
     dialog.setTitle("Root Word"); 

     // set the custom dialog components - text, image and button 
     TextView text = (TextView) dialog.findViewById(R.id.text); 
     text.setText("Android custom dialog example!"); 
     ImageView image = (ImageView) dialog.findViewById(R.id.image); 

     Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK); 
     // if button is clicked, close the custom dialog 
     dialogButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.dismiss(); 
      } 
     }); 
     if (finalWord.size() != 0) { 
      for (int i = 0; i < finalWord.size(); i++) { 
       float x = e.getX(); 
       float y = e.getY(); 
       float xVar = 100*(x-x1)/width; 
       float yVar = 100*(y-y1)/height; 
       if (xVar< (Integer.parseInt(finalWord.get(i)[0]))) { 
        if (yVar < (Integer.parseInt(finalWord.get(i)[1]))) { 
         dialogButton.setText(finalWord.get(i)[2]); 
         break; 
        } 
       } 
      } 
     } 
     dialog.show(); 
     return true; 
    } 

} 

Antwort

1

Vielleicht this ist das, was Sie suchen?

Der Unterschied zwischen den Werten kommen aus, dass die MotionEvent ist das Ereignis Y-Koordinate getY() zurück, aber die TextView 's getTop() Methode, um die Y-Position relativ zu seinem übergeordneten zurückzukehren.

Angenommen, Ihr Layout so aussehen ist:

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

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click me!" 
     android:id="@+id/textView"/> 

</LinearLayout> 

In diesem Fall, wenn Sie die getTop() return 0 auf dem Textview klicken, weil dies die erste (und oben) Ansicht seiner Eltern ist. Aber wenn Sie ein anderes Textview zu Ihrem Layout ähnlich wie hinzufügen:

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

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Another text"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click me!" 
     android:id="@+id/textView"/> 

</LinearLayout> 

Wenn Sie nun die Textview klicken mit „Click me!“ Text, getTop() wird nicht Null Wert (in meinem Fall 38) wegen der Höhe des anderen TextView zurückgeben.

Möchten Sie bewerten, wo Sie das Bild berührt haben?

+0

Sowohl die e.getX() und e.getRawX() geben den gleichen Wert zurück, aber der Wert unterscheidet sich sehr von textView.getTop() –

+0

Ich verstehe Ihre Erklärung. Dies war die Erklärung, die ich suchte. Ich habe einen onTouch Event Listener für die textView erstellt. Nun wird e.getY() den Wert relativ zur textView zurückgeben. –