2013-11-26 151 views
0

我有LinearLayout作为其主布局的活动。在这种布局中,有一个按钮,增加了一个视图(R.layout.motor_block)的主要布局(R.id.layout):捏缩放和平移

LayoutInflater inflater = 
    (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View iv = inflater.inflate(R.layout.motor_block, null); 
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout); 
    rl.addView(iv); 

这工作得很好,但是当我添加更多的意见,屏幕会被他们填满,所以我需要一种通过添加平底锅来“扩展”尺寸的方式,这样我就可以浏览所有的视图。 我也想添加缩放。

我试图用的WebView:

 RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout); 
    WebView wv = (WebView) findViewById(R.id.webView1); 
    wv.getSettings().setSupportZoom(true); 
    wv.getSettings().setBuiltInZoomControls(true); 
    wv.getSettings().setUseWideViewPort(true); 
    wv.getSettings().setLoadWithOverviewMode(true); 
    wv.getSettings().setDisplayZoomControls(false); 
    wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); 
    wv.addView(iv); 

的意见被添加到它,和平移工程。问题是,当我缩放时,webView会缩放背景,并且视图不会更改大小。

我也尝试了一些自定义视图,但他们不支持带子视图的视图。

完成此操作的最佳方法是什么?

回答

0

最简单的方法是在ScrollView中添加所有这些视图。然后,您可以将ScrollView添加到Horizo​​ntalScrollView以在两个方向滚动。有一个手势捏和缩放手势,并为他们调用监听器。对于缩放,您可以通过运行循环或可能使用ScaleGestureDetector来增加每个视图的大小。
这种方法有点波涛汹涌,但有效。检查下面的答案更多信息 - Implementing Pan and Zoom

更新: -

我这里还有一些更使答案 -
How to implement zoom effect for image view in android?
android pinch zoom

+0

当视图重新调整大小时,他们是否保持相同的距离? – Sochimickox

+0

如果您手动缩放它们,是的,它们会保持相同的边距,但我不确定ScaleGestureDetector。 – noob

+0

这个答案可以应用于平移和缩放gridview吗? –

1

只是一个例子。在主容器视图中使用setTranslationX/Y和setScaleX/Y。它的孩子将会随着它进行缩放和翻译。

public class MainActivity extends Activity { 

    private RelativeLayout mainLayout; 
    private ScaleGestureDetector scaleGestureDetector; 
    private float scale = 1; 
    private PointF touchPoint; 
    private PointF pan; 

    private boolean isScaling; 
    private boolean endScalingNextUp; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mainLayout = (RelativeLayout) findViewById(id.main_layout); 
     scaleGestureDetector = new ScaleGestureDetector(this, new ExampleScaleGestureListener()); 
     Button b = ((Button) findViewById(id.btn_reset)); 
     b.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       reset(); 
      } 
     }); 
     reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     scaleGestureDetector.onTouchEvent(event); 

     if (scale != 1 && !isScaling) { 
      float x = event.getRawX(); 
      float y = event.getRawY(); 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       touchPoint = new PointF(x, y); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE && touchPoint != null) { 
       pan.x = x - touchPoint.x; 
       pan.y = y - touchPoint.y; 
       panView(); 
      } 
     } 
     if (isScaling && endScalingNextUp) { 
      if (event.getAction() == MotionEvent.ACTION_POINTER_UP) { 
       endScalingNextUp = false; 
       isScaling = false; 
      } 
     } 

     return true; 
    } 

    private void setPivot(float focusX, float focusY) { 
     mainLayout.setPivotX(focusX); 
     mainLayout.setPivotY(focusY); 
    } 

    private void scaleView() { 
     mainLayout.setScaleX(scale); 
     mainLayout.setScaleY(scale); 
    } 

    private void panView() { 
     mainLayout.setTranslationX(pan.x); 
     mainLayout.setTranslationY(pan.y); 
    } 

    private void reset() { 
     setPivot(0, 0); 
     scale = 1; 
     scaleView(); 
     pan = new PointF(0, 0); 
     panView(); 
     isScaling = false; 
    } 

    private class ExampleScaleGestureListener implements OnScaleGestureListener { 

     private static final float SCALE_SPEED = .02f; 

     @Override 
     public void onScaleEnd(ScaleGestureDetector detector) { 
      endScalingNextUp = true; 
     } 

     @Override 
     public boolean onScaleBegin(ScaleGestureDetector detector) { 
      float focusX = detector.getFocusX(); 
      float focusY = detector.getFocusY(); 
      setPivot(focusX, focusY); 
      isScaling = true; 
      endScalingNextUp = false; 
      return true; 
     } 

     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      isScaling = true; 
      endScalingNextUp = false; 
      if (detector.getScaleFactor() < 1) { 
       scale -= SCALE_SPEED; 
      } else if (detector.getScaleFactor() > 1) { 
       scale += SCALE_SPEED; 
      } 
      scaleView(); 
      return true; 
     } 
    } 
} 


    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:id="@+id/main_layout" 
     tools:context=".MainActivity" > 

     <TextView 
      android:id="@+id/tv" 
      android:layout_centerInParent="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/hello_world" /> 

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/tv" 
      android:layout_marginBottom="69dp" 
      android:layout_marginRight="29dp" 
      android:layout_toLeftOf="@+id/tv" 
      android:src="@drawable/ic_launcher" /> 

     <Button 
      android:id="@+id/btn_reset" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/tv" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="22dp" 
      android:text="Reset" /> 

    </RelativeLayout>