Во-первых, большое спасибо за все ваши предложения, которые помогли мне достичь цели.
Поскольку невозможно вызвать события на фигурах, использование 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>
Любые комментарии приветствуются!Пол :) 1017 *