Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 圖片放大縮小的邊界簡單的限制處理

android 圖片放大縮小的邊界簡單的限制處理

編輯:關於Android編程

android 圖片放大縮小的邊界簡單的限制處理
首先,你要明白,即使是微信這樣出色的軟件對4邊界限制處理也不是很完善的。具體你可以在上邊界將圖片放大之後再縮小,等等。所以,你要是卡在這個問題上影響到了項目進度,請別糾結太久。
其次,本文想實現的效果----當圖片拉過邊界時,自動返回邊界位置。 不說廢話,上代碼:
@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.xmImgPic.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;
        }
這這個事件是只要有手指移開了屏幕,就會觸發。。不管你有幾根已經在屏幕上了。
上面的圖有兩個關鍵性質的方法。。用來定位圖片左上角和右下角兩個點的算法。。 大家直接拿去用就可以。具體為什麼。之後再來解釋。
 //獲取圖片的上坐標
        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用於處理縮放變換----的比率
(而且是與初始圖像相比的比率)!


於是右下角坐標的公式就出來了
	float leftX= values[2]+rectTemp.width()*values[0];
        float leftY=values[5]+rectTemp.height()*values[4];

不用擔心那些坑B問題!!

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved