我想将每个六边形设置为可点击按钮。目前我有一个" hexagon.png" (带有隐形角的方形图像),问题是隐形角也是可点击的,当您尝试单击相邻六边形时,您可以单击近端按钮的不可见角。检查下图。
我该如何切角?
任何想法?
我想过用圆角设置按钮,但这并没有解决问题。
这是我目前使用的代码:
的 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;
}
}
答案 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
答案 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;
}
}
请勿使用ImageView
或ImageButton
使用如下所示:
<"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)