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);}}
- Android ImageView 手势控制放大缩小 滑屏切换
- Android 重载ImageView 可以使用手势放大缩小拖动
- Android 手势放大与缩小
- 手势放大缩小的ImageView,双击放大、还原
- Android相册支持查看本地相册,点击放大图片,滑动切换图片,手势放大缩小
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果 .
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- python,java,go语言之间的区别!
- android frameworks层增加硬件服务
- 创建一个Date类
- Linux下chkconfig命令详解
- IOS 画线
- Android ImageView 手势控制放大缩小 滑屏切换
- uploadify使用笔记
- Eclipse导出可执行JAR文件的方法
- JDBC工具类
- Linux 档案属性
- 利用java迭代器Itetator遍历并删除HashMap中的元素问题
- MFC自定义控件
- 黑马程序员---C#读写txt文件
- malloc: *** error for object xx: pointer being freed was not allocate的问题的解决方法之一