Sie können dies ohne viel Komplikation tun, indem Sie kombinieren:
- A
View.OnTouchListener
(um die Schleppsequenz zu erkennen, im Grunde ACTION_DOWN
, ACTION_MOVE
, ..., ACTION_UP
).
- Jake Wharton ausgezeichnete NineOldAndroids library Bibliothek Ansicht Eigenschaft Animationen vor API-Ebene 11.
Zunächst erhalten die ImageView
Objekt und fügen Sie die View.OnTouchListener
auf, sie zu unterstützen.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
...
mImage = findViewById(...);
mImage.setOnTouchListener(mTouchListener);
}
Zweitens Programm der OnTouchListener
das ACTION_DOWN
Ereignis erfassen und speichern die anfängliche Berührungsposition X-Koordinate. Dann für jede ACTION_MOVE
berechnen Sie das Delta (für die Übersetzung und Skalierung) und für ACTION_UP
die ImageView in den Ausgangszustand zurück.
private View.OnTouchListener mTouchListener = new View.OnTouchListener()
{
private float mStartX;
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN :
mStartX = event.getRawX();
return true;
case MotionEvent.ACTION_MOVE :
float currentX = event.getRawX();
animateTo(currentX - mStartX, true); // Snap to drag
return true;
case MotionEvent.ACTION_UP :
case MotionEvent.ACTION_CANCEL :
animateTo(0, false); // Ease back
return true;
}
return false;
}
};
Die animateTo()
würde wie folgt umgesetzt werden. Das immediate
-Flag gibt an, ob die Übersetzung und die Skalierung, nun, unmittelbar (es ist wahr, wenn auf jedes Bewegungsereignis reagiert, und falsch, wenn es zurück in seine ursprüngliche Position und seine Skalierung erleichtert).
private void animateTo(float displacement, boolean immediate)
{
final int EASE_BACK_DURATION = 300; // ms
int duration = (immediate ? 0 : EASE_BACK_DURATION);
Display display = getWindowManager().getDefaultDisplay();
int totalWidth = display.getWidth();
float scale = 1.0f - Math.abs(displacement/totalWidth);
ViewPropertyAnimator.animate(mImage)
.translationX(displacement)
.scaleX(scale)
.scaleY(scale)
.setDuration(duration)
.start();
}
Sie können mit der Skalierung basteln wollen. Wie geschrieben, bedeutet dies, dass das Bild 50% seiner ursprünglichen Größe hat, wenn es bis zum Rand des Bildschirms gezogen wird.
Diese Lösung sollte ohne Probleme in API Level 8 funktionieren (obwohl ich es nicht getestet habe). Voller Geist ist available here, wenn Sie es wollen.
funktioniert wie Charme :) danke – Orr