双击放大图片 手指移动图片位置
2017-04-27 20:13
351 查看
手指脱动图片 双击放大
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;
}
}
}
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;
}
}
}
相关文章推荐
- 打造个性的图片预览与多点触控(自由移动,自由缩放,双击放大缩小)
- 图片双击放大,可以移动!
- IOS:实现对图片的双击放大、移动、捏合操作
- Android-图片预览(自定义ImageView 封装(jar): 图片放大缩小,自由移动,双击放大,多点触控)
- Android图片处理总结四:双击图片,保持点击位置不变放大
- 手势状态控制图片的缩放和移动(双击放大,俩指滑动图片缩放)
- 鼠标移动到图片放大的效果
- Qt 显示图片 放大 缩小 移动
- Javascript实现图片位置控制(鼠标拖拽 + 键盘方向键移动)源码分享
- 在WPF里面实现以鼠标位置为中心缩放移动图片
- Android 开发知识 图片跟随触摸位置移动
- JS网页图片查看器-可控制图片放大缩小移动|兼容IE、FF
- Control Study -> 当鼠标在图片上移动时,放大图像区域
- Javascript实现图片的移动,图片的放大,图片缩小功能
- Qt 显示图片 放大 缩小 移动
- iphone开发 图片、PDF 双击放大 实现
- android 双击图片放大,再双击缩小效果 【安卓进化九】
- jsp中使用js随意移动图片位置效果
- Control Study -> 当鼠标在图片上移动时,放大图像区域
- JS网页图片查看器-可控制图片放大缩小还原移动效果