首先非常感謝你的所有建議,幫助我實現了目標。
由於無法在形狀上觸發事件,因此在包含形狀的視圖上使用onTouch()是一種可行的方法。
以下是您需要的全部內容。
首先,自定義視圖Zones.java:
package com.vector;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class Zones extends View {
RectF rectf = new RectF(0, 0, 300, 300);
Paint paint = new Paint();
Canvas canvas = null;
Integer zone = 0;
// important: do not forget to add AttributeSet, it is necessary to have this
// view called from an xml view file
public Zones(Context context, AttributeSet attributeset) {
super(context, attributeset);
this.setBackgroundColor(0xFF207CA1);
}
@Override
protected void onDraw(Canvas canvas) {
// set layout of the view
layout(0, 0, 300, 300);
// expose canvas at view level
this.canvas = canvas;
// check for zone 1 to 3
if(zone >= 1 && zone <= 3)
{
drawTouchZones(zone);
}
}
protected void drawTouchZones(Integer zone)
{
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setColor(Color.WHITE);
paint.setAlpha(75);
Path path = new Path();
if(zone == 1) {
path.moveTo(150,150);
path.lineTo(150,0);
path.arcTo(rectf, 270, 120);
path.close();
} else if(zone == 2) {
path.moveTo(150,150);
path.arcTo(rectf, 30, 120);
path.lineTo(150,150);
path.close();
} else if(zone == 3) {
path.moveTo(150,0);
path.lineTo(150,150);
path.arcTo(rectf, 150, 120);
path.close();
}
canvas.drawPath(path, paint);
}
}
二,主要活動,Design.java:
package com.vector;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class Design extends Activity {
/** Called when the activity is first created. */
private Zones v;
protected Integer zone = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// get our custom view
setContentView(R.layout.main);
v = (Zones) findViewById(R.id.zone);
// add onClick Listener
v.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Log.i("zone clicked", "" + zone);
// tell to our view which zone has been clicked
v.zone = zone;
// invalidate to call onDraw method of the custom view and draw the zone
v.invalidate();
}
});
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
zone = getZone(event);
return false;
}
});
}
catch(Exception e)
{
Log.e("e", e.getMessage());
}
}
// detect clicked zone through MotionEvent
public int getZone(MotionEvent e)
{
Float x = e.getX();
Float y = e.getY();
// 0:00 to 4:00
if((x > 150 && x < 300 && y < 150) ||
(x > 150 && x < 300 && y > 150 && (x - 150)/(y - 150) > 1.5))
{
return 1;
}
// 4:00 to 8:00
else if((x >= 150 && x < 300 & y > 150 && (x - 150)/(y - 150) < 1.5) ||
(x > 0 && x < 150 && y > 150 && (150 - x)/(y - 150) < 1.5))
{
return 2;
}
// 8:00 to 0:00
else
{
return 3;
}
}
}
...和主XML視圖(其嵌入我們的自定義類視圖)main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.vector.Zones android:id="@+id/zone" android:layout_height="wrap_content" android:layout_width="wrap_content">
</com.vector.Zones>
</LinearLayout>
任何意見感謝! Paul :)
而不是使用這種座標比較(當然哪些工作),如果你需要更多的區域,我提出的數學方法會更容易適應;) – 2011-04-14 07:27:57