图片缩放移动

原创 2016年05月31日 09:29:43

创建MyImageView.java代码extends SurfaceView

package com.example.picture;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MyImageView extends SurfaceView implements Callback {

    private SurfaceHolder holder = null;
    private Bitmap bitmap = null;
    private Matrix matrix = new Matrix();

    // 一根手指在触碰
    private int ONE_TOUCH = 1;
    // 多根手指在触碰
    private int MORE_TOUCH = 2;
    // 当前触碰的手指模拟
    private int currentTouch = ONE_TOUCH;

    // 单根手指触碰的开始点
    private Point startPoint = new Point();

    // 多根手指滑动的前后距离
    private float dis1;
    private float dis2;
    // 多根手指滑动的中心点
    private Point centerPoint = new Point();
    private Matrix savedMatrix = new Matrix();



    public MyImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyImageView(Context context) {
        super(context);
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        holder = this.getHolder();
        holder.addCallback(this);

        // 得到一个Bitmap对象
        bitmap = ((BitmapDrawable) getResources().getDrawable(
                R.drawable.android_book)).getBitmap();

    }


    /**
     * 绘画
     */
    private void draw() {
        // 锁定画布
        Canvas canvas = holder.lockCanvas();
        if (canvas == null) {
            return;
        }

        // 清除画布
        canvas.drawColor(Color.BLACK);

        // 画图片
        canvas.drawBitmap(bitmap, matrix, null);

        // 解锁画布并提交
        holder.unlockCanvasAndPost(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        /** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */
        // 能接受单根和多根手指的触碰
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            // 设置模式为单根手指
            currentTouch = ONE_TOUCH;
            // 得到单根手指一开始接触的坐标
            startPoint.set((int) event.getX(), (int) event.getY());
            savedMatrix.set(matrix);

            break;
        // 当屏幕上已经有触点(手指),再有一个触点压下屏幕
        case MotionEvent.ACTION_POINTER_DOWN:
            // 设置模式为多根手指触碰
            currentTouch = MORE_TOUCH;
            // 得到两根手指一开始触碰的距离
            dis1 = getDistance(event);

            if (dis1 > 10f) {
                // 得到这两根手指的中心点
                getCenter(event);
                // 记录当前图片的缩放倍数
                savedMatrix.set(matrix);

            }

            break;
        case MotionEvent.ACTION_MOVE:
            if (currentTouch == ONE_TOUCH) {
                // 如果是一根手指,则设置平移,平移的距离是从开始点到现在的移动点
                // 当前位置上移动
                matrix.set(savedMatrix);
                matrix.postTranslate((event.getX() - startPoint.x),
                        (event.getY() - startPoint.y));

            } else if (currentTouch == MORE_TOUCH) {
                // 如果是多根手指模式,则设置缩放,缩放的比例是刚接触时两根手指之间的距离与移动后两根手指之间的距离比.
                // 缩放的中心点是刚接触时两根手指的中心点
                dis2 = getDistance(event);
                if (dis2 > 10f) {
                    float scale = dis2 / dis1;

                    matrix.set(savedMatrix);
                    matrix.postScale(scale, scale, centerPoint.x, centerPoint.y);
                }
            }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            currentTouch = 0;
            break;
        default:
            break;
        }

        // 重新画图像
        draw();

        return true;
    }

    /**
     * 得到两根手指之间的距离
     * 
     * @param event
     * @return
     */
    private float getDistance(MotionEvent event) {
        float a = event.getX(1) - event.getX(0);
        float b = event.getY(1) - event.getY(0);
        return (float) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
    }

    /**
     * 得到两根手指之间的中心点
     * 
     * @param event
     */
    private void getCenter(MotionEvent event) {
        float a = event.getX(1) + event.getX(0);
        float b = event.getY(1) + event.getY(0);
        centerPoint.set((int) a / 2, (int) b / 2);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 让这个View在创建的时候就开始画画
        draw();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

}

MainActivity.java代码

package com.example.picture;


import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class MainActivity extends Activity{

    private SurfaceHolder holder = null ;
    private int screenWidth;
    private int screenHeight;
    private Bitmap bitmap;
    private int imageWidth;
    private int imageHeight;
    private int imageX;
    private int imageY;
    private MyImageView myImageView;
    private double Scale = 1.0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


//      this.screenWidth = super.getWindowManager().getDefaultDisplay().getWidth();
//      this.screenHeight = super.getWindowManager().getDefaultDisplay().getHeight();
//      this.bitmap = BitmapFactory.decodeResource(super.getResources(), R.drawable.android_book);
//      
//      this.imageWidth = this.bitmap.getWidth();
//      this.imageHeight = this.bitmap.getHeight();
//      
//      this.imageX = (this.screenWidth - this.imageWidth) / 2 ;
//      this.imageY = (this.screenHeight - this.imageHeight) / 2 ;

        myImageView = new MyImageView(this);


        super.setContentView(myImageView);
    }



}

通过手势缩放、移动ImageView的图片

先放上一张效果图: 在这里,我对自己的笔记本全屏截图,然后当作自定义ImageView的 Src放在真机上运行。 可以看到这里的图片是可以移动和缩放的。 在这里先说清一点,如果在xml的控件上设置...
  • qq_23124943
  • qq_23124943
  • 2016年06月04日 22:38
  • 1585

iOS 之UIImageView实现图片的移动和缩放

因为种种原因,需要在iphone应用中实现图片查看功能,由于iphone屏幕支持多点触摸,于是是想到用“手势”来实现图片的实时缩放和移动。借鉴无所不在的internet网络资料之后,终于实现此一功能,...
  • codeblshi
  • codeblshi
  • 2014年12月25日 15:45
  • 765

图片缩放和移动原理

项目源码:ZoomImage 图片的缩放和移动其实就是view的onTouch和onDrawa()方法的使用. 首先我们来分析下具体的处理操作 1.首先是原图显示在界面的时候,我们要让图片居中,...
  • iblue007
  • iblue007
  • 2017年06月12日 16:40
  • 342

Android 实现图片缩放和拖动

今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些。但有许多人都直接使用了库文件,那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图, 那么简单了...
  • u013151336
  • u013151336
  • 2016年11月08日 19:40
  • 762

imageview 缩放 涂鸦

package com.example.testimg; import java.io.File; import java.io.FileInputStream; import java.io.Fi...
  • tianshengwo123
  • tianshengwo123
  • 2013年11月19日 22:40
  • 931

wpf 图片平移、旋转和缩放

因项目需要图片预览,所以做了一个预览的功能,再次备份: xaml代码:         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pre...
  • yulongguiziyao
  • yulongguiziyao
  • 2015年11月17日 18:19
  • 1489

Qt 显示图片 放大 缩小 移动

本文章原创于www.yafeilinux.com 转载请注明出处。 1)显示图片: 将dialog.cpp文件中的paintEvent()函数更改如下。 void Dialo...
  • hobertony_7
  • hobertony_7
  • 2014年12月22日 11:59
  • 3168

ios学习--结合UIImageView实现图片的移动和缩放(转)

因为种种原因,需要在iphone应用中实现图片查看功能,由于iphone屏幕支持多点触摸,于是是想到用“手势”来实现图片的实时缩放和移动。借鉴无所不在的internet网络资料之后,终于实现此一功能,...
  • yanfangjin
  • yanfangjin
  • 2012年04月16日 14:34
  • 15291

CANVAS移动、缩放、旋转画入的图片

自己做的一个CANVAS移动、缩放、旋转画入的图片demo: CANVAS touch测试 *{ margin:0px; padding:0px; -webkit-tap-...
  • qq_16494241
  • qq_16494241
  • 2016年08月16日 14:49
  • 7486

Android 实现可以自由移动缩放的图片控件

一、概述:1、需要实现的功能 1)可以自由的缩放 2)双击可以缩放 3)自动边界检测 4)放大后可以自由的移动 5)处理与viewpager之间的事件冲突2、需要用到的技术 1)Handl...
  • lovoo
  • lovoo
  • 2016年06月10日 23:04
  • 5959
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图片缩放移动
举报原因:
原因补充:

(最多只允许输入30个字)