您的位置:首页 > 其它

手势状态控制图片的缩放和移动(双击放大,俩指滑动图片缩放)

2017-04-26 18:13 453 查看
            

         手势状态控制图片的缩放和移动(双击放大,俩指滑动图片缩放)

MainActivity:

package com.example.pointerstouchevent;

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

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
private CystomImage image;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//将自定义View控件找出来
image= (CystomImage) findViewById(R.id.image);
//手势探测器实现手势的监听
gestureDetector=new GestureDetector(this,this);
//手指在屏幕上双击的手势监听
gestureDetector.setOnDoubleTapListener(this);
}

//Activity检测手势的方法
@Override
public boolean onTouchEvent(MotionEvent event) {
//通过event获取屏幕上手指个数
int pointerCount = event.getPointerCount();

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

break;
default:
break;
}
//return super.onTouchEvent(event);
return  gestureDetector.onTouchEvent(event);
}

//+++++++++++++++++++++++这六个方法就是手势监听方法++++++++++++++++++++++++++++++++++++++++++++
@Override
public boolean onDown(MotionEvent e) {
Log.e("flag", "--------------------->onDown:手指按下 ");
return false;
}

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

}

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

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

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

}

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

//这一块是实现让图片向左移动缩小,向右移动放大
float e1X = e1.getX();
float e2X = e2.getX();
if(e1X-e2X>10){//向左移动
//缩小图片
image.scaleImage(0);

}else if(e1X-e2X<-10){
//放大
image.scaleImage(1);
}

return false;
}

//+++++++++++++++下面三个方法是手势双击屏幕的监听+++++++++++++++++++++++++++++++++++++++++++++

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.e("flag", "--------------------->onSingleTapConfirmed: 单击确定事件,俩次单击的事件间隔有点长");

return false;
}

@Override
public boolean onDoubleTap(MotionEvent e) {
Log.e("flag", "--------------------->onDoubleTap: 双击事件");
//这里调用scaleImage()方法来实现双击图片的缩放
image.scaleImage(1);//放大图片

return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.e("flag", "--------------------->onDoubleTapEvent: 双击发生之间的事件(双击的时候移动了,滑动了等等..)");
return false;
}
}


自定义View中:

package com.example.pointerstouchevent;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
* Created by SuBang on 2017/4/26.
*/

public class CystomImage extends ImageView {
private float last_x = 0;
private float last_y = 0;
private float scaleSize = 0.1f;//缩放的比例
private float last_gap = 0;//俩点之间的 距离

public CystomImage(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

//1.实现手指滑动图片移动
public void move(MotionEvent event) {
//当前的坐标
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last_x = event.getX();
last_y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float current_x = event.getX();
float currnt_y = event.getY();
float abs_x = Math.abs(current_x - last_x);
float abs_y = Math.abs(currnt_y - last_y);
if (abs_x > 10 && abs_x < 40 || abs_y > 10 && abs_y < 40) {
moveImage(current_x - last_x, currnt_y - last_y);
}
last_x = current_x;
last_y = currnt_y;

break;
default:
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);

}

//2.实现俩个指头滑动让图片缩放
public void scale(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//一个手指的坐标
float x = event.getX(0);
float y = event.getY(0);
//另一个手指的坐标
float x1 = event.getX(1);
float y1 = event.getY(1);

//勾股定理算出俩个手指之间的距离
float current_gap = (float) Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
if (current_gap - last_gap > 10) {
//图片放大
scaleImage(1);
} else if (current_gap - last_gap < -10) {
//图片缩小
scaleImage(0);
}
last_gap = current_gap;
break;
default:
break;
}
}
//3.双击让图片放大缩小
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;
default:
break;
}
}
}


布局activity_main中:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.pointerstouchevent.MainActivity">

<com.example.pointerstouchevent.CystomImage
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
/>

</RelativeLayout>
每天进步一点点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐