ImageView an andere ImageView "ankern"

  • 3 Antworten
  • Letztes Antwortdatum
L

Lainio

Ambitioniertes Mitglied
3
Hallo liebe Community,

ich bin gerade an einer Sache die mir langsam Kopfschmerzen bereitet.
Ich habe eine ImageView mit der ID zoom die den gesamten Bildschirm füllt.
Darüber eine kleine ImageView 55x55 mit der ID move.
Die ID's sagen eigentlich auch schon die Funktion der ImageView's aus.

Die ImageView move soll über den Bildschirm bewegt werden was ich auch erfolgreich geschafft habe:

Code:
final int X = (int) event.getRawX();
                final int Y = (int) event.getRawY();
                //Definition MotionEvent.ACTION_MASK: Bit mask of the parts of the action code that are the action itself.
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
                        int i = lParams.leftMargin;
                        _xDelta = X - lParams.leftMargin;
                        _yDelta = Y - lParams.topMargin;
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                    case MotionEvent.ACTION_POINTER_DOWN:
                        break;
                    case MotionEvent.ACTION_POINTER_UP:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v
                                .getLayoutParams();

                        layoutParams.leftMargin = X - _xDelta;
                        layoutParams.topMargin = Y - _yDelta;
                        layoutParams.rightMargin = -250;
                        layoutParams.bottomMargin = -250;
                        v.setLayoutParams(layoutParams);
                        break;

                }
                viewGroup.invalidate();
                return true;

Für zoom habe ich ein fertiges Projekt PhotoViewAttacher das es mir ermöglicht zoom, doppeltipp-zoom und das bewegen des Bildes.

Woran ich gerade scheitere ist, die ImageView move an das große Bild im Hintergrund zu verankern. Sprich wennn ich reinzoomen sollte und das Bild nach rechts bewege, soll die Position von move nicht verändert werden. Das Bild sollte da bleiben wo es ist und mit dem zoom auch mit zoomen.

Ist das irgendwie möglich? Wenn ja wie würde das gehen?

Ich danke im Voraus!
 
Wenn ich dich richtig verstanden habe soll das Move Imageview immer auf der gleichen Position über dem Bild sein anstatt auf der gleichen Position auf dem Display?! Und das Move soll sich beim zoomen vergrößern?!
Für die "verankerung" über dem Background mal das Layout wechseln vllt zu Framelayout statt RelativeLayout.

Mmmmh die Library soweit ich das sehen kann ist auch nur auf ein einzelnes Drawable ausgelegt und nciht auf eine Gruppe von Drawables.
 
  • Danke
Reaktionen: Lainio
Erstmal danke für deine Antwort und die Mühe mir zu helfen!

Das ist nicht ganz richtig. Wenn ich die View reinzoome, soll das Backgroundbild als auch das move reingezoomt werden. Move soll dabei bis zu einem bestimmten punkt gezoomt werden.

Das move soll immer auf der gleichen Position über dem Bild sein. Also nicht relativ zum Bildschirm sondern zum Bild. Wäre ich da mit dem FrameLayout besser beraten?
Wo liegt der große Unterschied vom FrameLayout zum RelativeLayout?

Ja du hast richtig gesehen. Es ist nur auf ein Drawable ausgelegt.
 
Ganz knapp gesagt lässt dich ein RelativeLayout objekte in Bezug zueinander platzieren auf einer Ebene ohne sich zu überlappen.
Du kannst jeder View sagen wie sie platziert werden soll relativ zu einer anderen View. Zum Beispiel move view soll rechts neben deiner zoom view platziert werden oder eben umgekehrt zoomview soll links von move view sein.
Natürlich kann man wie bei jeden Layout mit den LAyoutparams die Positionen der Views verändern und auch Überlappungen zulassen.
Framelayout bietet dir weniger Möglichkeiten und ist wie das veraltete AbsoluteLayout dazu gedacht Sachen einfach auf dem Bildschirm zu platzieren (mit Z-Order) ohne die Eigenschaften die eine RelativeLayout Viewgroup zum Beispiel bietet.

Das Zooming passiert nur innerhalb des Drawables. Eine Möglichkeit wäre es das move in die entsprechende Richtung zu verschieben beim Zoomen so dass es auch ausserhalb des Bildschirm gehen kann. Dazu musst du die Informationen aus der Zoom einfach verarbeiten und auf das move anwenden. So wie du es schon geschafft hast auf die Eingabe des User zu reagieren beim Bewegen der Move.
 
  • Danke
Reaktionen: Lainio
Zurück
Oben Unten