手势状态控制图片的缩放和移动(双击放大,俩指滑动图片缩放)
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>
每天进步一点点!
相关文章推荐
- 打造个性的图片预览与多点触控(自由移动,自由缩放,双击放大缩小)
- Xamarin.iOS滑动视图上图片(视图)的缩放(双击手势实现缩放)
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
- Android手势控制实现缩放、移动图片
- 安卓开发中的手势操作监听1双击2.滑动关闭Activity 3.放大缩小图片等手势操作,
- Android 微信朋友圈动态+双击手势放大并滑动查看图片。
- zepto.js滑动事件,jquery获得url参数,手机端双击图片和手势放大
- Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。
- js实现移动端图片预览:手势缩放, 手势拖动,双击放大...
- android——图片缩放(双击放大、手势缩放)
- Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果
- web手势库AlloyFinger运用( 控制CANVAS中图片移动、缩放、旋转)
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放
- Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。
- [置顶] viewPager+photoView实现图片轮播和手势缩放功能,并且实现滑动到下一页后上一页缩放的图片会恢复到之前的默认状态(下)
- slides 带手势的图片滑动效果(用于移动终端)
- 图片双击放大,可以移动!
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android 手势控制解锁,滑动图片,照相,音乐切换,收音机换台,短信界面打电话
- 通过手势缩放、移动ImageView的图片