Android 将正方形分成四个可点击的三角形
我想在正方形视图中创建4个三角形按钮 我尝试过使用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"
图层列表创建视图,但不起作用。“左”和“右”按钮将覆盖“上”和“下”按钮的单击事件
<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;
}