android imageview默认缩放级别

标签 android imageview zooming

我在框架布局中有一个简单的 ImageView 。我想做的是为 imageview 设置一个默认缩放级别(我觉得这对用户来说很方便)。它的功能应该就像 google mapview 中的 mapController.setZoom() 一样。以下是我的 main.xml。在此先感谢您的帮助。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" >
   <ImageView android:id="@+id/imageView"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:src="@drawable/csf6a4_flipped"
         android:scaleType="matrix" >
   </ImageView>
</FrameLayout>

以下是我唯一的 Activity :

package org.example.touch;


/***
 * Excerpted from "Hello, Android! 3e",
 * published by The Pragmatic Bookshelf.
 * Copyrights apply to this code. It may not be used to create training material, 
 * courses, books, articles, and the like. Contact us if you are in doubt.
 * We make no guarantees that this code is fit for any purpose. 
 * Visit http://www.pragmaticprogrammer.com/titles/eband3 for more book information.
***/


    import android.app.Activity;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.os.Bundle;
    import android.util.FloatMath;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;

    public class Touch extends Activity implements OnTouchListener {
       private static final String TAG = "Touch";
       // These matrices will be used to move and zoom image
       Matrix matrix = new Matrix();
       Matrix savedMatrix = new Matrix();

       // We can be in one of these 3 states
       static final int NONE = 0;
       static final int DRAG = 1;
       static final int ZOOM = 2;
       int mode = NONE;

       // Remember some things for zooming
       PointF start = new PointF();
       PointF mid = new PointF();
       float oldDist = 1f;

       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          ImageView view = (ImageView) findViewById(R.id.imageView);
          view.setOnTouchListener(this);
       }

       @Override
       public boolean onTouch(View v, MotionEvent event) {
          ImageView view = (ImageView) v;

          // Dump touch event to log
          dumpEvent(event);

          // Handle touch events here...
          switch (event.getAction() & MotionEvent.ACTION_MASK) {
          case MotionEvent.ACTION_DOWN:
             savedMatrix.set(matrix);
             start.set(event.getX(), event.getY());
             Log.d(TAG, "mode=DRAG");
             mode = DRAG;
             break;
          case MotionEvent.ACTION_POINTER_DOWN:
             oldDist = spacing(event);
             Log.d(TAG, "oldDist=" + oldDist);
             if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
                Log.d(TAG, "mode=ZOOM");
             }
             break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_POINTER_UP:
             mode = NONE;
             Log.d(TAG, "mode=NONE");
             break;
          case MotionEvent.ACTION_MOVE:
             if (mode == DRAG) {
                // ...
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x,
                      event.getY() - start.y);
             }
             else if (mode == ZOOM) {
                float newDist = spacing(event);
                Log.d(TAG, "newDist=" + newDist);
                if (newDist > 10f) {
                   matrix.set(savedMatrix);
                   float scale = newDist / oldDist;
                   matrix.postScale(scale, scale, mid.x, mid.y);
                }
             }
             break;
          }

          view.setImageMatrix(matrix);
          return true; // indicate event was handled
       }

       /** Show an event in the LogCat view, for debugging */
       private void dumpEvent(MotionEvent event) {
          String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
                "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
          StringBuilder sb = new StringBuilder();
          int action = event.getAction();
          int actionCode = action & MotionEvent.ACTION_MASK;
          sb.append("event ACTION_").append(names[actionCode]);
          if (actionCode == MotionEvent.ACTION_POINTER_DOWN
                || actionCode == MotionEvent.ACTION_POINTER_UP) {
             sb.append("(pid ").append(
                   action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
             sb.append(")");
          }
          sb.append("[");
          for (int i = 0; i < event.getPointerCount(); i++) {
             sb.append("#").append(i);
             sb.append("(pid ").append(event.getPointerId(i));
             sb.append(")=").append((int) event.getX(i));
             sb.append(",").append((int) event.getY(i));
             if (i + 1 < event.getPointerCount())
                sb.append(";");
          }
          sb.append("]");
          Log.d(TAG, sb.toString());
       }

       /** Determine the space between the first two fingers */
       private float spacing(MotionEvent event) {
          float x = event.getX(0) - event.getX(1);
          float y = event.getY(0) - event.getY(1);
          return FloatMath.sqrt(x * x + y * y);
       }

       /** Calculate the mid point of the first two fingers */
       private void midPoint(PointF point, MotionEvent event) {
          float x = event.getX(0) + event.getX(1);
          float y = event.getY(0) + event.getY(1);
          point.set(x / 2, y / 2);
       }
    }

最佳答案

我遇到了同样的问题。

要将默认缩放设置为零,只需将图像放在文件夹“drawable-nodpi”中。 然后用你的矩阵缩放

编辑

  public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);
        ImageView view = (ImageView) findViewById(R.id.imageView);                 
        view.setOnTouchListener(this); 
        matrix.postScale(0.5, 0.5, 50, 50);
        view.setImageMatrix(matrix);
        }

这将执行 0.5 的缩放,以像素 (50,50) 为中心

关于android imageview默认缩放级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6328909/

相关文章:

java - 如何将两个或多个数字分开并分别相加

iphone - UIWebView 在加载外部网站时以编程方式设置初始缩放比例?

java - 点击时使用 ImageView 填充屏幕

android - PhotoView - 保持缩放和 xy 坐标

ios - 首次缩放时捏合放大不起作用 - ios

java - 如何将数据从Adapter内的onBindViewHolder传递到Tab

Android - 简单权限 - 为什么我不需要这个权限?

Android 位置有时太旧

android - 在 ListView 中显示图片 - Android

android - imageview 的 marginRight 属性不起作用