将屏幕坐标从按钮传递给父对象 [英] Pass screen coordinates from button to parent

查看:53
本文介绍了将屏幕坐标从按钮传递给父对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为Android制作钢琴应用程序.作为一个样本(测试),我在活动中有4个按钮.父级是Relative Layout,我也有一些textview可以告诉您手指触摸的屏幕坐标.还有一个textView("Entered Button")可以检测您的手指是否在按钮上方
它是这样的:

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?

推荐答案

MainActivity.java

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

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>

这篇关于将屏幕坐标从按钮传递给父对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆