`

图片移动和缩放

 
阅读更多

import android.graphics.Matrix;
import android.graphics.PointF;
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 MulitPointTouchListener implements OnTouchListener {
        Matrix matrix = new Matrix();
        Matrix savedMatrix = new Matrix();

        //初始状态值
        private final int NONE = 0;
        private final int DRAG = 1;
        private final int ZOOM = 2;
        private int mode = NONE;

        // Remember some things for zooming
        PointF start = new PointF();
        PointF mid = new PointF();//放大或缩小中间点
        float oldDist = 1f;

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

            analyseEvent(event);//Log分析事件类型,屏幕每个点的坐标

            //处理事件
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    matrix.set(view.getImageMatrix());
                    savedMatrix.set(matrix);
                    start.set(event.getX(), event.getY());
                    mode = DRAG;
                    //Log.d("CDH", "mode=DRAG");
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    oldDist = spacing(event);
                    //Log.d("CDH", "oldDist=" + oldDist);
                    if (oldDist > 10f) {
                        savedMatrix.set(matrix);
                        midPoint(mid, event);
                        mode = ZOOM;
                        //Log.d("CDH", "mode=ZOOM");
                    }
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    //Log.e(""CDH"", "W:"+view.getWidth()+"  H:"+view.getHeight());

                    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("CDH", "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;
        }

        private void analyseEvent(MotionEvent event) {
            String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
                            "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
            int action = event.getAction();
            int actionCode = action & MotionEvent.ACTION_MASK;
            StringBuilder sb = new StringBuilder();
            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("CDH", sb.toString());
        }

        //两点间的距离
        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);
        }

        //从两点中间放大或缩小
        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);
        }
}

 

创建好上面的OnTouchListener实现类后,设置到ImageView上

ImageView mImageView = (ImageView)findViewById(R.id.image_view);
mImageView.setOnTouchListener(new MulitPointTouchListener());

 

设置属性android:scaleType="matrix"

<ImageView android:id="@+id/image_view"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:scaleType="matrix"
	android:src="@drawable/landscape" />
 

 

 

 

 

分享到:
评论

相关推荐

    《结合UImageView实现图片移动和缩放》Demo

    本Demo "《结合UImageView实现图片移动和缩放》" 就是针对这一需求的一个实例,它演示了如何创建一个名为MoveScaleImageView的自定义视图,允许用户在屏幕上自由移动和缩放图片。 首先,我们要了解...

    利用鼠标实现图片移动和缩放

    本文将详细讲解如何利用鼠标来实现图片的移动和缩放,这两个功能在日常工作中极为常见。 首先,我们要理解的是“图片拖动”。在大多数图形应用程序中,用户可以通过按下鼠标左键并移动鼠标来移动图片。这个过程涉及...

    API 控制图片移动、缩放、加载图标

    在这个场景中,API用于控制图片的行为,如移动、缩放和加载图标。 1. **图片移动**:在用户界面上,图片移动通常涉及到图形上下文(Graphics Context)的操作。开发者可以使用API提供的方法来改变图片的位置,这在...

    图片缩放_移动

    在C#编程环境中,图片处理是一项常见的任务,其中包括图片的缩放和移动。这两个功能在各种应用程序中都极为重要,比如图像编辑软件、图形用户界面(GUI)开发、网页设计等。本文将深入探讨如何使用C#实现这些功能。 ...

    VS+QT实现图片缩放移动

    2. **事件处理**:为了实现图片的缩放和移动,我们需要捕获和处理鼠标事件,如鼠标按下、移动和释放。这些事件可以让我们跟踪用户的操作,进而计算出缩放比例和移动的距离。 3. **QGraphicsView与QGraphicsScene**...

    Android图片裁剪----移动、缩放图片进行裁剪

    通过查看和学习这个项目的代码,开发者可以更好地理解如何在Android中实现图片的移动、缩放和裁剪功能。 总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建...

    C# 自定义picturebox控件实现图片移动和滚轮缩放

    在这个场景中,我们关注的是自定义`PictureBox`控件,目的是实现图片的移动和滚轮缩放功能。`PictureBox`是.NET Framework中的一个基本控件,通常用于显示图像。然而,其默认功能并不包括图片的拖动和滚轮缩放,因此...

    C# 图片缩放和移动程序

    在C#编程环境中,开发一个图片缩放和移动程序是一项常见的任务,特别是在图形用户界面(GUI)应用中。本程序是在.NET Framework 3.5环境下构建的,这意味着它利用了该框架提供的丰富的类库和功能。尽管如此,由于C#...

    js 高清查看图片 图片缩放 图片移动

    高清查看图片 图片缩放 图片移动 可实现在一定范围内图片移动缩放

    易语言图片快速缩放移动

    在这个“易语言图片快速缩放移动”项目中,我们将深入探讨如何使用易语言来实现图片的快速缩放和移动功能,以及设置矩形和移动窗口的技术细节。 首先,图片的快速缩放是图像处理中的基本操作,通常涉及到图像的像素...

    flex 图片缩放移动组件

    在这个案例中,我们将创建一个自定义组件来实现图片的缩放和移动功能。 1. **组件创建**: - 在Flex中,我们可以继承UIComponent或Canvas类来创建自定义组件。UIComponent是所有Flex组件的基础,提供了绘制和布局...

    移动端H5图片轮播缩放

    在移动端H5开发中,图片轮播和缩放功能是非常常见且重要的元素,尤其是在展示产品、分享信息或者创建互动体验时。本资源基于Sencha Touch框架,为移动设备提供了高效且用户友好的图片轮播与缩放解决方案。下面将详细...

    Winform图片拖拽移动缩放

    在Windows Forms(Winform)开发中,经常需要处理图像显示和交互功能,比如图片的拖拽、移动和缩放。本篇文章将详细讲解如何在Winform应用中实现这些功能,主要涉及PictureBox控件的使用以及相关的事件处理。 首先...

    android图片模糊处理和图片移动

    通过Renderscript实现的模糊处理可以提供高质量的效果,而自定义View结合`GestureDetector`和`ScaleGestureDetector`则能实现流畅的图片移动和缩放功能。这些技术的掌握对于Android开发者来说非常重要,它们能够提升...

    SurfaceView实现图片缩放,移动加标记

    首先,让我们详细探讨如何使用`SurfaceView`来实现图片的缩放和移动。`SurfaceView`相比于普通的`View`,具有自己的独立绘图线程,这使得它能够更高效地处理复杂的图形操作。要实现图片的缩放和移动,我们可以利用`...

    Android多点触控技术实战,对图片进行缩放和移动Demo

    本项目"PhotoWallFallsDemo"就是一个典型的实例,演示了如何在Android应用中实现实时的图片缩放和移动功能。 首先,我们要理解Android中的触控事件处理机制。Android系统通过MotionEvent类来处理触摸事件,包括...

    GDI+ 图片缩放、移动等功能实现

    除了基本的缩放和移动,GDI+还支持更复杂的图像处理,如旋转、裁剪、滤镜应用等。例如,通过设置`Matrix`对象并传递给`Graphics`对象的`SetTransform`方法,可以实现图片的旋转: ```cpp Gdiplus::Matrix rotation...

    图片手动缩放移动、单击退出、双击缩放

    在IT领域,图片的缩放和移动是图形用户界面(GUI)设计中常见的功能,尤其在图像处理软件、网页和应用程序中。标题“图片手动缩放移动、单击退出、双击缩放”所涉及的知识点主要是用户交互设计和图像处理技术。下面...

    Viewpager图片预览,支持图片缩放移动

    在这个场景下,我们不仅需要展示图片,还需要实现图片的缩放和移动功能,以增强用户体验。 首先,要实现这个功能,我们需要对ViewPager进行自定义。默认的ViewPager并不直接支持图片的缩放和移动,所以我们需要扩展...

    C# winform 图片操作控件,鼠标操作,导入图片,可缩放、旋转、移动

    在C# WinForm应用开发中,经常会遇到需要对图片进行操作的需求,比如显示、缩放、旋转和移动等。为了实现这些功能,开发者通常会利用自定义控件或已有的图像处理库。在这个项目中,我们关注的是一个专门用于图片操作...

Global site tag (gtag.js) - Google Analytics