Android图片处理总结四:双击图片,保持点击位置不变放大
2017-08-04 13:25
645 查看
双击ImageView,需要保持图片点击点相对布局的位置不变,然后放大图片,因为项目大量的ImageView都需要这个功能,所以扩展了ImageView。主要是:
1.扩展ImageView类
2.重写手势控制类GestureDetector.SimpleOnGestureListener 中的onDoubleTap()方法
3.利用Matrix进行放大和平移图片
详细代码如下,有详细注释:
1.扩展ImageView类
2.重写手势控制类GestureDetector.SimpleOnGestureListener 中的onDoubleTap()方法
3.利用Matrix进行放大和平移图片
详细代码如下,有详细注释:
//扩展ImageView类 public class ScaleImageView extends ImageView{ private Drawable nullDrawable; //定义手势控制类 private GestureDetectorCompat mDetector; private float initX,initY; private Matrix matrix; private float defaultScale = 1.0f; private float preScaleX = 1.0f,preScaleY = 1.0f; public LocalImageView(Context context) { super(context); } public ScaleImageView (Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public ScaleImageView (Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } private void init(Context context, AttributeSet attrs) { nullDrawable = null; if(attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ImageStyle); nullDrawable = typedArray.getDrawable(R.styleable.ImageStyle_nullDrawable); typedArray.recycle(); } mDetector = new GestureDetectorCompat(context, new MyGestureListener()); matrix = new Matrix(); } @Override protected void onFinishInflate() { super.onFinishInflate(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if(nullDrawable != null) nullDrawable.setBounds((getWidth() - nullDrawable.getIntrinsicWidth())/2,(getHeight() - nullDrawable.getMinimumHeight())/2,(getWidth() - nullDrawable.getIntrinsicWidth())/2+ nullDrawable.getIntrinsicWidth(),(getHeight() - nullDrawable.getMinimumHeight())/2 + nullDrawable.getMinimumHeight()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override protected void onDraw(Canvas canvas) { if(this.getDrawable() == null) { canvas.drawColor(getResources().getColor(R.color.clr_grey)); if (nullDrawable != null) nullDrawable.draw(canvas); } super.onDraw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); //使用手势控制类处理MotionEvent mDetector.onTouchEvent(event); return true; } //扩展GestureDetector.SimpleOnGestureListener类 class MyGestureListener extends GestureDetector.SimpleOnGestureListener { //重写onDoubleTap方法 @Override public boolean onDoubleTap(MotionEvent e) { //获取双击坐标 float clickX = e.getX(); float clickY = e.getY(); //H获取上一次的方法系数 float oldScale = getScale(); //每次双击放大倍数加0.1 float scale = oldScale + 0.1f; //获取上一次的平移量, float oldTranX = -getTranX(); float oldTranY = -getTranY(); //设置放大系数 matrix.setScale(scale,scale); /* 计算新的平移量: 1.算出点击点相对于目前图片的坐标: clickX和clickY是点击坐标,相对于图片(已经被放大)的坐标需要加上平移量clickX + oldTranX 2.算出点击点相对于原图片的坐标(注意是原始图片): (clickX + oldTranX)/oldScale 3.算出此次放大,点击点相对于放大图片的坐标(注意是放大后的图片): ((clickX + oldTranX)/oldScale)*scale 4..计算新的平移量: ((clickX + oldTranX)/oldScale)*scale - clickX */ float tranX = -(((clickX - oldTranX)/oldScale)*scale - clickX); float tranY = -(((clickY - oldTranY)/oldScale)*scale - clickY); //设置平移,因为是要向左和向上平移,所以是负数 matrix.postTranslate(-tranX,-tranY); //设置矩阵 setImageMatrix(matrix); return super.onDoubleTap(e); } } public float getScale() { float[] values = new float[9]; matrix.getValues(values); return values[Matrix.MSCALE_X]; } public float getTranX() { float[] values = new float[9]; matrix.getValues(values); return values[Matrix.MTRANS_X]; } public float getTranY() { float[] values = new float[9]; matrix.getValues(values); return values[Matrix.MTRANS_Y]; }
相关文章推荐
- [置顶] Android基于photoView点击选择坐标,放大缩小图片时,坐标位置对应改变
- Android浏览图片,点击放大至全屏效果(包含点击前位置到全屏的动画)
- 图像处理之---图片放大,图片大小放大,内容大小不变,位置可变
- android 双击图片放大缩小
- android 双击屏幕触发事件,放大图片,不用接入借口api,不用OnGestureListener,不造成代码累赘方法
- android 图片处理 (滤镜,图片位置)
- Android 图片双击围绕中心点放大和MotionEvent分析
- android 图片放大处理
- Android图片查看支持双击放大缩小、多点触摸
- 关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结
- 关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结
- 关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结(转)
- U6数据导出工具项目总结三 鼠标单击或者双击DataGridView控件时获取鼠标点击位置的值
- android 图片放大的处理
- android点击实现图片放大缩小
- 图片放大缩小并且文字与图片相对位置不变
- Android中Gallery 点击图片放大
- android处理图片的一些问题总结
- android 图片点击一下就放大到全屏,再点一下就回到原界面
- android点击实现图片放大缩小 - java技术博客