手指脱动图片   双击放大

package com.softpo.pointerstouchevent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;

import com.softpo.pointerstouchevent.widget.CustomImage;

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

private CustomImage mImage;

//手势识别:按下,抬起,长按,双击……
    private GestureDetector mGestureDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImage = (CustomImage) findViewById(R.id.image);

mGestureDetector = new GestureDetector(this,this);

mGestureDetector.setOnDoubleTapListener(this);

}

//屏幕上的触摸事件,Activity捕获到

@Override
    public boolean onTouchEvent(MotionEvent event) {

//通过event获取屏幕上手指个数
        int pointerCount = event.getPointerCount();

switch (pointerCount){
            case 1://移动图片
                mImage.move(event);
                break;
            case 2://缩放
                mImage.scale(event);
                break;
        }

return mGestureDetector.onTouchEvent(event);
    }

@Override
    public boolean onDown(MotionEvent e) {
        Log.d("flag", "----------------->onDown: 手指按下");
        return false;
    }

@Override
    public void onShowPress(MotionEvent e) {
        Log.d("flag", "----------------->onShowPress: 手指按下,长安之前" );
    }

@Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.d("flag", "----------------->onSingleTapUp: 单击抬起事件");
        return false;
    }

@Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.d("flag", "----------------->onScroll: 手指在屏幕上滑动");
        return false;
    }

@Override
    public void onLongPress(MotionEvent e) {
        Log.d("flag", "----------------->onLongPress: 长按");
    }

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.d("flag", "----------------->onFling: 手指离开屏幕惯性滑动");

float e1X = e1.getX();
        float e2X = e2.getX();

//        if(e1X-e2X>10){//向左移动
//            //缩小图片
//            mImage.scaleImage(0);
//        }else if(e1X-e2X<-10){//向右移动
//            //放大图片
//            mImage.scaleImage(1);
//        }

return false;
    }

@Override
    public boolean onSingleTapConfirmed(MotionEvent e) {

Log.d("flag", "----------------->onSingleTapConfirmed: 单击确定事件,两次单击时间间隔长了点");

return false;
    }

@Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.d("flag", "----------------->onDoubleTap: 双击事件");

mImage.scaleImage(1);//图片放大

return false;
    }

@Override
    public boolean onDoubleTapEvent(MotionEvent e) {

Log.d("flag", "----------------->onDoubleTapEvent: 双击发生的之间的事件" );

return false;
    }

}

package com.softpo.pointerstouchevent.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Created by softpo on 2017/4/26.
 * Email: likaiyuan.cool@163.com
 */

public class CustomImage extends ImageView {
    //记录上一次的位置
    private float last_X = 0;
    private float last_Y = 0;
    public CustomImage(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

//手指移动,更新图片的位置
    public void move(MotionEvent event) {
//        Log.d("flag", "----------------->move: " +current_X+", "+current_Y);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d("flag", "----------------->move: down");
                last_X = event.getX();
                last_Y = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("flag", "----------------->move:  move");
                //当前的坐标
                float current_X = event.getX();//x轴坐标
                float current_Y = event.getY();//Y轴坐标
                float abs_x = Math.abs(current_X - last_X);
                float abs_y = Math.abs(current_Y - last_Y);
                if(abs_x>10&&abs_x<40||abs_y>10&&abs_y<40){
                    moveImage(current_X-last_X,current_Y-last_Y);
                }
                last_X = event.getX();
                last_Y = event.getY();
                break;
        }

}

private void moveImage(float x, float y) {

int offsetX = (int) x;
        int offsetY = (int) y;

this.setFrame(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);

}

private float scaleSize = 0.1f;//缩放比例

private double last_gap  = 0;//两点之间的距离

public void scale(MotionEvent event) {

switch (event.getAction()){
            case MotionEvent.ACTION_MOVE:

float x0 = event.getX(0);
                float x1 = event.getX(1);
                float y0 = event.getY(0);
                float y1 = event.getY(1);

double current_gap = Math.sqrt((x0 - x1) * (x0 - x1) + (y0 - y1) * (y0 - y1));

if(current_gap-last_gap>10){//两点之间的距离变大
                    scaleImage(1);
                }else if(current_gap - last_gap<-10){//两点之间距离变小
                    scaleImage(0);
                }

last_gap = current_gap;
                break;
        }

}

public void scaleImage(int flag) {

int scaleSize_X = (int) (scaleSize * getWidth());

int scaleSize_Y = (int) (scaleSize*getHeight());
        switch (flag){
            case 0://缩小
                if(getWidth()>50+scaleSize_X*2)//其小有形
                this.setFrame(
                        getLeft()+ scaleSize_X,
                        getTop()+scaleSize_Y,
                        getRight()-scaleSize_X,
                        getBottom()-scaleSize_Y);

break;
            case 1://放大
                //其大有边
                if(getWidth()<getContext().getResources().getDisplayMetrics().widthPixels*3){
                    this.setFrame(getLeft()-scaleSize_X,
                            getTop()-scaleSize_Y,
                            getRight()+scaleSize_X,
                            getBottom()+scaleSize_Y);
                }

break;
        }

}
}

双击放大图片 手指移动图片位置相关推荐

  1. Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。

    转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动 ...

  2. (四)双击放大与缩小图片

    自定义ZoomImageView实现到这里,基本上完成一大半了.在上一篇又给它添加了自由移动的功能.如果你没读过,可以点击下面的链接: http://www.cnblogs.com/fuly55087 ...

  3. 微信电脑端双击不能放大图片怎么回事_IOS 微信 聊天双击放大图片操作

    单击图片放大,浏览图片细节,之后再单击回到原始页面, 如果在浏览细节时候,双击图片 会局部放大,也可以双手拖拽放大, newImage.gif 代码参考 #import "TransImag ...

  4. Word文档中实现:点击图片双击放大

    Word文档中实现:点击图片双击放大 跌娣 2020-03-04 16:59:09  7895  已收藏 2 分类专栏: 其他 版权 忍不住来转载下文章,功能太好用了: 文章来源:脚本之家 文章网址: ...

  5. TouchImageView 实现图片的缩放,双击放大缩小,多点触控的功能

    首先扯点别的:昨天约人打拳皇,又被一顿海虐,也是艰难.万水千山总是情,虐我轻点行不行?八神用的越来越水了,昨天下午饭都没有胃口了.看样是时候退出拳皇97界了. 进入正题:今天说一个GITHUB上的一个 ...

  6. js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

    原文:js实现移动端图片预览:手势缩放, 手势拖动,双击放大... 前言 本文将介绍如何通过js实现移动端图片预览,包括图片的 预览模式,手势缩放,手势拖动,双击放大等基本功能: 扫码查看示例效果: ...

  7. Android图片查看支持双击放大缩小、多点触摸(多机型测试,长期使用很稳定)

    该模块主要实现了放大和原大两个级别的缩放. 另外功能更加强大的一个类见本人另一篇博客 http://blog.csdn.net/gfg156196/article/details/49741233#r ...

  8. 用开源项目PhotoView实现图片的双指缩放和双击放大缩小

    项目地址:https://github.com/chrisbanes/PhotoView 用开源项目有个好处,一是实现简单,二是bug少.那么我们就来说下这个项目能够实现的效果: 1.单个图片的双指缩 ...

  9. Android自定义ImageView(二)——实现双击放大与缩小图片

    效果图: 首先设置图片依据控件的大小来显示在ImageVeiw中 也就是当图片的宽与高小于控件的宽与高的时候,默认不进行对图片进行放大的操作,但是会将图片居中显示,当然使用的时候可以使用自定义的属性i ...

最新文章

  1. python变量词是什么意思_python1变量,表达式和语句
  2. PAT_B_1049_C++(20分)
  3. Python机器学习:逻辑回归001什么是逻辑回归
  4. 《李焕英》票房反超,全靠《唐探3》衬托?
  5. ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题
  6. 让Python删除window下文件
  7. MyBatis入门学习(一)
  8. 025:模版变量使用详解
  9. ChainOfResponsibilityPattern(23种设计模式之一)
  10. 终于掌握vim的寄存器和系统剪贴板的使用了- 要安装vim-X11包
  11. Excel图表—正态分布概率分布图(概率密度函数图及累积概率分布图)的绘制-Part 1
  12. 司凤为璇玑抗鸿蒙熔炉,琉璃:结局最惨的是司凤和若玉?而是让人心疼的他,他死的太可惜...
  13. 【Vue2】自定义指令 directives 过滤器 filter
  14. The Coder Vol.6:小程序有大事
  15. 使用DBUtil踩过的坑,使用DButil查不出结果
  16. 龙岗CBD中心:恒大集团向前村城市更新旧改项目!
  17. 经颅电刺激对生理和病理衰老过程中情景记忆的影响
  18. pycharm 快捷键修改
  19. cad模糊查询符号_SQL 模糊查询之特殊字符
  20. java生成字节码文件_java源程序经编译生成的字节码文件的拓展名为

热门文章

  1. gdoi2016爆零记
  2. QT学习的相关博客论坛
  3. 效应论——破窗效应(zt)
  4. 【软件工程】第10组 团队展示
  5. C#开发笔记之02-什么时候使用OnXXX方法,这种命名是什么意思?
  6. 查阅相关文献描述CN,SMC,EMCI,LMCI,AD五类疾病的早期干预和诊断标准|2022数维杯国赛C题
  7. 进行JUnit单元测试时,报找不到test-dao.xml等配置文件的错误
  8. 微信聊天中上怎么用计算机,电脑可以上微信吗,教您电脑怎么用微信
  9. PAT甲级1121 Damn Single
  10. AV1标准特色编码工具简介