Hi Leute,
ich möchte mir folgende Applikation bauen:
Ich habe einen Grundriss von einem Gebäude. Diesen drehe ich je nach Rotation des Device mit dem magnetischen Kompass. Soweit so gut. Es gibt jetzt aber auf dem Grundriss verschiedene Punkte, die von Interesse sind. Nennen wir sie einfach mal POI. Der User soll mit seinen Fingerchen nun einen POI per Click auswählen. Dann passiert irgendwas. So, mein Problem ist es herauszubekommen, wann ich meinen POI geklickt habe und wann daneben. Ich habe hier mal ein paar Code-snippets:
Hier mal das Layout:
tja, da sollte jetzt XML stehen, geht aber nicht
also: Relatives Layout mit fill_parent in beide Richtungen. Darin dann die CompassView, hit fill_parent in beide Richtungen.
Und jetzt die View:
protected void onDraw(Canvas canvas) {
if (canvas==null) throw new NullPointerException();
if (!drawing.compareAndSet(false, true)) return;
float bearing = GlobalData.getBearing();
if (bitmap.getWidth()>canvas.getWidth() || bitmap.getHeight()>canvas.getHeight()) {
//Resize the bitmap to the size of the canvas
bitmap = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth()*.9), (int)(bitmap.getHeight()*.9), true);
}
int bitmapX = bitmap.getWidth()/2;
int bitmapY = bitmap.getHeight()/2;
int parentX = parentWidth/2;
int parentY = parentHeight/2;
int centerX = parentX-bitmapX;
int centerY = parentY-bitmapY;
int rotation = (int)(360-bearing);
rotation=drehung;
//rotation=0;
matrix.reset();
//Rotate the bitmap around it's center point so it's always pointing north
matrix.setRotate(rotation, bitmapX, bitmapY);
//Move the bitmap to the center of the canvas
matrix.postTranslate(centerX, centerY);
canvas.drawBitmap(bitmap, matrix, paint);
bobbelX=bobbel.getWidth()/2;
bobbelY=bobbel.getHeight()/2;
bobbelcenterX = parentX-bobbelX;
bobbelcenterY = parentY-bobbelY;
/*bobbel*/matrix.reset();
/*bobbel*/matrix.setRotate(rotation,bobbelX,bobbelY);
/*bobbel*/matrix.postTranslate(bobbelcenterX, bobbelcenterY);
//canvas.drawBitmap(bobbel, bobbelmatrix, paint);
canvas.drawBitmap(bobbel, matrix, paint);
// canvas.drawBitmap(bobbel,100,100,paint);
/*bobbel*/matrix.getValues(werte);
drawing.set(false);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//drehung += 90;
// TODO Auto-generated method stub
Matrix inverse = new Matrix();
Matrix inverseWerte = new Matrix();
this.getImageMatrix().invert(inverse);
this.getImageMatrix().invert(inverseWerte);
float[] touchPoint = new float[] {event.getX(), event.getY()};
float[] bobbelPoint = new float[] {werte[2], werte[5]};
inverse.mapPoints(touchPoint);
inverseWerte.mapPoints(bobbelPoint);
Toast.makeText( this.getContext(),
"TouchX = " + event.getX() +
"TouchY = " + event.getY() +
"TouchXRaw = " + event.getRawX() +
"TouchYRaw = " + event.getRawY() +
" 2=" + werte[2] +
" 5=" + werte[5]
,
Toast.LENGTH_LONG).show();
return super.onTouchEvent(event);
}
Alles anzeigen
So, ich klicke oder touche auf dem Screen.
1. Mein erstes Problem ist, für das Touch-Event bekomm ich Koordinaten zurück, die grösser als 100 sind. Sollten aber doch im linken oberen Eck 0,0 sein?!?
2. Wenn ich mir die Koordinaten von bobbel (das ist mein POI) ausgeben lasse, so habe ich 3 mal zwei positive Werte, einmal einen negativen und einen Positiven Wert. Das Bitmap bobbel ist aber zu sehen, der negative Wert geht mir gar nicht rein.
Ich bin mir mittlerweile nicht mehr sicher, ob dies der richtige Ansatz für das Problem ist. Es sollte aber doch möglich sein, beide Koordinatensysteme (von der View und von dem Bitmap) irgendwie zusammenzubringen.
Ihr seht ja in meinem Code, was ich alles schon an Ideen hatte und was alles nicht zielführend war ...
Ich sage schon mal Danke für eure Antworten.
linuxanton