15

In meiner Android-Anwendung muss ich zoomfähige Aktivitäten erstellen. Ich habe nützlichen Code zum Zoomen des linearen Layouts here gefunden. Aber in meiner Anwendung beginnen einige Aktivitäten mit scrollview und dieser Code erkennt scrollview nicht. Wie kann ich Pinch-Zoom für scrollbare Aktivität machen? Dies ist einer meiner Layout.Wie macht man zoombare Scrollview?

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/scrollViewZoom" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_centerHorizontal="true" 
android:layout_centerVertical="true" > 

<LinearLayout 
    android:id="@+id/wd_content" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" 
    android:orientation="vertical" > 

    <!-- Start Circle --> 

    <TableRow 
     android:id="@+id/row_circl1" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" 
     android:background="@color/purple_color" > 

     <RelativeLayout 
      android:id="@+id/circle_layout1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@color/white_color" > 

      <ImageView 
       android:id="@+id/img_engin_circle1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:background="@drawable/circle_engin_bg" 
       android:contentDescription="TODO" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/circle_layout2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@color/white_color" > 

      <ImageView 
       android:id="@+id/img_engin_circle2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:background="@drawable/circle_engin_bg" 
       android:contentDescription="TODO" /> 
     </RelativeLayout> 
    </TableRow> 

    <TableRow 
     android:id="@+id/row_name_circle" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" > 

     <RelativeLayout 
      android:id="@+id/circle_name_layout1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="-15dp" 
      android:background="@color/white_color" > 

      <ImageView 
       android:id="@+id/img_name_circle1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:background="@drawable/circle_gauge_name" 
       android:contentDescription="TODO" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/circle_name_layout2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="-15dp" 
      android:background="@color/white_color" > 

      <ImageView 
       android:id="@+id/img_name_circle2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:background="@drawable/circle_gauge_name" 
       android:contentDescription="TODO" /> 
     </RelativeLayout> 
    </TableRow> 

    <!-- End Circle --> 

</LinearLayout> 

</ScrollView> 

Jede Idee würde mir helfen. Danke.

+0

Bitte überprüfen Sie diesen Link: [ermöglicht Zoom-on-Scroll-view] [1] viel Glück. [1]: http://stackoverflow.com/questions/18572014/enabling-zoom-on-scroll-view –

+0

Danke für Ihre Antwort @ Adir.el aber ich eine andere Lösung gefunden. – IndieBoy

Antwort

22

Ok. Nachdem ich das Netz gepflügt hatte, fand ich endlich meine Antwort. Ich fand onTouchEvent() für scrollview funktioniert nicht, so muss ich dispatchTouchEvent() statt onTouchEvent() verwenden. Oben sehen Sie meinen XML-Code (in meiner Frage) und hier ist natürlich mein Aktivitätscode mit Kommentaren.

// step 1: add some instance 
private float mScale = 1f; 
private ScaleGestureDetector mScaleDetector; 
GestureDetector gestureDetector; 

//step 2: create instance from GestureDetector(this step sholude be place into onCreate()) 
gestureDetector = new GestureDetector(this, new GestureListener()); 

// animation for scalling 
mScaleDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() 
    {         
     @Override 
     public boolean onScale(ScaleGestureDetector detector) 
     { 
      float scale = 1 - detector.getScaleFactor(); 

      float prevScale = mScale; 
      mScale += scale; 

      if (mScale < 0.1f) // Minimum scale condition: 
       mScale = 0.1f; 

      if (mScale > 10f) // Maximum scale condition: 
       mScale = 10f; 
      ScaleAnimation scaleAnimation = new ScaleAnimation(1f/prevScale, 1f/mScale, 1f/prevScale, 1f/mScale, detector.getFocusX(), detector.getFocusY()); 
      scaleAnimation.setDuration(0); 
      scaleAnimation.setFillAfter(true); 
      ScrollView layout =(ScrollView) findViewById(R.id.scrollViewZoom); 
      layout.startAnimation(scaleAnimation); 
      return true; 
     } 
    }); 


// step 3: override dispatchTouchEvent() 
@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    super.dispatchTouchEvent(event); 
    mScaleDetector.onTouchEvent(event); 
    gestureDetector.onTouchEvent(event); 
    return gestureDetector.onTouchEvent(event); 
} 

//step 4: add private class GestureListener 

private class GestureListener extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 
    // event when double tap occurs 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     // double tap fired. 
     return true; 
    } 
} 

Vielen Dank.

+5

Ein anderes Leben gerettet! Ein weiteres Bier garantiert hier in Brazi! –

+2

Es zeigt nur die Pinch-Zoom, nicht scrollen, wenn ich implementiert. –

+0

Können Sie mir bitte erklären, wo ich das verwenden muss? Ich erstelle eine benutzerdefinierte Klasse, die Scrollview erweitert und obigen Code in diese Klasse einfügt. aber es gibt init Ausnahme –

1

Vielen Dank für Ihre Lösung, ich setzte es ein bisschen anders, weil mein Scrollview innerhalb eines Fragments ist und nicht eine Aktivität, die gesamte Logik der Ansicht delegieren ich dispatchTouchEvent in der gleichen benutzerdefinierten Scroll Ansicht hinzufügen würde empfehlen:

package com.your.package; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.ScaleGestureDetector; 
import android.view.animation.ScaleAnimation; 
import android.widget.ScrollView; 

import com.your.package.R; 

public class CustomZoomScrollView extends ScrollView { 


    // step 1: add some instance 
    private float mScale = 1f; 
    private ScaleGestureDetector mScaleDetector; 
    GestureDetector gestureDetector; 


    public CustomZoomScrollView(Context context) { 
     super(context); 
    } 

    public CustomZoomScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     //step 2: create instance from GestureDetector(this step should be place into onCreate()) 
     gestureDetector = new GestureDetector(getContext(), new GestureListener()); 

     mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.SimpleOnScaleGestureListener() 
     { 
      @Override 
      public boolean onScale(ScaleGestureDetector detector) 
      { 
       float scale = 1 - detector.getScaleFactor(); 

       float prevScale = mScale; 
       mScale += scale; 

       if (mScale < 0.1f) // Minimum scale condition: 
        mScale = 0.1f; 

       if (mScale > 10f) // Maximum scale condition: 
        mScale = 10f; 
       ScaleAnimation scaleAnimation = new ScaleAnimation(1f/prevScale, 1f/mScale, 1f/prevScale, 1f/mScale, detector.getFocusX(), detector.getFocusY()); 
       scaleAnimation.setDuration(0); 
       scaleAnimation.setFillAfter(true); 
       getRootView().findViewById(R.id.svSeats).startAnimation(scaleAnimation); 
       return true; 
      } 
     }); 
    } 

    // step 3: override dispatchTouchEvent() 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     super.dispatchTouchEvent(event); 
     mScaleDetector.onTouchEvent(event); 
     gestureDetector.onTouchEvent(event); 
     return gestureDetector.onTouchEvent(event); 
    } 

//step 4: add private class GestureListener 

    private class GestureListener extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 
     // event when double tap occurs 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      // double tap fired. 
      return true; 
     } 
    } 
}