问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

如何通过手势实现android view 的 缩放 平移

发布网友 发布时间:2022-05-02 19:16

我来回答

1个回答

热心网友 时间:2022-06-26 06:34

代码主要分两部分,一个activity一个view,代码如下:

package com.example.touch;

import android.app.Activity;
import android.os.Bundle;

public class TouchImageViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TouchImageView img = new TouchImageView(this);
        setContentView(img);
    }
}



package com.example.touch;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.widget.ImageView;

public class TouchImageView extends ImageView {

float x_down = 0;
float y_down = 0;
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
float oldRotation = 0;
Matrix matrix = new Matrix();
Matrix matrix1 = new Matrix();
Matrix savedMatrix = new Matrix();

private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
int mode = NONE;

boolean matrixCheck = false;

int widthScreen;
int heightScreen;

Bitmap gintama;

public TouchImageView(TouchImageViewActivity activity) {
super(activity);
gintama = BitmapFactory.decodeResource(getResources(), R.drawable.gintama);

DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
widthScreen = dm.widthPixels;
heightScreen = dm.heightPixels;

matrix = new Matrix();
}

protected void onDraw(Canvas canvas) {
canvas.save();
canvas.drawBitmap(gintama, matrix, null);
canvas.restore();
}

public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mode = DRAG;
x_down = event.getX();
y_down = event.getY();
savedMatrix.set(matrix);
break;
case MotionEvent.ACTION_POINTER_DOWN:
mode = ZOOM;
oldDist = spacing(event);
oldRotation = rotation(event);
savedMatrix.set(matrix);
midPoint(mid, event);
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
matrix1.set(savedMatrix);
float rotation = rotation(event) - oldRotation;
float newDist = spacing(event);
float scale = newDist / oldDist;
matrix1.postScale(scale, scale, mid.x, mid.y);// 缩放
matrix1.postRotate(rotation, mid.x, mid.y);// 旋转
matrixCheck = matrixCheck();
if (matrixCheck == false) {
matrix.set(matrix1);
invalidate();
}
} else if (mode == DRAG) {
matrix1.set(savedMatrix);
matrix1.postTranslate(event.getX() - x_down, event.getY()
- y_down);// 平移
matrixCheck = matrixCheck();
matrixCheck = matrixCheck();
if (matrixCheck == false) {
matrix.set(matrix1);
invalidate();
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
return true;
}

private boolean matrixCheck() {
float[] f = new float[9];
matrix1.getValues(f);
// 图片4个顶点的坐标
float x1 = f[0] * 0 + f[1] * 0 + f[2];
float y1 = f[3] * 0 + f[4] * 0 + f[5];
float x2 = f[0] * gintama.getWidth() + f[1] * 0 + f[2];
float y2 = f[3] * gintama.getWidth() + f[4] * 0 + f[5];
float x3 = f[0] * 0 + f[1] * gintama.getHeight() + f[2];
float y3 = f[3] * 0 + f[4] * gintama.getHeight() + f[5];
float x4 = f[0] * gintama.getWidth() + f[1] * gintama.getHeight() + f[2];
float y4 = f[3] * gintama.getWidth() + f[4] * gintama.getHeight() + f[5];
// 图片现宽度
double width = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
// 缩放比率判断
if (width < widthScreen / 3 || width > widthScreen * 3) {
return true;
}
// 出界判断
if ((x1 < widthScreen / 3 && x2 < widthScreen / 3
&& x3 < widthScreen / 3 && x4 < widthScreen / 3)
|| (x1 > widthScreen * 2 / 3 && x2 > widthScreen * 2 / 3
&& x3 > widthScreen * 2 / 3 && x4 > widthScreen * 2 / 3)
|| (y1 < heightScreen / 3 && y2 < heightScreen / 3
&& y3 < heightScreen / 3 && y4 < heightScreen / 3)
|| (y1 > heightScreen * 2 / 3 && y2 > heightScreen * 2 / 3
&& y3 > heightScreen * 2 / 3 && y4 > heightScreen * 2 / 3)) {
return true;
}
return false;
}

// 触碰两点间距离
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);
}

// 取旋转角度
private float rotation(MotionEvent event) {
double delta_x = (event.getX(0) - event.getX(1));
double delta_y = (event.getY(0) - event.getY(1));
double radians = Math.atan2(delta_y, delta_x);
return (float) Math.toDegrees(radians);
}

// 将移动,缩放以及旋转后的图层保存为新图片
// 本例中没有用到该方法,需要保存图片的可以参考
public Bitmap CreatNewPhoto() {
Bitmap bitmap = Bitmap.createBitmap(widthScreen, heightScreen,
Config.ARGB_8888); // 背景图片
Canvas canvas = new Canvas(bitmap); // 新建画布
canvas.drawBitmap(gintama, matrix, null); // 画图片
canvas.save(Canvas.ALL_SAVE_FLAG); // 保存画布
canvas.restore();
return bitmap;
}

}

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
dnf属性强化增加多少攻击力 上海青种多久能吃 上海青栽种多久可以吃 上海青种植几个月才能收获 1月播种上海青多久发芽 1月播种上海青发芽所需时间 上海青种植多久可以吃 上海青 多久 上海青种多久成熟 用可丽蓝十字验孕棒测了两次结果不同,这是怀孕了吗? PHP实现简单的发送HTML邮件 尖锐湿疣为什么会很容易复发 android模拟器如何模拟两根手指的情况?比如模拟放大缩小之类的 姬广亮的擅长领域 姬广亮老师的儿子怎么样 男朋友穿阿迪达斯的篮球鞋是42码的,请问AJ也要买42码的吗? 姬广亮的全脑领域 大家觉得大脑派课程怎么样?讲师姬广亮是专&#x200B;业的吗? 阿迪旗下很多牌子,什么大三叶草,小三叶草分不清,还有耐克360什么意思 阿迪达斯的鞋子,乔丹的鞋子,耐克的鞋子哪个最贵,哪个最便宜 姬广亮的纪录说明 女孩子穿aj哪款好看 请问大脑派的姬广亮?讲的课怎么样? 谁能介绍下NIKE和阿迪达斯旗下品牌 姬广亮的介绍 姬广亮的五快学习法那有买的 如何看待现在学生都是脚踏AJ,耐克阿迪或者彪马? 姬广亮记忆训练法是看书好,还是看视频好呢? 阿迪达斯和耐克各有什么特点? 阿迪 耐克 和AJ,哪个牌子的篮球鞋知名度最高 卡西欧G7300用的是什么型号的电池? 为什么我的手表总是经常出现recover字样,并且有时会突然停掉呢? 阿巴町手表为什么看不见电量显示 如何解决webView手势放大缩小,设置不起作用 安卓系统开发过程中怎样实现屏幕根据手势缩放 Android中GridView显示表格数据实现了手势缩放,但垂直滚动条不能用了,求指教 Android 手势缩放一个布局,布局里面有控件,跟随缩放,求demo 黑暗神殿阿卡玛怎么不开门啊 Android 自定义ImageView添加手势后,移动或缩放怎么判断越界的问题 android 如何利用手势放大和缩小textview 中国音乐学院的钢琴考级好吗??? android中的webview怎么才能支持双指手势的放大缩小呢,我说android的... android 开发视频界面,视频如何可以像操作图片一样,双击放大、拖动、手势缩放吗?大神给点思路 android中开发百度地图怎么设置地图不能旋转以及手势切换视角的问题? OPPO watch2怎么关机 oppo5watchfree手表怎么关机 Apple Watch死机怎么办 如何强制关机重启 apple watch6强制重启 为什么我的PDF软件里面没有看到:“).文档:添加水印和背景这个选项的? 我用pdf编辑器修改了一个pdf文件,但是只要保存就会有水印或者其他的标记,谁有其他好的办法 pdf-tools4.0合并完后有水印,如何处理?有没有好的pdf编辑软件?谢谢。 pdf编辑器哪个厚道一点,免费还没有水印 文件没有水印,怎么添加多个PDF水印呢?
  • 焦点

最新推荐

猜你喜欢

热门推荐