Android 将正方形分成四个可点击的三角形

Android 将正方形分成四个可点击的三角形,android,android-layout,Android,Android Layout,我想在正方形视图中创建4个三角形按钮 我尝试过使用图层列表创建视图,但不起作用。“左”和“右”按钮将覆盖“上”和“下”按钮的单击事件 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <rotate android:fromDegrees="45" android:toDegrees="45"

我想在正方形视图中创建4个三角形按钮 我尝试过使用
图层列表创建视图,但不起作用。“左”和“右”按钮将覆盖“上”和“下”按钮的单击事件

  <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
    <rotate
        android:fromDegrees="45"
        android:toDegrees="45"
        android:pivotX="-20%"
        android:pivotY="5%" >
           <shape
              android:shape="rectangle" >
              <gradient
                android:angle="45"
                  android:startColor="#B841CC"
                  android:endColor="#55149f"/>
          </shape>
      </rotate>
    </item>
</layer-list>

这是我的布局设计

    <RelativeLayout
        android:layout_width="@dimen/lwidth"
        android:layout_height="@dimen/lwidth">

        <Button
            android:id="@+id/btngallery"
            android:layout_width="match_parent"
            android:layout_height="@dimen/lheight"
            android:background="@drawable/pink_down"
            android:textAllCaps="false"
            android:text="Gallery"
            android:textColor="@android:color/white"
            android:paddingBottom="@dimen/lmrgnbottom"
            android:textSize="@dimen/lsize"/>
        <Button
            android:id="@+id/btnfromphone"
            android:layout_width="@dimen/lheight"
            android:layout_height="match_parent"
            android:background="@drawable/pink_right"
            android:textAllCaps="false"
            android:text="Select From Phone"
            android:textColor="@android:color/white"/>
        <Button
            android:layout_width="@dimen/lheight"
            android:layout_height="match_parent"
            android:background="@drawable/pink_left"
            android:layout_alignParentRight="true"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="@dimen/lheight"
            android:background="@drawable/pink_up"
            android:layout_alignParentBottom="true"/>

        <ImageView
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:background="@drawable/home_icon"
            android:layout_centerInParent="true"/>


    </RelativeLayout>

  • 您可以通过引入自定义视图
    类MyView扩展视图来实现这一点
    
  • 然后,您可以在这里放置4个可绘制对象,每个三角形一个,或者只需在
    onDraw(Canvas Canvas)
    方法中绘制它们
  • 然后您需要重写
    onTouchEvent
    方法,在这里您可以接收有用的MotionEvent对象。借助它,你可以知道触摸和动作的坐标(向下、向上、移动e.t.c)。更多信息
  • 在此方法中,您将确定单击的每个三角形。您需要先确定动作向下,然后在相同的坐标下动作向上,并有一定的延迟。或者,您可以将GestureDetector连接到自定义视图,并在回调时对SignletApup作出反应。更多信息
下面是一个示例代码(只是一个示例)。它使用硬代码宽度和高度,因此您的任务是使其适应多屏幕和xml,但我通过此示例提供了要点:

public class MyView extends View {

    public enum Triangle {
        RIGHT, LEFT, TOP, BOTTOM
    }

    private final Paint rightPaint = new Paint();
    private final Paint leftPaint = new Paint();
    private final Paint topPaint = new Paint();
    private final Paint bottomPaint = new Paint();

    private final Path rightPath = new Path();
    private final Path leftPath = new Path();
    private final Path topPath = new Path();
    private final Path bottomPath = new Path();

    private OnTriangleTouchedListener triangleTouchedListener;

    public MyView(Context context) {
        super(context);
        init();
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void setOnTriangleTouchedListener(OnTriangleTouchedListener triangleTouchedListener) {
        this.triangleTouchedListener = triangleTouchedListener;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawPath(rightPath, rightPaint);
        canvas.drawPath(leftPath, leftPaint);
        canvas.drawPath(topPath, topPaint);
        canvas.drawPath(bottomPath, bottomPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (event.getX() > 100 && event.getX() <= (200 - event.getY()) ||
                event.getX() <= 100 && event.getX() >= event.getY()) {
                callTriangleTouch(Triangle.TOP);
            } else if (event.getY() > 100 && event.getY() <= (200 - event.getX()) ||
                event.getY() <= 100  && event.getY() >= event.getX()) {
                callTriangleTouch(Triangle.LEFT);
            } else if (event.getY() <= 100 && event.getY() >= (200 - event.getX()) ||
                event.getY() > 100 && event.getY() <= event.getX()) {
                callTriangleTouch(Triangle.RIGHT);
            } else if (event.getX() <= 100 && event.getX() >= (200 - event.getY()) ||
                event.getX() > 100 && event.getX() < event.getY()) {
                callTriangleTouch(Triangle.BOTTOM);
            }
        } 

        return true;
    }

    private void callTriangleTouch(Triangle triangle) {
        if (triangleTouchedListener != null) {
            triangleTouchedListener.onTriangleTouched(triangle);
        }
    }

    private void init() {
        rightPaint.setColor(0xffff0000);
        leftPaint.setColor(0xff00ff00);
        topPaint.setColor(0xff0000ff);
        bottomPaint.setColor(0xffffff00);

        rightPaint.setAntiAlias(true);
        leftPaint.setAntiAlias(true);
        topPaint.setAntiAlias(true);
        bottomPaint.setAntiAlias(true);

        rightPath.moveTo(200, 0);
        rightPath.lineTo(200, 200);
        rightPath.lineTo(100, 100);
        rightPath.lineTo(200, 0);

        leftPath.moveTo(0, 0);
        leftPath.lineTo(100, 100);
        leftPath.lineTo(0, 200);
        leftPath.lineTo(0, 0);

        topPath.moveTo(0, 0);
        topPath.lineTo(200, 0);
        topPath.lineTo(100, 100);
        topPath.lineTo(0, 0);

        bottomPath.moveTo(200, 200);
        bottomPath.lineTo(0, 200);
        bottomPath.lineTo(100, 100);
        bottomPath.lineTo(200, 200);
    }

    public interface OnTriangleTouchedListener {
        void onTriangleTouched(Triangle triangle);
    }
}
公共类MyView扩展了视图{
公共枚举三角形{
右、左、上、下
}
私有最终油漆rightPaint=新油漆();
私有最终油漆leftPaint=新油漆();
私人最终油漆面漆=新油漆();
专用最终油漆底部油漆=新油漆();
私有最终路径rightPath=新路径();
私有最终路径leftPath=新路径();
私有最终路径topPath=新路径();
私有最终路径bottomPath=新路径();
私人OnTriangleTouchedListener三角触摸式Listener;
公共MyView(上下文){
超级(上下文);
init();
}
公共MyView(上下文、属性集属性){
超级(上下文,attrs);
init();
}
公共MyView(上下文上下文、属性集属性、int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
public void setOnTriangleTouchedListener(OnTriangleTouchedListener triangleTouchedListener){
this.triangleTouchedListener=triangleTouchedListener;
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
canvas.drawPath(rightPath,rightPaint);
canvas.drawPath(leftPath,leftPaint);
画布.绘制路径(顶部路径,顶部绘制);
画布.绘制路径(底部路径,底部绘制);
}
@凌驾
公共布尔onTouchEvent(运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
if(event.getX()>100&&event.getX()100&&event.getY()100&&event.getY()100&&event.getX()

通过这种方式,您可以获得所触摸像素的alpha值。现在你可以很容易地检查触摸的像素是否透明。然后点击你需要的按钮

我是android新手,所以我不太清楚,你可以举个例子,然后你需要写一些文章,介绍如何创建自定义视图,如何绘制以及如何响应触摸事件。只需在谷歌上搜索每个项目。@Sagar为您添加了示例代码。我希望你会感激它。这只是一个例子,所以你需要把它变得更漂亮,删除可疑申请和e.t.c.但一般原则,我希望,你可以参考那个链接
ImageView image=(ImageView) findViewById(R.id.imageView1);
image.setOnTouchListener(this);
Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();    

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int pixel = bitmap.getPixel((int)event.getX(), (int)event.getY());
int alphaValue=Color.alpha(pixel);
return true;
}