Pass screen coordinates from button to parent

♀尐吖头ヾ 提交于 2019-12-11 03:20:17

问题


I am making a piano app for android. As a sample(test), I have 4 buttons in my activity. The parent is a Relative Layout and I also have a few textviews that tell the screen coordinates of the finger touch. There is one more textView("Entered Button") that detects if your finger is over a button or not
This is what it looks like:

I achieved this using the code given below.

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>

So this code given above works fine as it recognizes when i swipe my finger from the white space (Relative layout) over any button. But when I swipe from a button to another button, it doesn't work. It doesn't get any coordinates, nor does it sense which button my finger is over. The below image explains best what happens when I swipe from a button to another button.

So how do I get the coordinates while swiping from one button to another?


回答1:


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

}

Layout:

<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>


来源:https://stackoverflow.com/questions/21903343/pass-screen-coordinates-from-button-to-parent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!