Android图片处理总结四:双击图片,保持点击位置不变放大
来源:互联网 发布:c语言 表达式的值 编辑:程序博客网 时间:2024/06/16 06:30
双击ImageView,需要保持图片点击点相对布局的位置不变,然后放大图片,因为项目大量的ImageView都需要这个功能,所以扩展了ImageView。主要是:
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]; }
阅读全文
0 0
- Android图片处理总结四:双击图片,保持点击位置不变放大
- 双击放大图片 手指移动图片位置
- 图像处理之---图片放大,图片大小放大,内容大小不变,位置可变
- android 双击图片放大缩小
- Android-图片双击放大控件
- android 图片点击放大
- Android 点击图片放大
- 图片放大缩小并且文字与图片相对位置不变
- android 图片放大处理
- 图片处理之 图片大小放大 图片内容不变
- Android图片点击放大等
- android 图片双击放大倍数的算法
- Android中双击图片放大 PhotoView
- 双击放大图片
- 双击放大缩小图片
- 图片双击放大问题
- 图片和文字保持相对位置不变以及background属性
- android-gallery游览图片点击图片放大
- 线程安全和不变性
- 更改mysql端口
- 最全Pycharm教程(2)——代码风格
- java SimpleDateFormat类介绍
- download chromedriver from mirror website
- Android图片处理总结四:双击图片,保持点击位置不变放大
- Java实现2048
- [一天一项目] 获取m个数中和等与k的n个数
- java用递归算法求1~100的和
- source insight 4 破解版可用
- Python3 异常处理
- 素数筛法打表
- linux下root用户以及非root用户忘记密码的解决方案
- CodeForces