Android ImageView 手势控制放大缩小 滑屏切换

来源:互联网 发布:js date yyyymmdd 编辑:程序博客网 时间:2024/06/05 22:43

主要思路是创建两个事件监听,

一个手势监听MyGuestListner继承SimpleOnGestureListener,负责双击图片后为ImageView设置新的放大缩小移动监听以及滑屏切换图片。

一个MulitPointTouchListener继承OnTouchListener,负责图片的放大缩小移动以及双击后还原图片大小和卸载ImageView当前监听。


放大缩小监听类

package com.dawnpro.dfacmobile.cpzs;import android.graphics.Matrix;import android.graphics.PointF;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import android.widget.Toast;import com.dawnpro.dfacmobile.utils.Global;public class MulitPointTouchListener implements OnTouchListener {           //图像矩阵,用于缩放移动等图像操作        Matrix matrix = new Matrix();           Matrix savedMatrix = new Matrix();        Matrix originMatrix = new Matrix();          //点击或者手势操作类型        static final int NONE = 0;           static final int DRAG = 1;           static final int ZOOM = 2;           int mode = NONE;             //PointF 为坐标值的float形式        PointF start = new PointF();           PointF mid = new PointF();           float oldDist = 1f;                //判断是否双击的变量        //点击计数        private int count = 0;        //第一次点击的时间        private long firstTouch;        //第二次点击的时间        private long secondTouch;                //本张海报第一次点击        private boolean first = true;                @Override          public boolean onTouch(View v, MotionEvent event) {                        ImageView view = (ImageView) v;                     // 处理接受到的事件                switch (event.getAction() & MotionEvent.ACTION_MASK) {                //单手指(主)点击下触发                case MotionEvent.ACTION_DOWN:                //判断是否双击                count ++;                if(count == 1){                //记录第一次点击的时间                firstTouch = System.currentTimeMillis();                }else if(count == 2){                //记录第二次点击的时间                secondTouch = System.currentTimeMillis();                                if((secondTouch - firstTouch) < 600){                //两次点击小于600毫秒,则为双击事件,去除该操作listener并还原图片为初始状态                view.setImageMatrix(originMatrix);                view.setOnTouchListener(null);                Toast.makeText(Global.applicationContext, "缩放模式关闭,请滑屏切换图片", Toast.LENGTH_SHORT).show();                }                                count = 0;                firstTouch = 0;                secondTouch = 0;                }                                //记录图片初始大小                if(first){                //本张海报第一次点击                originMatrix.set(view.getImageMatrix());                first = false;                }                          matrix.set(view.getImageMatrix());                        savedMatrix.set(matrix);                        //记录点击下的坐标                        start.set(event.getX(), event.getY());                           // 为拖动模式                        mode = DRAG;                           break;                //第二个手指(副)点击下触发。多点触控                case MotionEvent.ACTION_POINTER_DOWN:                //计算两个手指之间的距离                        oldDist = spacing(event);                        //如果距离大于10,则定多点触控                        if (oldDist > 10f) {                        //保存当前matrix                                savedMatrix.set(matrix);                                //计算点击下的两点的中间点坐标                                midPoint(mid, event);                                mode = ZOOM;                           }                           break;                   case MotionEvent.ACTION_UP:                   case MotionEvent.ACTION_POINTER_UP:                           mode = NONE;                             break;                   case MotionEvent.ACTION_MOVE:                //如果为单指点击并且移动,为拖拽图片进行产看                        if (mode == DRAG) {                        Log.i("jerry","action drag ... ");//                              // ...                                   matrix.set(savedMatrix);                                //通过matrix移动图片                                matrix.postTranslate(event.getX() - start.x, event.getY()                                                   - start.y);                           } else if (mode == ZOOM) {                        //计算两点间距离                                float newDist = spacing(event);                                   if (newDist > 10f) {                                           matrix.set(savedMatrix);                                        //计算缩放比                                        float scale = newDist / oldDist;                                        //缩放操作                                        matrix.postScale(scale, scale, mid.x, mid.y);                                   }                           }                           break;                   }                     view.setImageMatrix(matrix);                   return true; //告知事件已被处理          }             //计算点击后两点间距离        private float spacing(MotionEvent event) {                   float x = event.getX(0) - event.getX(1);                   float y = event.getY(0) - event.getY(1);                   return (float) Math.sqrt(x * x + y * y);        }             //计算两点间中间点的坐标        private void midPoint(PointF point, MotionEvent event) {                   float x = event.getX(0) + event.getX(1);                   float y = event.getY(0) + event.getY(1);                   point.set(x / 2, y / 2);           }   }  

Activity兼滑动监听


package com.dawnpro.dfacmobile.cpzs;import java.io.InputStream;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.util.Log;import android.view.GestureDetector;import android.view.GestureDetector.SimpleOnGestureListener;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import com.dawnpro.dfacmobile.R;import com.dawnpro.dfacmobile.utils.ActivityUtils;import com.dawnpro.dfacmobile.utils.Constant;import com.dawnpro.dfacmobile.utils.Global;public class SpecialtyActivity extends Activity {// imageloader// private ImageLoader imageLoader;//Bitmap btp;//MulitPointTouchListener mulitPointTouchListener;// 手势相关private GestureDetector detector;// 标题栏private TextView tv_title;// 特点图片集合private int[] images;//private ImageView iv_specialtyImage;// 特色海报页数private int page = 0;//private boolean notZoom = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_specialty);detector = new GestureDetector(this, new MyGuestListner());// imageLoader = ImageLoader.getInstance();Intent intent = getIntent();String title = intent.getStringExtra("title");initImage(title);init(title);}/** * 初始化界面 */private void init(String title) {// 设置标题栏tv_title = (TextView) findViewById(R.id.title_name);tv_title.setText(title + "- 特点");iv_specialtyImage = (ImageView) findViewById(R.id.specialty_image);mulitPointTouchListener = new MulitPointTouchListener();setImage(page);}private void setImage(int page) {// images[page]为资源ID数组中的资源IDInputStream is = this.getResources().openRawResource(images[page]);BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;// 图片大小缩放比例,建议为2的倍数,这里图片尺寸没有缩放// options.inSampleSize = 1;btp = BitmapFactory.decodeStream(is, null, options);// 将生成的 bitmap设置到目标imageViewiv_specialtyImage.setImageBitmap(btp);LayoutParams ps = iv_specialtyImage.getLayoutParams();ps.width = Global.screen_width;ps.height = Global.screen_height;iv_specialtyImage.setLayoutParams(ps);}/** * 提醒GC回收 */private void recycleImage() {if (!btp.isRecycled()) {btp.recycle();btp = null;System.gc(); // 提醒系统及时回收}}/** * 准备产品特点图片集 */private void initImage(String title) {if (title.equals(Constant.KPT)) {// 凯普特images = new int[] { R.drawable.kpts1, R.drawable.kpts2,R.drawable.kpts3, R.drawable.kpts4 };} else if (title.equals(Constant.DLK)) {images = new int[] { R.drawable.dlks1, R.drawable.dlks2,R.drawable.dlks3 };} else if (title.equals(Constant.FRK)) {images = new int[] { R.drawable.frks1, R.drawable.frks2,R.drawable.frks3, R.drawable.frks4, R.drawable.frks5,R.drawable.frks6 };}}public void click(View view) {int id = view.getId();switch (id) {case R.id.specialty_image:pageNext();break;case R.id.back_cpzs:ActivityUtils.closeCurrentActivity(this);break;default:break;}}/** * 海报翻页 */private void pageNext() {page++;if (page > (images.length - 1)) {page = 0;}// 释放recycleImage();// 设置setImage(page);}private void prePage() {page--;if (page < 0) {page = images.length - 1;}recycleImage();setImage(page);}/** * 滑动监听类 *  * @author dpjiangyb *  */class MyGuestListner extends SimpleOnGestureListener {/** * 双击事件 */@Overridepublic boolean onDoubleTap(MotionEvent e) {Log.i("jerry", "双击了一次 ... ");if(notZoom){iv_specialtyImage.setOnTouchListener(mulitPointTouchListener);notZoom = false;Toast.makeText(Global.applicationContext, "开启缩放模式,双指控制缩放", Toast.LENGTH_SHORT).show();}else{iv_specialtyImage.setOnTouchListener(null);notZoom = true;}return true;}// 监听滑动事件@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {if (e1.getX() - e2.getX() > 120) {// 向左滑动pageNext();ActivityUtils.animationPushInFromRight(SpecialtyActivity.this,iv_specialtyImage);} else if (e1.getX() - e2.getX() < -120) {// 向右滑动prePage();ActivityUtils.animationPushInFromLeft(SpecialtyActivity.this,iv_specialtyImage);} else {return false;}return true;}}@Overridepublic boolean onTouchEvent(MotionEvent event) {return detector.onTouchEvent(event);}}



原创粉丝点击