android 自由缩放图片
16lz
2021-01-23
代码:
package com.example.test;import android.os.Bundle;import android.app.Activity;import android.graphics.Matrix;import android.graphics.PointF;import android.util.FloatMath;import android.view.Menu;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import android.widget.Space;public class MainActivity extends Activity {private static final int NONE = 0;private static final int DRAG = 1;private static final int ZOOM = 2;private int mode = NONE;private Matrix matrix = new Matrix();private Matrix savedMatrix = new Matrix();private PointF start = new PointF();private PointF mid = new PointF();private float oldDist;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView = (ImageView) findViewById(R.id.img);imageView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View arg0, MotionEvent arg1) {ImageView view = (ImageView) arg0;switch (arg1.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:savedMatrix.set(matrix);start.set(arg1.getX(), arg1.getY());System.out.println("---------ACTION_DOWN--->>"+ arg1.getX() + "---" + arg1.getY());mode = DRAG;break;case MotionEvent.ACTION_POINTER_UP:System.out.println("---------ACTION_POINTER_UP--->>"+ arg1.getX() + "---" + arg1.getY());mode = NONE;break;case MotionEvent.ACTION_POINTER_DOWN:oldDist = spacing(arg1);if (oldDist > 10f) {savedMatrix.set(matrix);midPoint(mid, arg1);mode = ZOOM;}break;case MotionEvent.ACTION_MOVE:if (mode == DRAG) {matrix.set(savedMatrix);matrix.postTranslate(arg1.getX() - start.x, arg1.getY()- start.y);} else if (mode == ZOOM) {float newDist = spacing(arg1);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 FloatMath.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);}});}}
布局:
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" android:src="@drawable/test" /></RelativeLayout>
更多相关文章
- Android 初学入门代码注释 学习笔记001 16.03.18
- android代码实现自动关机
- android sdcard 检测代码
- 关于Android 相对布局中的属性 的介绍和运用
- android WiFi 开关代码
- android之布局xml各种控件属性详解
- android 怎样用代码设置墙纸
- android代码实现ScaleAnimation动画(附原码)
- Android apps应用检查更新代码