2016-11-11 2 views
0

Ich versuche, zwei Bilder in einer Aktivität von 3 Variablen (gyroXaxis, gyroYaxis, gyroZaxis), die Aktualisierung jede Millisekunde Basis zu bewegen (so wird das Bild ständig bewegen). Die Bilder müssen innerhalb der Grenzen des Bildschirms bleiben, so dass auch die Implementierung einer Matrix erforderlich ist.Android Bild verschieben Innerhalb Bildschirm Grenzen

Ich habe versucht, die ImageView Drag Limitation In Android Frage, aber mein Setup ist ein bisschen anders.

Globale Variablen

ImageView imageView1; 
ImageView imageView2; 

// gyro float variables get updated every millisecond in a different function 
float gyroXaxis; 
float gyroYaxis; 
float gyroZaxis; 

private Matrix matrix = new Matrix(); 
private Matrix savedMatrix = new Matrix(); 

PointF DownPT = new PointF(); 
PointF StartPT = new PointF(); 

OnCreate

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_version); 
    // Create images 
    imageView1 = (ImageView) findViewById(R.id.image1); 
    Drawable drawableImage1 = getDrawable(R.drawable.image1); 
    imageView1.setImageDrawable(drawableChromoX); 

    imageView2 = (ImageView) findViewById(R.id.image2); 
    Drawable drawableImage2 = getDrawable(R.drawable.image2); 
    imageView2.setImageDrawable(drawableChromoY); 

    View.OnTouchListener listener = new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (v.getTag() != null && v.getTag().equals("image1")) { 
       int eid = event.getAction(); 
       switch (eid) { 
        case MotionEvent.ACTION_MOVE: 
         PointF mv = new PointF(event.getX() - DownPT.x, event.getY() - DownPT.y); 
         imageView1.setX((int) (StartPT.x + mv.x)); 
         imageView1.setY((int) (StartPT.y + mv.y)); 
         StartPT = new PointF(imageView1.getX(), imageView1.getY()); 
         break; 
        case MotionEvent.ACTION_DOWN: 
         DownPT.x = event.getX(); 
         DownPT.y = event.getY(); 
         StartPT = new PointF(imageView1.getX(), imageView1.getY()); 
         break; 
        case MotionEvent.ACTION_UP: 
         break; 

        default: 
         break; 
       } 
      } 
      else if (v.getTag() != null && v.getTag().equals("image2")) { 
       int eid = event.getAction(); 
       switch (eid) 
       { 
        case MotionEvent.ACTION_MOVE : 
         PointF mv = new PointF(event.getX() - DownPT.x, event.getY() - DownPT.y); 
         imageView2.setX((int)(StartPT.x+mv.x)); 
         imageView2.setY((int)(StartPT.y+mv.y)); 
         StartPT = new PointF(imageView2.getX(), imageView2.getY()); 
         break; 
        case MotionEvent.ACTION_DOWN : 
         DownPT.x = event.getX(); 
         DownPT.y = event.getY(); 
         StartPT = new PointF(imageView2.getX(), imageView2.getY()); 
         break; 
        case MotionEvent.ACTION_UP : 
         break; 
        default : 
         break; 
       } 
      } 
      return true; 

     } 
    }; 

    imageView1.setOnTouchListener(listener); 
    imageView2.setOnTouchListener(listener); 
} 
+0

ich wieder Empfehlen Sie hierfür eine Leinwand. –

+0

@ Sub6Resources sind es Beispiele? – Pie

+0

gibt es mehrere Tutorials, vor allem für Spiele, gibt, die helfen sollen Sie mit Surface vertraut zu machen, die im Wesentlichen eine Leinwand-Ansicht ist. Hier ist eine: https://www.simplifiedcoding.net/android-game-development-tutorial-surface-view/ –

Antwort

0

Ihr Beispielcode Angenommen, Sie können etwas tun, um den Imageview innerhalb bestimmter Grenzen zu halten:

final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
// Display Rect Boundaries 
final Rect parentRect = new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); 

// original down point 
final PointF offsetPoint = new PointF(); 

imageView1.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(final View view, final MotionEvent motionEvent) { 
     final int action = motionEvent.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       offsetPoint.x = motionEvent.getX(); 
       offsetPoint.y = motionEvent.getY(); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       float x = motionEvent.getX(); 
       float y = motionEvent.getY(); 

       imageView1.offsetLeftAndRight((int) (x - offsetPoint.x)); 
       imageView1.offsetTopAndBottom((int) (y - offsetPoint.y)); 

       // check boundaries 
       if (imageView1.getRight() > parentRect.right) { 
        imageView1.offsetLeftAndRight(-(imageView1.getRight() - parentRect.right)); 
       } else if (imageView1.getLeft() < parentRect.left) { 
        imageView1.offsetLeftAndRight((parentRect.left - imageView1.getLeft())); 
       } 

       if (imageView1.getBottom() > parentRect.bottom) { 
        imageView1.offsetTopAndBottom(-(imageView1.getBottom() - parentRect.bottom)); 
       } else if (imageView1.getTop() < parentRect.top) { 
        imageView1.offsetTopAndBottom((parentRect.top - imageView1.getTop())); 
       } 

       break; 
     } 
     return true; 
    } 
}); 
+0

Wie kann ich eine der Gyro-Variablen verwenden, um das Bild zu bewegen? Zum Beispiel jede Sekunde, wenn die y-Variable größer als 5 ist, das Bild um 10 dp nach unten. Stellen Sie außerdem sicher, dass das Bild nicht vom Bildschirm verschoben wird. – Pie

+0

Ich habe diesen Code versucht, und es funktioniert wirklich gut für den linken, oberen und rechten Rand. Aber aus irgendeinem Grund kann ich an der unteren Kante meine Sicht so verschieben, dass die Hälfte davon über die untere Kante hinausgeht. Warum passiert das? – se22as

Verwandte Themen