如何从按钮上移除角落并使其成为六边形?

时间:2016-05-30 07:08:43

标签: android button

我想将每个六边形设置为可点击按钮。目前我有一个" hexagon.png" (带有隐形角的方形图像),问题是隐形角也是可点击的,当您尝试单击相邻六边形时,您可以单击近端按钮的不可见角。检查下图。 我该如何切角? 任何想法?
LAG Cleaner

我想过用圆角设置按钮,但这并没有解决问题。

这是我目前使用的代码: 的 MainActivity
     公共类MainActivity扩展了AppCompatActivity实现         View.OnClickListener {

private TransparentIgnoreButton buton1,buton2,buton3,buton4,buton5,buton6,buton7,buton8,buton9,buton10,buton11;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    buton1 = (TransparentIgnoreButton) findViewById(R.id.but1);
    buton2 = (TransparentIgnoreButton) findViewById(R.id.but2);
    buton3 = (TransparentIgnoreButton) findViewById(R.id.but3);
    buton4 = (TransparentIgnoreButton) findViewById(R.id.but4);
    buton5 = (TransparentIgnoreButton) findViewById(R.id.but5);
    buton6 = (TransparentIgnoreButton) findViewById(R.id.but6);
    buton7 = (TransparentIgnoreButton) findViewById(R.id.but7);
    buton8 = (TransparentIgnoreButton) findViewById(R.id.but8);
    buton9 = (TransparentIgnoreButton) findViewById(R.id.but9);
    buton10 = (TransparentIgnoreButton) findViewById(R.id.but10);
    buton11 = (TransparentIgnoreButton) findViewById(R.id.but11);
    buton1.setOnClickListener(this);
    buton2.setOnClickListener(this);
    buton3.setOnClickListener(this);
    buton4.setOnClickListener(this);
    buton5.setOnClickListener(this);
    buton6.setOnClickListener(this);
    buton7.setOnClickListener(this);
    buton8.setOnClickListener(this);
    buton9.setOnClickListener(this);
    buton10.setOnClickListener(this);
    buton11.setOnClickListener(this);
 }


@Override
public void onClick(View view) {
        switch (view.getId()) {
            case R.id.but1:
                AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
                builder1.setTitle("buton1");
                builder1.setMessage("buton1 apasat");
                builder1.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog1, int which) {
                        dialog1.dismiss();
                    }
                });
                AlertDialog dialog1 = builder1.create();
                dialog1.show();
                break;

            case R.id.but2:
                AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
                builder2.setTitle("buton2");
                builder2.setMessage("buton2 apasat");
                builder2.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog2, int which) {
                        dialog2.dismiss();
                    }
                });
                AlertDialog dialog2 = builder2.create();
                dialog2.show();
                break;
            case R.id.but3:
                AlertDialog.Builder builder3 = new AlertDialog.Builder(this);
                builder3.setTitle("buton3");
                builder3.setMessage("buton3 apasat");
                builder3.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog3, int which) {
                        dialog3.dismiss();
                    }
                });
                AlertDialog dialog3 = builder3.create();
                dialog3.show();
                break;
            case R.id.but4:
                AlertDialog.Builder builder4 = new AlertDialog.Builder(this);
                builder4.setTitle("buton4");
                builder4.setMessage("buton4 apasat");
                builder4.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog4, int which) {
                        dialog4.dismiss();
                    }
                });
                AlertDialog dialog4 = builder4.create();
                dialog4.show();
                break;
            case R.id.but5:
                AlertDialog.Builder builder5 = new AlertDialog.Builder(this);
                builder5.setTitle("buton5");
                builder5.setMessage("buton5 apasat");
                builder5.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog5, int which) {
                        dialog5.dismiss();
                    }
                });
                AlertDialog dialog5 = builder5.create();
                dialog5.show();
                break;
            case R.id.but6:
                AlertDialog.Builder builder6 = new AlertDialog.Builder(this);
                builder6.setTitle("buton6");
                builder6.setMessage("buton6 apasat");
                builder6.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog6, int which) {
                        dialog6.dismiss();
                    }
                });
                AlertDialog dialog6 = builder6.create();
                dialog6.show();
                break;
            case R.id.but7:
                AlertDialog.Builder builder7 = new AlertDialog.Builder(this);
                builder7.setTitle("buton7");
                builder7.setMessage("buton7 apasat");
                builder7.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog7, int which) {
                        dialog7.dismiss();
                    }
                });
                AlertDialog dialog7 = builder7.create();
                dialog7.show();
                break;
            case R.id.but8:
                AlertDialog.Builder builder8 = new AlertDialog.Builder(this);
                builder8.setTitle("buton8");
                builder8.setMessage("buton8 apasat");
                builder8.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog8, int which) {
                        dialog8.dismiss();
                    }
                });
                AlertDialog dialog8 = builder8.create();
                dialog8.show();
                break;
            case R.id.but9:
                AlertDialog.Builder builder9 = new AlertDialog.Builder(this);
                builder9.setTitle("buton9");
                builder9.setMessage("buton9 apasat");
                builder9.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog9, int which)  {
                        dialog9.dismiss();
                    }
                });
                AlertDialog dialog9 = builder9.create();
                dialog9.show();
                break;
            case R.id.but10:
                AlertDialog.Builder builder10 = new  AlertDialog.Builder(this);
                builder10.setTitle("buton10");
                builder10.setMessage("buton10 apasat");
                builder10.setPositiveButton("Ok", new  DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog10, int which)  {
                        dialog10.dismiss();
                    }
                });
                AlertDialog dialog10 = builder10.create();
                dialog10.show();
                break;
            case R.id.but11:
                AlertDialog.Builder builder11 = new      AlertDialog.Builder(this);
                builder11.setTitle("buton11");
                builder11.setMessage("buton11 apasat");
                builder11.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog11, int which)      {
                        dialog11.dismiss();
                    }
                });
                AlertDialog dialog11 = builder11.create();
                dialog11.show();
                break; }
 }
 }


activity_main layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/black"
android:orientation="vertical"
tools:context="com.example.lungu.myapplication.MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.1" />
<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.3">
<com.example.lungu.myapplication.TransparentIgnoreButton
    android:id="@+id/but1"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_gravity="center_horizontal|center_vertical"
    android:background="@drawable/hexagon" />

    <com.example.lungu.myapplication.TransparentIgnoreButton
    android:id="@+id/but2"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_gravity="center_horizontal|center_vertical"
    android:layout_marginTop="117dp"
    android:layout_marginLeft="76dp"
    android:background="@drawable/hexagon2" />

    <com.example.lungu.myapplication.TransparentIgnoreButton
    android:id="@+id/but3"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_gravity="center_horizontal|center_vertical"
    android:layout_marginTop="117dp"
    android:layout_marginRight="76dp"
    android:background="@drawable/hexagon2" />
    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but4"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginTop="117dp"
        android:layout_marginLeft="228dp"
        android:background="@drawable/hexagon2" />

    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but5"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginTop="117dp"
        android:layout_marginRight="228dp"
        android:background="@drawable/hexagon2" />

    <com.example.lungu.myapplication.TransparentIgnoreButton
    android:id="@+id/but6"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_gravity="center_horizontal|center_vertical"
    android:layout_marginLeft="151dp"
    android:background="@drawable/hexagon2" />
    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but7"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginRight="151dp"
        android:background="@drawable/hexagon2" />
    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but8"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginBottom="117dp"
        android:layout_marginLeft="76dp"
        android:background="@drawable/hexagon2" />
    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but9"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginBottom="117dp"
        android:layout_marginRight="76dp"
        android:background="@drawable/hexagon2" />
    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but10"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginBottom="117dp"
        android:layout_marginRight="228dp"
        android:background="@drawable/hexagon2" />

    <com.example.lungu.myapplication.TransparentIgnoreButton
        android:id="@+id/but11"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:layout_marginBottom="117dp"
        android:layout_marginLeft="228dp"
        android:background="@drawable/hexagon2" />

</FrameLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.2">

</LinearLayout>
</LinearLayout>

TransparentIgnoreButton.java
    公共类TransparentIgnoreButton扩展Button     {     public TransparentIgnoreButton(Context context)     {     超级(上下文);     setDrawingCacheEnabled(真);     }     public TransparentIgnoreButton(Context context,AttributeSet attrs)     {         super(context,attrs);         setDrawingCacheEnabled(真);     }

public TransparentIgnoreButton(Context context, AttributeSet attrs, int defStyleAttr)
{
    super(context, attrs, defStyleAttr);
    setDrawingCacheEnabled(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    // ignores touches on transparent background
    if (isPixelTransparent(x, y))
        return false;
    else
        return super.onTouchEvent(event);
}

/**
 * @return true if pixel from (x,y) is transparent
 */
private boolean isPixelTransparent(int x, int y) {
    Bitmap bmp = Bitmap.createBitmap(getDrawingCache());
    int color = Color.TRANSPARENT;
    try {
        color = bmp.getPixel(x, y);
    } catch (IllegalArgumentException e) {
        // x or y exceed the bitmaps bounds.
        // Reverts the View's internal state from a previously set "pressed" state.
        setPressed(false);
    }

    // Ignores touches on transparent background.
    if (color == Color.TRANSPARENT)
        return true;
    else
        return false;
}
}

3 个答案:

答案 0 :(得分:0)

如果您想使用Imageview,可以使用此库。这允许我们创建自定义形状的ImageView。 您可以在Imageview Onclicklistener上编写代码。

https://github.com/siyamed/android-shape-imageview

看看这个

<com.github.siyamed.shapeimageview.{ClassName}
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="8dp"
    android:src="@drawable/neo"
    app:siBorderWidth="8dp"
    app:siBorderColor="@color/darkgray"/>

<强>属性:

  • siBorderColor边框颜色

  • db中的siBorderWidth边框宽度

  • 边界的siBorderAlpha alpha值介于0.0-1.0

  • 之间
  • siStrokeCap边框描边帽类型对接|圆形

  • siStrokeJoin border stroke join type bevel | miter | round    siSquare将宽度和高度设置为给定值的最小值true | false

  • siShape对SVG的引用。这是由ShapeImageView使用的,而不是它的子类。

答案 1 :(得分:0)

在您的项目中添加此类:

TransparentIgnoreButton:

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

/**
 * Created by mehrdad on 10/27/2015.
 */
public class TransparentIgnoreButton extends Button
{
    public TransparentIgnoreButton(Context context)
    {
        super(context);
        setDrawingCacheEnabled(true);
    }

    public TransparentIgnoreButton(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setDrawingCacheEnabled(true);
    }

    public TransparentIgnoreButton(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        setDrawingCacheEnabled(true);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        // ignores touches on transparent background
        if (isPixelTransparent(x, y))
            return false;
        else
            return super.onTouchEvent(event);
    }

    /**
     * @return true if pixel from (x,y) is transparent
     */
    private boolean isPixelTransparent(int x, int y) {
        Bitmap bmp = Bitmap.createBitmap(getDrawingCache());
        int color = Color.TRANSPARENT;
        try {
            color = bmp.getPixel(x, y);
        } catch (IllegalArgumentException e) {
            // x or y exceed the bitmaps bounds.
            // Reverts the View's internal state from a previously set "pressed" state.
            setPressed(false);
        }

        // Ignores touches on transparent background.
        if (color == Color.TRANSPARENT)
            return true;
        else
            return false;
    }
}

请勿使用ImageViewImageButton

使用如下所示:

<"your package name".TransparentIgnoreButton
            android:layout_width="wrap_content"
            android:id="@+id/img_center"
            android:background="@drawable/your pic"
            android:layout_height="wrap_content"/>

并在java中初始化如下:

private TransparentIgnoreButton imgCenter;
imgCenter = (TransparentIgnoreButton) findViewById(R.id.img_center);

答案 2 :(得分:0)

我想到了几种解决方案 从我所看到的那些haxagons是一个图像,如果是这样,最简单的解决方案是创建具有透明视图的叠加并通过计算屏幕宽度的位置来检测点击(您知道图像的纵横比,因此每个六边形的中心偏移x和y是可以用这个宽度和纵横比计算的。)您可以使用六边形中心检测逐个圆的近似值。像这样:

public OverlayView extends View{
....
boolean onTouchEvent (MotionEvent event){
    //aproximating with circle
}
....
}

通过setOnTouchListener可以实现相同的效果(使用此功能,您无需扩展View)