- 浏览: 688972 次
- 性别:
- 来自: 苏州
最新评论
-
usedlie:
if (flag) { matrix.set(matrix ...
android view的缩放平移简单实现 -
jin290:
简单 快捷 非常棒 可以直接用
android 应用实现微信好友或朋友圈分享 -
貌似掉线:
0是朋友1是朋友圈
android 应用实现微信好友或朋友圈分享 -
zhangzhanlei:
[color=red][/color]
android 应用实现微信好友或朋友圈分享 -
shizhangliao:
android适配多分辨率的小技巧
参考了下网上一些实现
主要是通过matrix实现的
用到的技术点:1,多点触摸
2,matrix的矩阵,平移和缩放
主要是通过matrix实现的
用到的技术点:1,多点触摸
2,matrix的矩阵,平移和缩放
package com.nico; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.PointF; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class ScaleView extends ImageView { final public static int DRAG = 1; final public static int ZOOM = 2; public int mode = 0; private Matrix matrix = new Matrix(); private Matrix matrix1 = new Matrix(); private Matrix saveMatrix = new Matrix(); private float x_down = 0; private float y_down = 0; private Bitmap touchImg; private PointF mid = new PointF(); private float initDis = 1f; private int screenWidth, screenHeight; private float[] x = new float[4]; private float[] y = new float[4]; private boolean flag = false; public ScaleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public ScaleView(Context context, AttributeSet attrs) { super(context, attrs); } public ScaleView(Context context) { super(context); touchImg = BitmapFactory.decodeResource(getResources(), R.drawable.img); DisplayMetrics dm = getResources().getDisplayMetrics(); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; matrix = new Matrix(); // this.setScaleType(ScaleType.MATRIX); } @Override protected void onDraw(Canvas canvas) { canvas.save(); // 根据 matrix 来重绘新的view canvas.drawBitmap(touchImg, matrix, null); canvas.restore(); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); // 多点触摸的时候 必须加上MotionEvent.ACTION_MASK switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: saveMatrix.set(matrix); x_down = event.getX(); y_down = event.getY(); // 初始为drag模式 mode = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: saveMatrix.set(matrix); // 初始的两个触摸点间的距离 initDis = spacing(event); // 设置为缩放模式 mode = ZOOM; // 多点触摸的时候 计算出中间点的坐标 midPoint(mid, event); break; case MotionEvent.ACTION_MOVE: // drag模式 if (mode == DRAG) { // 设置当前的 matrix matrix1.set(saveMatrix); // 平移 当前坐标减去初始坐标 移动的距离 matrix1.postTranslate(event.getX() - x_down, event.getY() - y_down);// 平移 // 判断达到移动标准 flag = checkMatrix(matrix1); if (flag) { // 设置matrix matrix.set(matrix1); // 调用ondraw重绘 invalidate(); } } else if (mode == ZOOM) { matrix1.set(saveMatrix); float newDis = spacing(event); // 计算出缩放比例 float scale = newDis / initDis; // 以mid为中心进行缩放 matrix1.postScale(scale, scale, mid.x, mid.y); flag = checkMatrix(matrix1); if (flag) { matrix.set(matrix1); invalidate(); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = 0; break; } return true; } //取两点的距离 private float spacing(MotionEvent event) { try { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } catch (IllegalArgumentException ex) { Log.v("TAG", ex.getLocalizedMessage()); return 0; } } //取两点的中点 private void midPoint(PointF point, MotionEvent event) { try { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } catch (IllegalArgumentException ex) { //这个异常是android自带的,网上清一色的这么说。。。。 Log.v("TAG", ex.getLocalizedMessage()); } } private boolean checkMatrix(Matrix m) { GetFour(m); // 出界判断 //view的右边缘x坐标小于屏幕宽度的1/3的时候, // view左边缘大于屏幕款短的2/3的时候 //view的下边缘在屏幕1/3上的时候 //view的上边缘在屏幕2/3下的时候 if ((x[0] < screenWidth / 3 && x[1] < screenWidth / 3 && x[2] < screenWidth / 3 && x[3] < screenWidth / 3) || (x[0] > screenWidth * 2 / 3 && x[1] > screenWidth * 2 / 3 && x[2] > screenWidth * 2 / 3 && x[3] > screenWidth * 2 / 3) || (y[0] < screenHeight / 3 && y[1] < screenHeight / 3 && y[2] < screenHeight / 3 && y[3] < screenHeight / 3) || (y[0] > screenHeight * 2 / 3 && y[1] > screenHeight * 2 / 3 && y[2] > screenHeight * 2 / 3 && y[3] > screenHeight * 2 / 3)) { return true; } // 图片现宽度 double width = Math.sqrt((x[0] - x[1]) * (x[0] - x[1]) + (y[0] - y[1]) * (y[0] - y[1])); // 缩放比率判断 宽度打雨3倍屏宽,或者小于1/3屏宽 if (width < screenWidth / 3 || width > screenWidth * 3) { return true; } return false; // if ((x[0] >= 0 && x[1] >= 0 && x[2] >= 0 && x[3] >= 0) // && (x[0] <= screenWidth && x[1] <= screenWidth // && x[2] <= screenWidth && x[3] <= screenWidth) // && (y[0] >= 0 && y[1] >= 0 && y[2] >= 0 && y[3] >= 0) && (y[0] <= // screenHeight // && y[1] <= screenHeight && y[2] <= screenHeight && y[3] <= // screenHeight)) { // // return true; // } // // return false; } private void GetFour(Matrix matrix) { float[] f = new float[9]; matrix.getValues(f); // StringBuffer sb = new StringBuffer(); // for(float ff : f) // { // sb.append(ff+" "); // } // 图片4个顶点的坐标 //矩阵 9 MSCALE_X 缩放的, MSKEW_X 倾斜的 。MTRANS_X 平移的 x[0] = f[Matrix.MSCALE_X] * 0 + f[Matrix.MSKEW_X] * 0 + f[Matrix.MTRANS_X]; y[0] = f[Matrix.MSKEW_Y] * 0 + f[Matrix.MSCALE_Y] * 0 + f[Matrix.MTRANS_Y]; x[1] = f[Matrix.MSCALE_X] * touchImg.getWidth() + f[Matrix.MSKEW_X] * 0 + f[Matrix.MTRANS_X]; y[1] = f[Matrix.MSKEW_Y] * touchImg.getWidth() + f[Matrix.MSCALE_Y] * 0 + f[Matrix.MTRANS_Y]; x[2] = f[Matrix.MSCALE_X] * 0 + f[Matrix.MSKEW_X] * touchImg.getHeight() + f[Matrix.MTRANS_X]; y[2] = f[Matrix.MSKEW_Y] * 0 + f[Matrix.MSCALE_Y] * touchImg.getHeight() + f[Matrix.MTRANS_Y]; x[3] = f[Matrix.MSCALE_X] * touchImg.getWidth() + f[Matrix.MSKEW_X] * touchImg.getHeight() + f[Matrix.MTRANS_X]; y[3] = f[Matrix.MSKEW_Y] * touchImg.getWidth() + f[Matrix.MSCALE_Y] * touchImg.getHeight() + f[Matrix.MTRANS_Y]; } }
评论
1 楼
usedlie
2016-06-17
if (flag) {
matrix.set(matrix1);
invalidate();
}
这个逻辑反了,private boolean checkMatrix(Matrix m)这个方法是越界判断,假如越界,则返回true;
谢谢博主的GetFour(Matrix matrix)这个方法,正愁找不到缩放后的图片的坐标呢。。
一开始还以为得记录用户的一切操作(比如偏移量,缩放什么的),帮了大忙,谢谢;
虽说网上不少缩放、移动的控件,不过还是这种自定义的才能满足各种蛋疼的需求;
下一步看看要不要优化中心点=。=
matrix.set(matrix1);
invalidate();
}
这个逻辑反了,private boolean checkMatrix(Matrix m)这个方法是越界判断,假如越界,则返回true;
谢谢博主的GetFour(Matrix matrix)这个方法,正愁找不到缩放后的图片的坐标呢。。
一开始还以为得记录用户的一切操作(比如偏移量,缩放什么的),帮了大忙,谢谢;
虽说网上不少缩放、移动的控件,不过还是这种自定义的才能满足各种蛋疼的需求;
下一步看看要不要优化中心点=。=
发表评论
-
jar包混淆
2016-09-18 16:46 1089开发过程中需要把相关功能打成jar包供别人调用,如果不混淆的话 ... -
项目从eclipse移植到studio中遇到的问题整理
2016-09-13 17:42 1138概念 eclipse workspace ---> ... -
ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理
2016-08-03 22:26 637一直对这块的知识一知 ... -
仿京东android客户端收件地址选择
2016-07-12 18:07 6478纯手写,可能有些问题,功能已实现 activity pac ... -
FragmentActivity中资源被回收,导致页面fragment错乱的问题
2016-06-07 13:59 3806开发过程中,页面使用fragmentactivity,可能会遇 ... -
android 通过eclipse mat来监测应用内存
2016-02-03 13:02 011dasdasdas -
【转】详解ViewPager调用FragmentPagerAdapter.notifyDataSetChanged()不能更新Fragment
2016-01-30 13:27 2016转载自 http://www.blog4app.com/?p= ... -
startActivityForResult常用使用方式
2015-04-24 11:58 1684示例 初始Activity启动目标activity,并带上了请 ... -
在android4.4以上版本 第三方应用处理短信的疑惑
2015-03-31 16:14 991最近有个处理android手机短信的需求,需要删除本地某指定短 ... -
Beacon的入门相关知识整理(关于android开发)
2014-10-27 16:53 0To do.... -
[转]常用Github项目类库
2014-09-18 09:29 1762【转自】http://blog.csdn.net/jabony ... -
android适配多分辨率的小技巧
2014-09-05 18:10 2766android多分辨率适配其实是老生常谈的话了,今天再拿出来炒 ... -
android通过自定义schame和host来启动app
2014-08-15 15:02 2129很多时候,我们可以看到在web页面中点击链接,可以直接启动ap ... -
基础知识整理
2014-08-08 17:50 0onTouch(MotionEvent event) eve ... -
android 应用实现微信好友或朋友圈分享
2014-07-18 16:44 60392官方的文档连接:https://open.weixin.qq. ... -
android 自定义view支持gif格式播放
2014-07-16 18:38 4118前段时间做了个项目,有播放gif的需求, 而android展示 ... -
android中自定义attr,以及style杂谈
2014-06-05 18:12 13713attr 属性 style 样式 二者都是在res/value ... -
ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
2014-05-20 11:20 1134最近在做android类似slidemenu项目,遇到了scr ... -
获取手机网络状态的代码
2014-03-27 16:45 1265之前网上有人使用方法判断手机网络状态代码如下: Co ... -
[转]android onNewIntent
2014-02-18 15:12 821在Android应用程序开发的时候,从一个Activity启动 ...
相关推荐
android手势处理图片平移、缩放和旋转 图片出界判断 处理后新图片的创建
简单的Android动画,旋转,透明,平移,缩放
Android 补间动画, 具体介绍了: 1、透明度 2、平移 3、旋转 4、缩放 4种动画效果的实现, 简单易懂
一个可以实现 单指移动、双击缩放、双指缩放的View
Android canvas 放大 缩小 平移 各种绘图 自定义view 请自行修改
摘录于国外开源代码,实现平移缩放旋转在一个View实现效果非常流畅,可以运行
具体请参考:Android实现手势滑动多点触摸缩放平移图片效果,本篇继续完善我们的ImageView。 首先加入放大后的移动。 1、自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以...
如果一个图片只是简单的移动,这个很容易就可以判断出触控点是否落在绘制bitmap的矩形区域,但这个bitmap能动态旋转、缩放那就不能用老一套的方法了。 图片左上角的点在图片旋转之后A的坐标落在哪里?图片缩放后A又...
Android 视图缩放组件 实现的功能点 触摸滑动及惯性滑动 多指缩放 双击缩放 同时处理了以下细节 滑动冲突,比如将 ZoomLayout 放在 ViewPager 中 事件冲突,ZoomLayout 和 子 View 都能接收事件 ZoomLayout 宽、高...
之前因为项目需求,其中使用到了图片的单击显示取消,图片平移缩放功能,昨天突然想再加上图片的旋转功能,在网上看了很多相关的例子,可是没看到能同时实现我想要的功能的。 需求: (1)图片平移、缩放、旋转等一...
通过Animation对象实现:抖动动画(基于平移动画)、平移动画、缩放动画、旋转动画、透明度渐变动画。
平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix就是一个3...
一组灵活的Android组件,它们支持以编程方式或通过触摸事件来缩放和平移View层次结构,图像,视频流等。 implementation ' com.otaliastudios:zoomlayout:1.8.0 ' ZoomLayout :一个容器,支持2D平移和缩放到View...
现在很多App在查看一张图片的原图时,都会支持图片的手势缩放,手势平移以及图片旋转的操作。那么今天小编就来教大家去简单的实现图片的放大、平移、旋转的操作,有需要的可以参考借鉴。
Android 平台提供了两类...本例子主要实现了Tweene动画,实现了页面等待、开门、元素旋转平移缩放渐变等功能,并且使用了在Activity界面直接操作动画、重写View处理动画、利用XML处理动画等技术,是非常不错的资源。
SurfaceView和TextureView均继承于android.view.View 与其它View不同的是,两者都能在独立的线程中绘制...二、TextureView更像是一般的View,像TextView那样能被缩放、平移,也能加上动画。 TextureView只能在开启了硬
}该方法可以将一个path进行matrix转换,即矩阵转换,因此我们可以通过方法matrix.postTranslate来实现平移动画,即创建一个循环动画,通过postTranslate来设置动画值就可以了,这里左边的云在右边的云之上,因此先画...
View动画从名字就可以大致知道,View动画是对View做图形变换(平移、缩放、旋转、透明度)从而产生动画效果,并且View动画支持自定义。帧动画是通过顺序播放一系列的图片从而产生的动画效果。属性动画是在API11...
实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View....
平移动画标签使用的子类名称为TranslateAnimation,实现的效果是平行移动整个View。 缩放动画标签,使用的子类名称为ScaleAnimation,实现的效果是整个View的放大或者缩小。 旋转动画标签使用的子类名称是...