与缩放和滚动开放的ImageView [英] Open ImageView with Zoom and Scroll

查看:151
本文介绍了与缩放和滚动开放的ImageView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想打开一个图片,在ImageView的,从一个按钮preSS。我需要的图像是可缩放和滚动。我如何能最好地去实现这一点? 谢谢!

图片可以是PNG或JPG

太感谢你了!

下面是我的新code,你不会介意通过略读,给我一个解决方案,我的所有问题的标签 ZOOM 的等。我也知道我需要我的形象的 RES 的添加到它

 包com.DS;

进口的java.io.File;

进口android.app.Activity;
进口android.content.Intent;
进口android.graphics.Matrix;
进口android.graphics.PointF;
进口android.net.Uri;
进口android.os.Bundle;
进口android.os.Environment;
进口android.util.FloatMath;
进口android.util.Log;
进口android.view.MotionEvent;
进口android.view.View;
进口android.widget.Button;
进口android.widget.ImageView;

公共类CheatMathActivity延伸活动{
/ **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);

    最终按钮按钮1 =(按钮)findViewById(R.id.button1);
    button1.setOnTouchListener(新View.OnTouchListener(){
        公共无效onTouch(视图v){
   //打开代数图片
             公共布尔onTouch(视图V,MotionEvent事件){
                    // TODO自动生成方法存根
                     ImageView的观点=(ImageView的)V;
                     view.setScaleType(ImageView.ScaleType.MATRIX);
                     浮规模;

                     dumpEvent(事件);
                     //这里处理触摸事件...

                     矩阵矩阵;
                    矩阵savedMatrix;
                    的PointF启动;
                    目标模式;
                    浮动oldDist;
                    的PointF中旬;
                    开关(event.getAction()及event.ACTION_MASK)
                     {
                         案例MotionEvent.ACTION_DOWN://第一指仅下跌
                                                             savedMatrix.set(矩阵);
                                                             start.set(event.getX(),event.getY());
                                                             Log.d(TAG模式= DRAG); //写入LogCat中
                                                             模式=阻力;
                                                             打破;

                         案例MotionEvent.ACTION_UP://第一手指抬起

                         案例MotionEvent.ACTION_POINTER_UP://第二根手指抬起

                                                             模式=无;
                                                             Log.d(TAG模式= NONE);
                                                             打破;

                         案例MotionEvent.ACTION_POINTER_DOWN://第一和第二指下跌

                                                             oldDist =间距(事件);
                                                             Log.d(TAG,oldDist =+ oldDist);
                                                             如果(oldDist> 5F){
                                                                 savedMatrix.set(矩阵);
                                                                 中点(中,事件);
                                                                 模式=变焦;
                                                                 Log.d(TAG模式= ZOOM);
                                                             }
                                                             打破;

                         案例MotionEvent.ACTION_MOVE:

                                                             如果(模式==拖动)
                                                             {
                                                                 matrix.set(savedMatrix);
                                                                 matrix.postTranslate(event.getX() -  start.x,event.getY() -  start.y); //创建点的矩阵变换
                                                             }
                                                             否则,如果(模式== ZOOM)
                                                             {
                                                                 //捏缩放
                                                                 浮newDist =间距(事件);
                                                                 Log.d(TAG,newDist =+ newDist);
                                                                 如果(newDist> 5F)
                                                                 {
                                                                     matrix.set(savedMatrix);
                                                                     规模= newDist / oldDist; //设置的比例
                                                                                                 //矩阵...如果规模> 1手段
                                                                                                 //放大......如果规模< 1手段
                                                                                                 // 缩小
                                                                     matrix.postScale(规模化,规模化,mid.x,mid.y);
                                                                 }
                                                             }
                                                             打破;
                     }

                     view.setImageMatrix(矩阵); //显示在屏幕上的转变

                     返回true; //表示事件已经被处理
                }
                私人浮动间距(MotionEvent事件)
                {
                    浮X = event.getX(0) -  event.getX(1);
                    浮Y = event.getY(0) -  event.getY(1);
                    返回FloatMath.sqrt(X * X + Y * Y);
                }

                / *
                 * ------------------------------------------------- -------------------------
                 *方法:中点参数:的PointF对象,MotionEvent返回:Void
                 *说明:计算两个手指之间的中点
                 * ------------------------------------------------- -----------
                 * /

                私人无效中点(的PointF点,MotionEvent事件)
                {
                    浮X = event.getX(0)+ event.getX(1);
                    浮Y = event.getY(0)+ event.getY(1);
                    point.set(X / 2,Y / 2);
                }

                / **显​​示在LogCat中查看事件,调试* /
                私人无效dumpEvent(MotionEvent事件);
                {
                    字符串名称[] = {DOWN,UP,移动,取消,外,POINTER_DOWN,POINTER_UP,7?,8?,9? };
                    StringBuilder的SB =新的StringBuilder();
                    INT行动= event.getAction();
                    INT行动code =动作和放大器; MotionEvent.ACTION_MASK;
                    sb.append(事件响应_)追加(姓名[动作code])。

                    如果(动作code == MotionEvent.ACTION_POINTER_DOWN ||行动code == MotionEvent.ACTION_POINTER_UP)
                    {
                        sb.append((PID).append(作用>> MotionEvent.ACTION_POINTER_ID_SHIFT);
                        sb.append());
                    }

                    sb.append([);
                    的for(int i = 0; I< event.getPointerCount();我++)
                    {
                        。sb.append(#)追加(ⅰ);
                        sb.append((PID).append(event.getPointerId(ⅰ));
                        sb.append()=)追加((int)的event.getX(ⅰ))。
                        。sb.append(,)追加((int)的event.getY(ⅰ));
                        如果第(i + 1&其中; event.getPointerCount())
                            sb.append(;);
                    }

                    sb.append(]);
                    Log.d(触摸事件---------,sb.toString());

            }





    }

        @覆盖
        公共布尔onTouch(查看为arg0,MotionEvent ARG1){
            // TODO自动生成方法存根
            返回false;
        }

});
    最终按钮按钮2 =(按钮)findViewById(R.id.button2);
    button2.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(视图v){
    //打开下一个子集图片
        }
    });

}
公共布尔onTouch(视图V,MotionEvent事件){
    // TODO自动生成方法存根
     ImageView的观点=(ImageView的)V;
     view.setScaleType(ImageView.ScaleType.MATRIX);
     浮规模;

     dumpEvent(事件);
     //这里处理触摸事件...

     矩阵矩阵;
    矩阵savedMatrix;
    的PointF启动;
    目标模式;
    浮动oldDist;
    的PointF中旬;
    开关(event.getAction()及event.ACTION_MASK)
     {
         案例MotionEvent.ACTION_DOWN://第一指仅下跌
                                             savedMatrix.set(矩阵);
                                             start.set(event.getX(),event.getY());
                                             Log.d(TAG模式= DRAG); //写入LogCat中
                                             模式=阻力;
                                             打破;

         案例MotionEvent.ACTION_UP://第一手指抬起

         案例MotionEvent.ACTION_POINTER_UP://第二根手指抬起

                                             模式=无;
                                             Log.d(TAG模式= NONE);
                                             打破;

         案例MotionEvent.ACTION_POINTER_DOWN://第一和第二指下跌

                                             oldDist =间距(事件);
                                             Log.d(TAG,oldDist =+ oldDist);
                                             如果(oldDist> 5F){
                                                 savedMatrix.set(矩阵);
                                                 中点(中,事件);
                                                 模式=变焦;
                                                 Log.d(TAG模式= ZOOM);
                                             }
                                             打破;

         案例MotionEvent.ACTION_MOVE:

                                             如果(模式==拖动)
                                             {
                                                 matrix.set(savedMatrix);
                                                 matrix.postTranslate(event.getX() -  start.x,event.getY() -  start.y); //创建点的矩阵变换
                                             }
                                             否则,如果(模式== ZOOM)
                                             {
                                                 //捏缩放
                                                 浮newDist =间距(事件);
                                                 Log.d(TAG,newDist =+ newDist);
                                                 如果(newDist> 5F)
                                                 {
                                                     matrix.set(savedMatrix);
                                                     规模= newDist / oldDist; //设置的比例
                                                                                 //矩阵...如果规模> 1手段
                                                                                 //放大......如果规模< 1手段
                                                                                 // 缩小
                                                     matrix.postScale(规模化,规模化,mid.x,mid.y);
                                                 }
                                             }
                                             打破;
     }

     view.setImageMatrix(矩阵); //显示在屏幕上的转变

     返回true; //表示事件已经被处理
}
私人浮动间距(MotionEvent事件)
{
    浮X = event.getX(0) -  event.getX(1);
    浮Y = event.getY(0) -  event.getY(1);
    返回FloatMath.sqrt(X * X + Y * Y);
}

/ *
 * ------------------------------------------------- -------------------------
 *方法:中点参数:的PointF对象,MotionEvent返回:Void
 *说明:计算两个手指之间的中点
 * ------------------------------------------------- -----------
 * /

私人无效中点(的PointF点,MotionEvent事件)
{
    浮X = event.getX(0)+ event.getX(1);
    浮Y = event.getY(0)+ event.getY(1);
    point.set(X / 2,Y / 2);
}

/ **显​​示在LogCat中查看事件,调试* /
私人无效dumpEvent(MotionEvent事件)
{
    字符串名称[] = {DOWN,UP,移动,取消,外,POINTER_DOWN,POINTER_UP,7?,8?,9? };
    StringBuilder的SB =新的StringBuilder();
    INT行动= event.getAction();
    INT行动code =动作和放大器; MotionEvent.ACTION_MASK;
    sb.append(事件响应_)追加(姓名[动作code])。

    如果(动作code == MotionEvent.ACTION_POINTER_DOWN ||行动code == MotionEvent.ACTION_POINTER_UP)
    {
        sb.append((PID).append(作用>> MotionEvent.ACTION_POINTER_ID_SHIFT);
        sb.append());
    }

    sb.append([);
    的for(int i = 0; I< event.getPointerCount();我++)
    {
        。sb.append(#)追加(ⅰ);
        sb.append((PID).append(event.getPointerId(ⅰ));
        sb.append()=)追加((int)的event.getX(ⅰ))。
        。sb.append(,)追加((int)的event.getY(ⅰ));
        如果第(i + 1&其中; event.getPointerCount())
            sb.append(;);
    }

    sb.append(]);
    Log.d(触摸事件---------,sb.toString());

}
}
 

解决方案

只需添加这些低于您的活动方式。另外,你需要调用如下这种方法,你的活动必须实施 OnTouchListener

imaveViewInstance.setOnTouchListener(本);

  @覆盖
公共布尔onTouch(视图V,MotionEvent事件){
    // TODO自动生成方法存根
     ImageView的观点=(ImageView的)V;
     view.setScaleType(ImageView.ScaleType.MATRIX);
     浮规模;

     dumpEvent(事件);
     //这里处理触摸事件...

     开关(event.getAction()及event.ACTION_MASK)
     {
         案例MotionEvent.ACTION_DOWN://第一指仅下跌
                                             savedMatrix.set(矩阵);
                                             start.set(event.getX(),event.getY());
                                             Log.d(TAG模式= DRAG); //写入LogCat中
                                             模式=阻力;
                                             打破;

         案例MotionEvent.ACTION_UP://第一手指抬起

         案例MotionEvent.ACTION_POINTER_UP://第二根手指抬起

                                             模式=无;
                                             Log.d(TAG模式= NONE);
                                             打破;

         案例MotionEvent.ACTION_POINTER_DOWN://第一和第二指下跌

                                             oldDist =间距(事件);
                                             Log.d(TAG,oldDist =+ oldDist);
                                             如果(oldDist> 5F){
                                                 savedMatrix.set(矩阵);
                                                 中点(中,事件);
                                                 模式=变焦;
                                                 Log.d(TAG模式= ZOOM);
                                             }
                                             打破;

         案例MotionEvent.ACTION_MOVE:

                                             如果(模式==拖动)
                                             {
                                                 matrix.set(savedMatrix);
                                                 matrix.postTranslate(event.getX() -  start.x,event.getY() -  start.y); //创建点的矩阵变换
                                             }
                                             否则,如果(模式== ZOOM)
                                             {
                                                 //捏缩放
                                                 浮newDist =间距(事件);
                                                 Log.d(TAG,newDist =+ newDist);
                                                 如果(newDist> 5F)
                                                 {
                                                     matrix.set(savedMatrix);
                                                     规模= newDist / oldDist; //设置的比例
                                                                                 //矩阵...如果规模> 1手段
                                                                                 //放大......如果规模< 1手段
                                                                                 // 缩小
                                                     matrix.postScale(规模化,规模化,mid.x,mid.y);
                                                 }
                                             }
                                             打破;
     }

     view.setImageMatrix(矩阵); //显示在屏幕上的转变

     返回true; //表示事件已经被处理
}
私人浮动间距(MotionEvent事件)
{
    浮X = event.getX(0) -  event.getX(1);
    浮Y = event.getY(0) -  event.getY(1);
    返回FloatMath.sqrt(X * X + Y * Y);
}

/ *
 * ------------------------------------------------- -------------------------
 *方法:中点参数:的PointF对象,MotionEvent返回:Void
 *说明:计算两个手指之间的中点
 * ------------------------------------------------- -----------
 * /

私人无效中点(的PointF点,MotionEvent事件)
{
    浮X = event.getX(0)+ event.getX(1);
    浮Y = event.getY(0)+ event.getY(1);
    point.set(X / 2,Y / 2);
}

/ **显​​示在LogCat中查看事件,调试* /
私人无效dumpEvent(MotionEvent事件)
{
    字符串名称[] = {DOWN,UP,移动,取消,外,POINTER_DOWN,POINTER_UP,7?,8?,9? };
    StringBuilder的SB =新的StringBuilder();
    INT行动= event.getAction();
    INT行动code =动作和放大器; MotionEvent.ACTION_MASK;
    sb.append(事件响应_)追加(姓名[动作code])。

    如果(动作code == MotionEvent.ACTION_POINTER_DOWN ||行动code == MotionEvent.ACTION_POINTER_UP)
    {
        sb.append((PID).append(作用>> MotionEvent.ACTION_POINTER_ID_SHIFT);
        sb.append());
    }

    sb.append([);
    的for(int i = 0; I< event.getPointerCount();我++)
    {
        。sb.append(#)追加(ⅰ);
        sb.append((PID).append(event.getPointerId(ⅰ));
        sb.append()=)追加((int)的event.getX(ⅰ))。
        。sb.append(,)追加((int)的event.getY(ⅰ));
        如果第(i + 1&其中; event.getPointerCount())
            sb.append(;);
    }

    sb.append(]);
    Log.d(触摸事件---------,sb.toString());
}
 

I would like to open an Image, in ImageView, from a button press. I need the image to be zoomable and scrollable. How would I best go about accomplishing this? Thank you!

The Image can be either PNG or JPG

Thank you so much!

Here is my new code, you wouldn't mind skimming through and giving me a solution to all my problems with TAG, ZOOM , etc... I also know I need to add my image res to it

    package com.DS;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class CheatMathActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnTouchListener(new View.OnTouchListener(){
        public void onTouch(View v) {
   //Opens Algebra Image 
             public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                     ImageView view = (ImageView) v;
                     view.setScaleType(ImageView.ScaleType.MATRIX);
                     float scale;

                     dumpEvent(event);
                     // Handle touch events here...

                     Matrix matrix;
                    Matrix savedMatrix;
                    PointF start;
                    Object mode;
                    float oldDist;
                    PointF mid;
                    switch (event.getAction() & event.ACTION_MASK) 
                     {
                         case MotionEvent.ACTION_DOWN:   // first finger down only
                                                             savedMatrix.set(matrix);
                                                             start.set(event.getX(), event.getY());
                                                             Log.d(TAG, "mode=DRAG"); // write to LogCat
                                                             mode = DRAG;
                                                             break;

                         case MotionEvent.ACTION_UP: // first finger lifted

                         case MotionEvent.ACTION_POINTER_UP: // second finger lifted

                                                             mode = NONE;
                                                             Log.d(TAG, "mode=NONE");
                                                             break;

                         case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down

                                                             oldDist = spacing(event);
                                                             Log.d(TAG, "oldDist=" + oldDist);
                                                             if (oldDist > 5f) {
                                                                 savedMatrix.set(matrix);
                                                                 midPoint(mid, event);
                                                                 mode = ZOOM;
                                                                 Log.d(TAG, "mode=ZOOM");
                                                             }
                                                             break;

                         case MotionEvent.ACTION_MOVE:

                                                             if (mode == DRAG) 
                                                             { 
                                                                 matrix.set(savedMatrix);
                                                                 matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
                                                             } 
                                                             else if (mode == ZOOM) 
                                                             { 
                                                                 // pinch zooming
                                                                 float newDist = spacing(event);
                                                                 Log.d(TAG, "newDist=" + newDist);
                                                                 if (newDist > 5f) 
                                                                 {
                                                                     matrix.set(savedMatrix);
                                                                     scale = newDist / oldDist; // setting the scaling of the
                                                                                                 // matrix...if scale > 1 means
                                                                                                 // zoom in...if scale < 1 means
                                                                                                 // zoom out
                                                                     matrix.postScale(scale, scale, mid.x, mid.y);
                                                                 }
                                                             }
                                                             break;
                     }

                     view.setImageMatrix(matrix); // display the transformation on screen

                     return true; // indicate event was handled
                }
                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);
                }

                /*
                 * --------------------------------------------------------------------------
                 * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
                 * Description: calculates the midpoint between the 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);
                }

                /** 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("Touch Events ---------", sb.toString()); 

            }   





    }

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            // TODO Auto-generated method stub
            return false;
        }

});
    final Button button2 = (Button) findViewById(R.id.button2);
    button2.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
    //Opens Next Subset Image   
        }
    });

}
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
     ImageView view = (ImageView) v;
     view.setScaleType(ImageView.ScaleType.MATRIX);
     float scale;

     dumpEvent(event);
     // Handle touch events here...

     Matrix matrix;
    Matrix savedMatrix;
    PointF start;
    Object mode;
    float oldDist;
    PointF mid;
    switch (event.getAction() & event.ACTION_MASK) 
     {
         case MotionEvent.ACTION_DOWN:   // first finger down only
                                             savedMatrix.set(matrix);
                                             start.set(event.getX(), event.getY());
                                             Log.d(TAG, "mode=DRAG"); // write to LogCat
                                             mode = DRAG;
                                             break;

         case MotionEvent.ACTION_UP: // first finger lifted

         case MotionEvent.ACTION_POINTER_UP: // second finger lifted

                                             mode = NONE;
                                             Log.d(TAG, "mode=NONE");
                                             break;

         case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down

                                             oldDist = spacing(event);
                                             Log.d(TAG, "oldDist=" + oldDist);
                                             if (oldDist > 5f) {
                                                 savedMatrix.set(matrix);
                                                 midPoint(mid, event);
                                                 mode = ZOOM;
                                                 Log.d(TAG, "mode=ZOOM");
                                             }
                                             break;

         case MotionEvent.ACTION_MOVE:

                                             if (mode == DRAG) 
                                             { 
                                                 matrix.set(savedMatrix);
                                                 matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
                                             } 
                                             else if (mode == ZOOM) 
                                             { 
                                                 // pinch zooming
                                                 float newDist = spacing(event);
                                                 Log.d(TAG, "newDist=" + newDist);
                                                 if (newDist > 5f) 
                                                 {
                                                     matrix.set(savedMatrix);
                                                     scale = newDist / oldDist; // setting the scaling of the
                                                                                 // matrix...if scale > 1 means
                                                                                 // zoom in...if scale < 1 means
                                                                                 // zoom out
                                                     matrix.postScale(scale, scale, mid.x, mid.y);
                                                 }
                                             }
                                             break;
     }

     view.setImageMatrix(matrix); // display the transformation on screen

     return true; // indicate event was handled
}
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);
}

/*
 * --------------------------------------------------------------------------
 * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
 * Description: calculates the midpoint between the 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);
}

/** 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("Touch Events ---------", sb.toString()); 

}
}

解决方案

Just add these below methods in your activity. Also, you need call this method as below and your activity must implement OnTouchListener.

imaveViewInstance.setOnTouchListener(this);

 @Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
     ImageView view = (ImageView) v;
     view.setScaleType(ImageView.ScaleType.MATRIX);
     float scale;

     dumpEvent(event);
     // Handle touch events here...

     switch (event.getAction() & event.ACTION_MASK) 
     {
         case MotionEvent.ACTION_DOWN:   // first finger down only
                                             savedMatrix.set(matrix);
                                             start.set(event.getX(), event.getY());
                                             Log.d(TAG, "mode=DRAG"); // write to LogCat
                                             mode = DRAG;
                                             break;

         case MotionEvent.ACTION_UP: // first finger lifted

         case MotionEvent.ACTION_POINTER_UP: // second finger lifted

                                             mode = NONE;
                                             Log.d(TAG, "mode=NONE");
                                             break;

         case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down

                                             oldDist = spacing(event);
                                             Log.d(TAG, "oldDist=" + oldDist);
                                             if (oldDist > 5f) {
                                                 savedMatrix.set(matrix);
                                                 midPoint(mid, event);
                                                 mode = ZOOM;
                                                 Log.d(TAG, "mode=ZOOM");
                                             }
                                             break;

         case MotionEvent.ACTION_MOVE:

                                             if (mode == DRAG) 
                                             { 
                                                 matrix.set(savedMatrix);
                                                 matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
                                             } 
                                             else if (mode == ZOOM) 
                                             { 
                                                 // pinch zooming
                                                 float newDist = spacing(event);
                                                 Log.d(TAG, "newDist=" + newDist);
                                                 if (newDist > 5f) 
                                                 {
                                                     matrix.set(savedMatrix);
                                                     scale = newDist / oldDist; // setting the scaling of the
                                                                                 // matrix...if scale > 1 means
                                                                                 // zoom in...if scale < 1 means
                                                                                 // zoom out
                                                     matrix.postScale(scale, scale, mid.x, mid.y);
                                                 }
                                             }
                                             break;
     }

     view.setImageMatrix(matrix); // display the transformation on screen

     return true; // indicate event was handled
}
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);
}

/*
 * --------------------------------------------------------------------------
 * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
 * Description: calculates the midpoint between the 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);
}

/** 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("Touch Events ---------", sb.toString());
}

这篇关于与缩放和滚动开放的ImageView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆