Android Pinch Zoom
-
28-10-2019 - |
Frage
Mein Layout enthält Schaltflächen, Textansichten usw. Ist es möglich, in meinem Layout einen Pinch -Zoom zu implementieren?
Lösung
** Antworte veraltet **
Schauen Sie sich die folgenden Links an, die Ihnen helfen können
Die besten Beispiele finden Sie in den folgenden Links, die Sie neu umgeben können, um Ihre Anforderungen zu erfüllen.
Andere Tipps
Für Android 2.2+ (API -Stufe8) können Sie skaliertesTector verwenden.
Sie brauchen ein Mitglied:
private ScaleGestureDetector mScaleDetector;
In Ihrem Konstruktor (oder OnCreate ()) fügen Sie hinzu:
mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() {
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor());
return false;
}
});
Sie überschreiben onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
return true;
}
Wenn Sie Ihre Ansicht von Hand zeichnen, speichern Sie in einem Mitglied wahrscheinlich den Skalierungsfaktor in einem Mitglied. Rufen Sie dann ungültig () an und verwenden Sie den Skalierungsfaktor beim Zeichnen Ihres ONDRAW (). Andernfalls können Sie die Schriftgrößen oder solche Dinge im OnScale () direkt ändern.
Ich habe einen Prise Zoom für meine implementiert TextView
, verwenden Dies Lernprogramm. Der resultierende Code ist Folgendes:
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
und in Oncreate ():
// Zoom handlers
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
// We can be in one of these 2 states
static final int NONE = 0;
static final int ZOOM = 1;
int mode = NONE;
static final int MIN_FONT_SIZE = 10;
static final int MAX_FONT_SIZE = 50;
float oldDist = 1f;
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView textView = (TextView) findViewById(R.id.text);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
float newDist = spacing(event);
// If you want to tweak font scaling, this is the place to go.
if (newDist > 10f) {
float scale = newDist / oldDist;
if (scale > 1) {
scale = 1.1f;
} else if (scale < 1) {
scale = 0.95f;
}
float currentSize = textView.getTextSize() * scale;
if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE)
||(currentSize >= MAX_FONT_SIZE && scale < 1)
|| (currentSize <= MIN_FONT_SIZE && scale > 1)) {
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize);
}
}
}
break;
}
return false;
}
Magische Konstanten 1.1 und 0,95 wurden empirisch ausgewählt (mit Verwendung scale
Variable für diesen Zweck machte meine TextView
sich irgendwie komisch benehmen).
Es gibt auch dieses Projekt, das den Job erledigt und perfekt für mich funktioniert hat:https://github.com/chrisbanes/photoview
In der API -Stufe 11 in Honeycomb können wir SetScalax und SetScaley mit Pivot Point verwenden
Ich habe es hier erklärt
Eine Aussicht vollständig vergrößern
Prise Zoom, um vollständig anzusehen
Ich habe ein Projekt für Basic-Pinch-Zoom erstellt, das Android 2.1+ unterstützt
Verfügbar hier
Ich habe eine Open -Source -Bibliothek, die dies sehr gut macht. Es handelt sich um eine vier Gestenbibliothek, die mit einer außergewöhnlichen Pan-Zoom-Einstellung ausgestattet ist. Sie können es hier finden: https://bitbucket.org/warwick/hacergestov3Oder Sie können die Demo -App hier herunterladen: https://play.google.com/store/apps/details?id=com.warwickwestonwright.hacergestov3demoDies ist eine reine Leinwandbibliothek, sodass sie in hübschem Szenario verwendet werden kann. Hoffe das hilft.