如何在Android中制作相互重叠的自定义形状按钮

6
我有6张带透明背景的单独图片。如何将这些图片合并为按钮,例如:

enter image description here

根据我阅读的内容,我猜想我需要使用Frame Layout来实现重叠按钮。

当点击时,我需要每个颜色都是单独的按钮。

更新:我制作了一个演示,并在onclick方法中检查透明度,但是当我点击红色和蓝色交界处附近的红色区域时,由于重叠视图,它无法注册为红色按钮被点击。请帮忙!

https://www.dropbox.com/s/fc98nnnfbrtdh82/Photo%20Apr%2016%2C%202%2002%2013.jpg?dl=0

公共布尔型 onTouch(View v, MotionEvent event) {
                                     int eventPadTouch = event.getAction();
                                     int iX = (int)event.getX();
                                     int iY = (int)event.getY();          
                                     switch (eventPadTouch) {

                                         case MotionEvent.ACTION_DOWN:

                                             if (iX>=0 & iY>=0 & iX<TheBitmap.getWidth() & iY<TheBitmap.getHeight()&TheBitmap.getPixel(iX,iY)!=0) {
                                                 if (TheBitmap.getPixel(iX,iY)!=0) {
                                                     Toast.makeText(getApplicationContext(),"clicked blue",Toast.LENGTH_LONG).show();

                                                 }
                                             }
                                             return true;
                                     }

                                     return false;
                                 }
                             }

你有任何已经尝试过的代码吗?这将有助于其他人回答你的问题。 - Juan Carlos Farah
我没有时间去找出并写出答案,但你可以在谷歌上搜索“android非矩形按钮”。那里的stackoverflow问题会指引你正确的方向。由于你所有的按钮都是不同颜色的,一个想法是在onTouch事件中获取颜色。 - Suragch
2个回答

2
您需要使用相对布局来使用ImageView放置背景图像,如下所示:
activity_layout.xml
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"/> 
</RelativeLayout>

之后,您需要在drawable中创建一个单独的xml文件,尽可能准确地定义每个形状。在这里了解更多信息: http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape 一个示例形状xml文件如下:
drawable/myshape1.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<stroke
  android:width="2dp"
  android:color="#FFFFFF" />

<corners android:radius="5dp" />

<gradient
  android:angle="270"
  android:centerColor="#6E7FFF"
  android:endColor="#142FFC"
  android:startColor="#BAC2FF" /> 
</shape>

最后,创建所有形状后,您可以像这样将它们添加到activity_layout.xml文件中:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/bg"/>


        <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_margin="20dp"
        android:background="@drawable/myshape1"
        android:orientation="vertical"
        android:padding="5dp" >


</RelativeLayout>

确保创建的形状尽可能透明,并将onClick处理程序附加到它们上以执行分配的任务。

编辑:

根据您的评论,还有一种通过覆盖OnTouch监听器来捕获位图中的像素并确定其颜色的方法。

imageView.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
         if (event.getAction() == MotionEvent.ACTION_DOWN){
                ImageView imageView = (ImageView) v;
                Bitmap bitmap =((BitmapDrawable)imageView.getDrawable()).getBitmap();
                int pixel = bitmap.getPixel(event.getX(),event.getY());
                int redValue = Color.red(pixel);
                int blueValue = Color.blue(pixel);
                int greenValue = Color.green(pixel);
//Now that you know the color values you can decide on what you want to do based on the color combination.
         }
         return true;
     }
});

你的建议是我应该在上面的图像上绘制6个形状吗?大多数人建议定位位图颜色,但对于每个图像,当按下时我还有一个press_state_image,所以不能这样做 :(( - kelly rose
@kellyrose,我已经更新了我的答案,试图解决位图颜色问题。 - Tarek
那我不需要再创建形状了吗?颜色是渐变的,不完全是红色或蓝色,所以我在主活动中使用Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.YOUR_IMAGE_ID)来获取资源得分,但应用程序一直崩溃。 - kelly rose
已经解决了崩溃问题,但是如果使用这种方法,我仍然不认为我可以在单击时更改图像。通常我们会在drawable中创建.xml文件,并使用selector选择按下和未按下状态的图像。如果按照您的建议进行操作,我将不得不将6个部分(如我所示的图片)作为一个整体加载,因此无法更改单个按钮。 - kelly rose
@kellyrose 红色,蓝色和绿色是创建所有颜色的主要颜色(还有CMYK,但那只用于打印)。 为了能够确定哪个按钮被按下,要重写onTouch(是的,您不需要上面的所有内容,只需要覆盖重写),并使用RGB的组合来判断哪个按钮被按下。例如,如果我将您的图像导入图像编辑器,我可以告诉您蓝色按钮的RGB值范围是从(10,10,240)到(25,40,100)(我只是随意举例,但我希望您明白我的意思。 http://en.wikipedia.org/wiki/RGB_color_model - Tarek
谢谢,我明白您的意思,但我想创建6个按钮而不是一个按钮,然后检查颜色以确定操作。 我做了这个小演示,并在on touch方法中检查透明度。 当每个按钮独立时,它很好用,但是当我将按钮重叠放置时就会出问题,就像这样(https://www.dropbox.com/s/fc98nnnfbrtdh82/Photo%20Apr%2016%2C%202%2002%2013.jpg?dl=0)。如果我单击靠近蓝色区域线(交叉点)附近的红色区域,则什么也不会发生(应该显示toast“ clinked red”)。 你知道如何解决吗? 非常感谢,我还是新手。 - kelly rose

0
您可以始终使用RelativeLayout作为包装器,然后将未来的按钮添加为子元素,并将它们定位重叠。

例如:
 <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    *
    *
    *
</RelativeLayout>

你可以使用对齐/边距/坐标来定位ImageView(或Button)。

希望这有所帮助。


谢谢,我创建了两个重叠的测试按钮,但是当点击重叠区域时(例如,如果我点击靠近蓝色区域的红色区域),由于它仍然在蓝色形状的矩形区域内,所以什么也不会发生。你知道怎么解决吗? - kelly rose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接