【问题标题】:how to get clicks on two overlapping button in same frame layout in android如何在android中的同一框架布局中点击两个重叠按钮
【发布时间】:2013-11-16 09:13:44
【问题描述】:

我有两个三角形图像,我想用作按钮背景。 我使用框架布局进行重叠并能够制作出所需的形状,如图所示。

现在我只是在每个按钮上放置了 onclick 监听器,但它不能正常工作,每次只能点击两个按钮。

请帮我找到解决办法。

这是我的代码 mainActivity.java 代码。

      package com.example.buttontest;

import java.util.Locale;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnGestureListener{
    private GestureDetector gestureDetector;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gestureDetector=new GestureDetector(this);

        Button b1=(Button)findViewById(R.id.button2);

        Button b2=(Button)findViewById(R.id.button1);

        b1.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent e) {
                int width = findViewById(R.id.button1).getWidth();
                int height = findViewById(R.id.button1).getHeight();
                float touchedX = e.getX();
                float touchedY = e.getY();
                boolean inUpperTriangle = (height - touchedY) * width > touchedX * height;
                if(inUpperTriangle==true)
                    Toast.makeText(getApplicationContext(), "upper",Toast.LENGTH_SHORT).show();

                if(inUpperTriangle) gestureDetector.onTouchEvent(e);
                return inUpperTriangle;
            }

        });

        b2.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent e) {




                int width = findViewById(R.id.button2).getWidth();
                int height = findViewById(R.id.button2).getHeight();
                float touchedX = e.getX();
                float touchedY = e.getY();
                boolean inLowerTriangle = (height - touchedY) * width < touchedX * height;
                if(inLowerTriangle==true)
                    Toast.makeText(getApplicationContext(), "lower",Toast.LENGTH_SHORT).show();
                if(inLowerTriangle) gestureDetector.onTouchEvent(e);
                return inLowerTriangle;
            }
        });




    }


    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }


    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        return false;
    }


    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }


    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }


    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }


    public boolean onSingleTapUp(MotionEvent e) {
        return true;
    }

}

我的布局文件是。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/FrameLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button2" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button1" />

请告诉我如何正确点击这两个按钮。

这是我的 drawables。我使用黄色三角形作为按钮 1 图像,使用绿色作为按钮 2 图像。

【问题讨论】:

  • 图片看起来很有趣。你能把它们贴出来吗?我会带着 TouchListener 去这里。我的答案很快就会出现。
  • 你的问题解决了吗..请指导我

标签: android button layout onclick android-framelayout


【解决方案1】:

我会使用 TouchListener 而不是点击监听器。如果当前视图对它没有用处,TouchListener 可以检查事件并将其传递给下一个视图。

所以,做以下事情:

  • 在每个按钮上注册一个 TouchListener。

  • 在监听器中,检查触摸区域是否在三角形内。如果是这样,请使用该事件(例如显示 Toast)和 return true。如果没有,return false 在监听器中。

到目前为止一切顺利。实现 TouchListener 比实现点击事件要复杂一些。请参阅this answer about detecting taps,其中我添加了一些简短的示例源代码,用于实现一个简单的 TouchListener,它可以检测单击(有效单击)和其他手势,并检测用户实际触摸的位置。

在您的情况下,您只需创建两个侦听器,如链接中的一个,并将它们链接到这两个侦听器。

findViewById(R.id.button1).setOnTouchListener(new OnTouchListener() {...});
findViewById(R.id.button2).setOnTouchListener(new OnTouchListener() {...});

编辑:通过一些数学运算,您可以轻松找出实际触摸了哪个三角形。 下面是使用 TouchListener 实现的代码 sn-p:

public boolean onTouch(View v, MotionEvent event) {
    int width = findViewById(R.id.button1).getWidth();
    int height = findViewById(R.id.button1).getHeight();
    float touchedX = event.getX();
    float touchedY = event.getY();
    boolean inUpperTriangle = (height - touchedY) * width > touchedX * height;

    if(inUpperTriangle) gestureDetector.onTouchEvent(event);
    return inUpperTriangle;
}

用这个 onTouch 方法替换这个链接中源代码的onTouch。为第二个按钮创建相同的方法,只是对下三角形进行反应。然后,您可以在手势侦听器的onSingleTapUp 方法中检测到按钮,侦听器链接到是否被触摸并对其做出反应。

请注意,视图的左上角坐标为 (0,0),y 轴向下增加。这就是(height-touchedY) 的原因。

【讨论】:

  • 你能解释一下如何检查触摸区域在三角形内吗??
  • 这是简单的数学运算。我添加了一些代码来给你计算的实际坐标。每个视图的左上角坐标为(0,0),y轴从上到下递增。
  • 这东西单独工作,但是当我使用框架布局时,只执行下按钮触摸事件。上半部分不做任何事情。你能告诉我如何将这两个按钮合并成一个单独的上图吗?
  • 你应该有两个 TouchListener。每个按钮一个。所有按钮都获得 ACTION_DOWN 事件。但只有一个返回 true 的那个会获取所有其他事件并且可以识别手势。我想我现在看到了问题。让我编辑我的答案。我犯了一个错误。
  • 好的,已编辑。您必须直接在onTouch 中检查直角三角形。
猜你喜欢
  • 2016-09-02
  • 2011-02-14
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多