Also die Artikel passen sehr gut! Hab sie mir mal aufmerksam durchgelesen und komm zu dem Ergebnis, dass das soweit ich das sehe nicht an diesen Wegen vorbei führt.
So wie ich das verstehe komme ich aber anscheinend nicht an dem - nennen wir es mal Hardcodieren - vorbei oder? Ich hätte ja alles eigentlich schon hinbekommen können, würde ich mit selbst definierten Bereichen (Winkel des Pointers + Abstand zum Zentrum) arbeiten. Nur dachte ich eben an die Displaykompatibilität der untersch. Geräte.
Daher der Gedanke mit dem Abfragen auf welchem Objekt losgelassen wird.
Mit dem GestureDetector bekomme ich auf jeden Fall die Gestiken hin usw. was aber IMHO mit Koordinaten und selbst definierten Grenzen verbunden ist.
Ich geb gerne dazu etwas mehr Info raus
Hier einmal meine Testactivity (ich kopiere es einfach rein, wenn das korrekt ist?):
P.S. Ich hab auch einmal was von setTag getTag gehört, hab damit noch nichts weiter gemacht und die Infos aus dem Internet geben mir auch nicht wirklich Aufschluss auf welche Art und Weise mir das hilfreich sein kann. Habt ihr/du dazu eine Meinung?
package fraso.projectsoula;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
//Imports erst einmal vernachlässigen, das kommt vom Probieren
public class test_stripe extends AppCompatActivity {
float btOX;
float btOY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_stripes);
final ImageView stripe1 = (ImageView) findViewById(R.id.stripe1);
final ImageView stripe2 = (ImageView) findViewById(R.id.stripe2);
final ImageView stripe3 = (ImageView) findViewById(R.id.stripe3);
final ImageView stripe4 = (ImageView) findViewById(R.id.stripe4);
final ImageView stripe5 = (ImageView) findViewById(R.id.stripe5);
final ImageView stripe6 = (ImageView) findViewById(R.id.stripe6);
final ImageView stripe7 = (ImageView) findViewById(R.id.stripe7);
final ImageView stripe8 = (ImageView) findViewById(R.id.stripe8);
final Button btO = (Button) findViewById(R.id.bt_stripes);
// Rotation der einzelen Bilder (Photoshopbedingt)
stripe3.setRotation(90);
stripe5.setRotation(180);
stripe7.setRotation(270);
stripe2.setRotation(45);
stripe4.setRotation(135);
stripe6.setRotation(225);
stripe8.setRotation(315);
//Der folgende Part wird benötigt damit der Button vorgerendert wird und ich die Koordinaten abrufen kann.
//Die Koordinaten werden dann dazu verwendet um von dort aus die Stripes in einem Kreis anzuordnen. Sonst immer x: 0 y: 0
ViewTreeObserver vto = btO.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int[] loc = new int[2];
btO.getLocationOnScreen(loc);
btOX = loc[0]+btO.getWidth()/2;
btOY = loc[1]+btO.getHeight()/2;
//Das mag etwas verwirrend aussehen, ist aber nur die Platzierung der einzelnen, bereits gedrehten Stripes in einem Kreis um das
//Objekt/ dem Button
stripe1.setX(loc[0] + ( btO.getWidth() /2 ) - stripe1.getWidth() /2 );
stripe1.setY(loc[1] - stripe1.getHeight());
stripe2.setX(loc[0] + (btO.getWidth() /2 ) - (stripe1.getWidth() /2 ) + (stripe1.getWidth() /2 ) + (stripe1.getWidth() /3 ));
stripe2.setY(loc[1] - stripe1.getHeight() + (stripe1.getWidth() /3 ));
stripe3.setX(loc[0] + (btO.getWidth() /2 ) - (stripe3.getWidth() /2 ) + stripe3.getHeight() /2 );
stripe3.setY(loc[1] - (stripe3.getHeight() /2 ));
stripe4.setX(loc[0] + (btO.getWidth() /2 ) - (stripe1.getWidth() /2 ) + (stripe1.getWidth() /2 ) + (stripe1.getWidth() /3 ));
stripe4.setY(loc[1] - (stripe1.getWidth() /3 ));
stripe5.setX(loc[0] + (btO.getWidth() /2 ) - stripe1.getWidth() /2 );
stripe5.setY(loc[1]);
stripe6.setX(loc[0] + (btO.getWidth() /2 ) - (stripe1.getWidth() /2 ) - (stripe1.getWidth() /2 ) - (stripe1.getWidth() /3 ));
stripe6.setY(loc[1] - (stripe1.getWidth() /3 ));
stripe7.setX(loc[0] + (btO.getWidth() /2 ) - (stripe1.getWidth() /2 ) - stripe1.getHeight() /2 );
stripe7.setY(loc[1] - stripe1.getHeight() /2 );
stripe8.setX(loc[0] + (btO.getWidth() /2 ) - (stripe1.getWidth() /2 ) - (stripe1.getWidth() /2 ) - (stripe1.getWidth() /3 ));
stripe8.setY(loc[1] - stripe1.getHeight() + (stripe1.getWidth() /3 ));
}
});
//Hier kommt jetzt der OnTouchListener
btO.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final float dx;
int i=0;
final float dy;
float distance = 0;
stripe1.setClickable(true);
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Stripes werden angezeigt
stripe1.animate().alpha(1).setDuration(200);
stripe2.animate().alpha(1).setDuration(200);
stripe3.animate().alpha(1).setDuration(200);
stripe4.animate().alpha(1).setDuration(200);
stripe5.animate().alpha(1).setDuration(200);
stripe6.animate().alpha(1).setDuration(200);
stripe7.animate().alpha(1).setDuration(200);
stripe8.animate().alpha(1).setDuration(200);
break;
case MotionEvent.ACTION_UP:
//Das hier ist sehr wichtig für mich gewesen, hab es aber schon hinbekommen,
//letztendlich wird hier die Entfernung bemessen beim Action_UP zum Zentrum.
//Ein Stripe ist bei mir in drei Segmente unterteilt. Ich musste bestimmen auf welchem Segment losgelassen wurde.
//Das hab ich "hardcodiert" mit der Entfernung zum Zentrum des Buttons bewerkstelligt. Aber erst mal nicht relevant
dx = event.getRawX();
dy = event.getRawY();
distance = (float) Math.sqrt((Math.pow(Math.abs(dx-btOX),2))+(Math.pow(Math.abs(dy-btOY),2)));
if(distance<=50) {
i = 0;
}
else if(distance>50 && distance<=195) {
i = 1;
}
else if(distance>195 && distance<=360) {
i = 2;
}
else if(distance>360 && distance<535){
i = 3;
}
else if(distance>535) {
i = 4;}
switch (i){
case 0:
Toast.makeText(test_stripe.this, "Mitte", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(test_stripe.this, "1. Quadrant", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(test_stripe.this, "2. Quadrant", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(test_stripe.this, "3. Quadrant", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(test_stripe.this, "Außerhalb", Toast.LENGTH_SHORT).show();
break;
}
stripe1.animate().alpha(0).setDuration(200);
stripe2.animate().alpha(0).setDuration(200);
stripe3.animate().alpha(0).setDuration(200);
stripe4.animate().alpha(0).setDuration(200);
stripe5.animate().alpha(0).setDuration(200);
stripe6.animate().alpha(0).setDuration(200);
stripe7.animate().alpha(0).setDuration(200);
stripe8.animate().alpha(0).setDuration(200);
break;
}
return false;
}
});
}
}
— geändert am 20.06.2016, 15:18:15
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.