android Matrix实现图片随意放大缩小或拖动
在Android开发中,Matrix类是一个非常重要的工具,它允许我们对图形对象(如图片)进行变换,如旋转、缩放、平移等操作。本示例主要讲解如何利用Matrix实现图片的随意放大、缩小和拖动功能。 我们需要创建一个新的Android项目,命名为DragAndZoom。在项目的res/drawable-hdpi目录下放置一张要处理的图片,这里假设图片名为"wall.png"。 在布局文件`main.xml`中,我们需要一个ImageView来显示图片。关键在于将`ImageView`的`scaleType`属性设置为"matrix",这允许我们使用Matrix进行自定义的缩放和平移操作: ```xml <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/wall" android:id="@+id/imageView" android:scaleType="matrix" /> </LinearLayout> ``` 接下来,我们需要在`MainActivity`中初始化并设置事件监听器。这里我们创建一个内部类`TouchListener`,实现`OnTouchListener`接口,以便处理用户的触摸事件: ```java public class MainActivity extends Activity { private ImageView imageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) findViewById(R.id.imageView); imageView.setOnTouchListener(new TouchListener()); } private class TouchListener implements OnTouchListener { // ... } } ``` 在`TouchListener`中,我们定义了一些关键变量来跟踪当前的操作状态和坐标信息: - `mode`:记录当前模式,初始状态为0,代表无操作;1代表拖动模式,2代表缩放模式。 - `startPoint`:记录用户第一次触摸时的坐标。 - `matrix`:存储图片的原始变换矩阵。 - `currentMatrix`:存储当前的变换矩阵,用于更新图片的位置和大小。 在`onTouch`方法中,我们根据MotionEvent的ACTION类型来处理不同的触摸事件: - ACTION_DOWN:记录开始时的触摸点坐标。 - ACTION_POINTER_DOWN:当有第二个手指触碰屏幕时,计算两个手指之间的距离和中点,准备进行缩放操作。 - ACTION_MOVE:处理拖动和缩放操作。如果是拖动模式,更新图片的位置;如果是缩放模式,根据手指间的新距离调整缩放因子并更新图片的大小。 - ACTION_UP和ACTION_POINTER_UP:结束触摸事件,恢复到拖动模式。 以下是`onTouch`方法的完整实现: ```java @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: startPoint.set(event.getX(), event.getY()); mode = MODE_DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: midPoint.set((event.getX(0) + event.getX(1)) / 2, (event.getY(0) + event.getY(1)) / 2); startDis = FloatMath.sqrt(Math.pow(event.getX(1) - event.getX(0), 2) + Math.pow(event.getY(1) - event.getY(0), 2)); mode = MODE_ZOOM; break; case MotionEvent.ACTION_MOVE: if (mode == MODE_ZOOM || mode == MODE_DRAG) { PointF curPoint = new PointF(event.getX(), event.getY()); if (mode == MODE_ZOOM) { float curDis = FloatMath.sqrt(Math.pow(event.getX(1) - event.getX(0), 2) + Math.pow(event.getY(1) - event.getY(0), 2)); float scale = curDis / startDis; matrix.set(currentMatrix); matrix.postScale(scale, scale, midPoint.x, midPoint.y); } else { matrix.set(currentMatrix); matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y); } imageView.setImageMatrix(matrix); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = MODE_DRAG; break; } return true; } ``` 以上代码实现了基本的图片放大、缩小和拖动功能。在实际应用中,可能还需要添加边界检测,防止图片超出屏幕范围,以及平滑滚动等优化。通过Matrix类和MotionEvent的处理,我们可以灵活地控制图片在Android应用中的显示效果。
剩余6页未读,继续阅读
- 粉丝: 3
- 资源: 937
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于JavaScript和Python的家庭财务管理系统设计源码
- 基于Kotlin语言的RxTool库设计源码下载
- 基于Java及多语言框架的西华大学在线判题系统前后端接口设计源码
- 基于Java语言的潜水租借管理系统后台代码设计源码
- 基于Java及JavaScript的Vue框架金源大药房商城-jy-mall-uc设计源码
- 基于若依框架的固定资产管理系统asset_manager设计源码
- 基于Arduino IDE 1.8.x的STM32开发板硬件支持设计源码
- 基于SpringBoot框架的Java职位管理设计源码
- 基于C语言的FreeModbus从机-主机模式设计及RTT通信实现STM32源码
- 基于C++与C的跨语言数据结构设计源码