android 图片放大缩小的边界简单的限制处理

android 图片放大缩小的边界简单的限制处理

首先,你要明白,即使是微信这样出色的软件对4边界限制处理也不是很完善的。具体你可以在上边界将图片放大之后再缩小,等等。所以,你要是卡在这个问题上影响到了项目进度,请别纠结太久。

其次,本文想实现的效果----当图片拉过边界时,自动返回边界位置。
不说废话,上代码:
<span style="font-size:24px;">@Override
        public boolean onTouch(View v, MotionEvent event) {
            /** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_UP: // 手指离开屏幕
                   MyLogger.e(TAG, "ACTION_UP:" + mode);
                    //复位图片
                    PointF p1=getLeftPointF();
                    PointF p2=getRightPointF();

                    //左边界复位
                    if(p1.x>0)
                        matrix.postTranslate(-p1.x, 0);
                    //右边界复位
                    if(p2.x<mImgPic.getWidth()){
                        matrix.postTranslate(mImgPic.getWidth()-p2.x, 0);
                    }
                    //上下边界复位
                    if(p2.y-p1.y>mImgPic.getHeight()) {
                        //上边界复位
                        if (p1.y > 0) matrix.postTranslate(0, -p1.y);
                        //下边界复位
                        if (p2.y < mImgPic.getHeight())
                            matrix.postTranslate(0, mImgPic.getHeight() - p2.y);
                    }
                    else{
                        float row=(mImgPic.getHeight()-(p2.y-p1.y))/2;
                            matrix.postTranslate(0, row-p1.y);
                    }                    
                    break;

            }
            return true;
        }</span>
这这个事件是只要有手指移开了屏幕,就会触发。。不管你有几根已经在屏幕上了。

上面的图有两个关键性质的方法。。用来定位图片左上角和右下角两个点的算法。。
大家直接拿去用就可以。具体为什么。之后再来解释。

 //获取图片的上坐标
        private PointF getLeftPointF()
        {
            Rect rectTemp = mImgPic.getDrawable().getBounds();
            float[] values = new float[9];
            matrix.getValues(values);
            float leftX=values[2];
            float leftY=values[5];
            MyLogger.e(TAG, "左上角坐标:x "  + leftX+"   y "+leftY);
            return new PointF(leftX,leftY);
        }
        //获取图片的下坐标
        private PointF getRightPointF()
        {

            Rect rectTemp = mImgPic.getDrawable().getBounds();
            float[] values = new float[9];
            matrix.getValues(values);
            float leftX= values[2]+rectTemp.width()*values[0];
            float leftY=values[5]+rectTemp.height()*values[4];
            MyLogger.e(TAG, "右下角坐标:x "  + leftX+"   y "+leftY);
            return new PointF(leftX,leftY);
        }


首先有这么张坑B图(rrrrrrrrrrrrrrrrrrrrrrrrr)
这B图简直是对数学不好的人的嘲讽对吧。。好吧大家表害怕。


MSCALE用于处理缩放变换


MSKEW用于处理错切变换


MTRANS用于处理平移变换



哔了狗了。。我怕读者看的心烦,特意放

大点。


拖动,很显而易见,就是MTRANS了!!。。。而float values=float[9];这个

数组存

储矩阵是,第一行是123,第二行是456,最后是789.

首先看左上角的点:

很直接的拿到了


values[2]
values[5]

这不解释。

右下角的点,很容易就想到。直接加图片的

尺寸就好了呀!!!

问题是,放大缩小后图片的尺寸变化了!


一般第一反应是,自己写一个。计算并且存储图片的变化
很显然的,这么做费力不讨好。效率不高。。。。。开始我以为

这个坑爹的matrix的作者比较脑残。既然没有做出直接能拿当前图

片坐标的方法。那应该也没有想过会记录图片的变化吧。。可是

后来我发现我错了。。。。写这段程序的人就是个学数学的购

币。。。。。。


没错





MSCALE用于处理缩放变换----的比率

(而且是与初始图像相比的比率)!


于是右下角坐标的公式就出来了
<span style="white-space:pre">	</span>float leftX= values[2]+rectTemp.width()*values[0];
        float leftY=values[5]+rectTemp.height()*values[4];

不用担心那些坑B问题!!


已完成方便使用的---工具类

http://download.csdn.net/detail/a7178077/8748573


使用说明会后补。自己看也能看懂



你可能感兴趣的:(android,图片)