2014-02-20 47 views
2

我正在爲android製作一個鋼琴應用程序。作爲示例(測試),我的活動中有4個按鈕。父母是Relative Layout,我也有一些文字說明,指出手指觸摸的屏幕座標。還有一個TextView的(「輸入鍵」)檢測,如果你的手指在按鈕或不
這是什麼樣子:
將按鈕傳遞給家長的屏幕座標

我實現了這個使用下面給出的代碼。

的Java

public class MainActivity extends Activity { 

Button b1, b2, b3, b4; 

int b1x1, b1x2, b1y1, b1y2; 

private TextView xcordview; 
private TextView ycordview; 
private TextView buttonIndicator; 
private RelativeLayout touchview; 
private static int defaultStates[]; 
private Button mLastButton; 
private final static int[] STATE_PRESSED = { 
     android.R.attr.state_pressed, 
     android.R.attr.state_focused 
       | android.R.attr.state_enabled }; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    xcordview = (TextView) findViewById(R.id.textView4); 
    ycordview = (TextView) findViewById(R.id.textView3); 
    buttonIndicator = (TextView) findViewById(R.id.button_indicator); 
    touchview = (RelativeLayout) findViewById(R.id.relativelayout); 

    b1 = (Button) findViewById(R.id.button1); 
    b2 = (Button) findViewById(R.id.button2); 
    b3 = (Button) findViewById(R.id.button3); 
    b4 = (Button) findViewById(R.id.button4); 
    defaultStates = b1.getBackground().getState(); 

} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    touchview.setOnTouchListener(new View.OnTouchListener() { 

     private boolean isInside = false; 

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

      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      xcordview.setText(String.valueOf(x)); 
      ycordview.setText(String.valueOf(y)); 

      for (int i = 0; i < touchview.getChildCount(); i++) { 
       View current = touchview.getChildAt(i); 
       if (current instanceof Button) { 
        Button b = (Button) current; 

        if (!isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
          b.getBottom())) { 
         b.getBackground().setState(defaultStates); 
        } 

        if (isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
          b.getBottom())) { 
         b.getBackground().setState(STATE_PRESSED); 
         if (b != mLastButton) { 
          mLastButton = b; 
          buttonIndicator.setText(mLastButton.getText()); 
         } 
        } 

       } 
      } 
      return true; 
     } 

    }); 

} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    // TODO Auto-generated method stub 
    super.onWindowFocusChanged(hasFocus); 
} 

static boolean isPointWithin(int x, int y, int x1, int x2, int y1, int y2) { 
    return (x <= x2 && x >= x1 && y <= y2 && y >= y1); 
} 
} 

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/relativelayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#ffffff" > 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginBottom="10dp" 
    android:layout_marginLeft="10dp" 
    android:text="Y Cord : " 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/textView" 
    android:layout_alignParentLeft="true" 
    android:layout_marginBottom="10dp" 
    android:layout_marginLeft="10dp" 
    android:text="X Cord : " 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/textView2" 
    android:layout_toRightOf="@+id/textView" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textColor="#000000" /> 

<TextView 
    android:id="@+id/textView4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/textView" 
    android:layout_marginBottom="10dp" 
    android:layout_toRightOf="@+id/textView" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textColor="#000000" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:text="B1" 
    android:textColor="#000000" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button1" 
    android:text="B2" 
    android:textColor="#000000" /> 

<Button 
    android:id="@+id/button3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button2" 
    android:text="B3" 
    android:textColor="#000000" /> 

<Button 
    android:id="@+id/button4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button3" 
    android:text="B4" 
    android:textColor="#000000" /> 

<TextView 
    android:id="@+id/button_indicator" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignTop="@+id/textView4" 
    android:layout_marginRight="33dp" 
    android:text="No one" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/button_indicator" 
    android:layout_alignBottom="@+id/button_indicator" 
    android:layout_marginRight="29dp" 
    android:layout_toLeftOf="@+id/button_indicator" 
    android:text="Entered: " 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

所以上面給出此代碼工作正常,因爲它承認,當我在任何按鈕輕掃我的手指從空格(相對佈局) 。但是當我從一個按鈕滑動到另一個按鈕時,它不起作用。它沒有得到任何座標,也沒有感覺到我的手指結束了哪個按鈕。下面的圖片最好地解釋了當我從一個按鈕滑動到另一個按鈕時會發生什麼。

那麼,如何獲取座標,同時從一個鍵滑動到另一個?

+0

當你刷卡,被甩,並獲得頂部與您的佈局,使相對佈局0,0是佈局的左上角,但是當您從按鈕0滑動時,0是您窗口小部件的左上角,請在以下鏈接中查看我的回答,m aybe可以幫助你,http://stackoverflow.com/questions/20988635/android-lock-screen-app-button-hover-and-sequence/20988839#20988839 –

+0

謝謝!但它不會支持

+0

只是複製和過去的代碼到新項目,如果你刪除動畫,那麼它的工作適用於所有版本, –

回答

3

MainActivity.java

package com.example.touch; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.RelativeLayout; 
    import android.widget.TextView; 

    public class MainActivity extends Activity { 

     MyButton b1, b2, b3, b4; 

     int b1x1, b1x2, b1y1, b1y2; 

     private TextView xcordview; 
     private TextView ycordview; 
     private TextView buttonIndicator; 
     private RelativeLayout touchview; 
     private static int defaultStates[]; 
     private Button mLastButton; 
     private final static int[] STATE_PRESSED = { 
       android.R.attr.state_pressed, 
       android.R.attr.state_focused 
         | android.R.attr.state_enabled }; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      xcordview = (TextView) findViewById(R.id.textView4); 
      ycordview = (TextView) findViewById(R.id.textView3); 
      buttonIndicator = (TextView) findViewById(R.id.button_indicator); 
      touchview = (RelativeLayout) findViewById(R.id.relativelayout); 

      b1 = (MyButton) findViewById(R.id.button1); 
      b2 = (MyButton) findViewById(R.id.button2); 
      b3 = (MyButton) findViewById(R.id.button3); 
      b4 = (MyButton) findViewById(R.id.button4); 
      defaultStates = b1.getBackground().getState(); 

     } 

     @Override 
     protected void onResume() { 
      // TODO Auto-generated method stub 
      super.onResume(); 

      touchview.setOnTouchListener(new View.OnTouchListener() { 

       private boolean isInside = false; 

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

        int x = (int) event.getX(); 
        int y = (int) event.getY(); 

        xcordview.setText(String.valueOf(x)); 
        ycordview.setText(String.valueOf(y)); 

        for (int i = 0; i < touchview.getChildCount(); i++) { 
         View current = touchview.getChildAt(i); 
         if (current instanceof Button) { 
          Button b = (Button) current; 

          if (!isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
            b.getBottom())) { 
           b.getBackground().setState(defaultStates); 
           b.getBackground().setAlpha(255); 
          } 

          if (isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
            b.getBottom())) { 
           b.getBackground().setState(STATE_PRESSED); 
           b.getBackground().setAlpha(150); 
           b.performClick(); 

           if (b != mLastButton) { 
            mLastButton = b; 
            buttonIndicator.setText(mLastButton.getText()); 
           } 
          } 

         } 
        } 
        return true; 
       } 

      }); 

     } 

     @Override 
     public void onWindowFocusChanged(boolean hasFocus) { 
      // TODO Auto-generated method stub 
      super.onWindowFocusChanged(hasFocus); 
     } 

     static boolean isPointWithin(int x, int y, int x1, int x2, int y1, int y2) { 
      return (x <= x2 && x >= x1 && y <= y2 && y >= y1); 
     } 
    } 

MyButton.java

package com.example.touch; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.Button; 

public class MyButton extends Button { 

    public MyButton(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // TODO Auto-generated constructor stub 
    } 

    public MyButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    public MyButton(Context context) { 
     super(context); 
     // // TODO Auto-generated constructor stub 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // TODO Auto-generated method stub 
     // return super.onTouchEvent(event); 
     return false; 
    } 

} 

佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/relativelayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff" > 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginLeft="10dp" 
     android:text="Y Cord : " 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView" 
     android:layout_alignParentLeft="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginLeft="10dp" 
     android:text="X Cord : " 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView2" 
     android:layout_toRightOf="@+id/textView" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="#000000" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView" 
     android:layout_marginBottom="10dp" 
     android:layout_toRightOf="@+id/textView" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="#000000" /> 

    <com.example.touch.MyButton 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="B1" 
     android:textColor="#000000" /> 

    <com.example.touch.MyButton 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/button1" 
     android:text="B2" 
     android:textColor="#000000" /> 

    <com.example.touch.MyButton 
     android:id="@+id/button3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/button2" 
     android:text="B3" 
     android:textColor="#000000" /> 

    <com.example.touch.MyButton 
     android:id="@+id/button4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/button3" 
     android:text="B4" 
     android:textColor="#000000" /> 

    <TextView 
     android:id="@+id/button_indicator" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@+id/textView4" 
     android:layout_marginRight="33dp" 
     android:text="No one" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/button_indicator" 
     android:layout_alignBottom="@+id/button_indicator" 
     android:layout_marginRight="29dp" 
     android:layout_toLeftOf="@+id/button_indicator" 
     android:text="Entered: " 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 
+0

好的工作。我從你的代碼開發擴展代碼。在我的代碼中,我將使用FrameLayout在一輪中定位這些按鈕。但是,當我滑動時,我無法捕捉按鈕文本。你能幫我請http://stackoverflow.com/questions/39489343/how-to-detect-a-button-in-framelayout-when-swipe-buttons – Jame