亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android通過自定義ImageView控件實現(xiàn)圖片的縮放和拖動的實現(xiàn)代碼

2019-10-23 20:08:52
字體:
來源:轉載
供稿:網友

概述:通過自定義ImageView控件,在xml布局里面調用自定的組件實現(xiàn)圖片的縮放。

/*** 自定義的ImageView控制,可對圖片進行多點觸控縮放和拖動* * @author qiuwanyong*/public class MyImageView extends ImageView {/*** 初始化狀態(tài)常量*/public static final int STATUS_INIT = 1;/*** 圖片放大狀態(tài)常量*/public static final int STATUS_ZOOM_OUT = 2;/*** 圖片縮小狀態(tài)常量*/public static final int STATUS_ZOOM_IN = 3;/*** 圖片拖動狀態(tài)常量*/public static final int STATUS_MOVE = 4;/*** 用于對圖片進行移動和縮放變換的矩陣*/private Matrix matrix = new Matrix();/*** 待展示的Bitmap對象*/private Bitmap sourceBitmap;/*** 記錄當前操作的狀態(tài),可選值為STATUS_INIT、STATUS_ZOOM_OUT、STATUS_ZOOM_IN和STATUS_MOVE*/private int currentStatus;/*** ZoomImageView控件的寬度*/private int width;/*** ZoomImageView控件的高度*/private int height;/*** 記錄兩指同時放在屏幕上時,中心點的橫坐標值*/private float centerPointX;/*** 記錄兩指同時放在屏幕上時,中心點的縱坐標值*/private float centerPointY;/*** 記錄當前圖片的寬度,圖片被縮放時,這個值會一起變動*/private float currentBitmapWidth;/*** 記錄當前圖片的高度,圖片被縮放時,這個值會一起變動*/private float currentBitmapHeight;/*** 記錄上次手指移動時的橫坐標*/private float lastXMove = -1;/*** 記錄上次手指移動時的縱坐標*/private float lastYMove = -1;/*** 記錄手指在橫坐標方向上的移動距離*/private float movedDistanceX;/*** 記錄手指在縱坐標方向上的移動距離*/private float movedDistanceY;/*** 記錄圖片在矩陣上的橫向偏移值*/private float totalTranslateX;/*** 記錄圖片在矩陣上的縱向偏移值*/private float totalTranslateY;/*** 記錄圖片在矩陣上的總縮放比例*/private float totalRatio;/*** 記錄手指移動的距離所造成的縮放比例*/private float scaledRatio;/*** 記錄圖片初始化時的縮放比例*/private float initRatio;/*** 記錄上次兩指之間的距離*/private double lastFingerDis;/*** ZoomImageView構造函數,將當前操作狀態(tài)設為STATUS_INIT。* * @param context* @param attrs*/public MyImageView(Context context, AttributeSet attrs) {super(context, attrs);currentStatus = STATUS_INIT;}/*** 將待展示的圖片設置進來。* * @param bitmap* 待展示的Bitmap對象*/public void setImageBitmap(Bitmap bitmap) {sourceBitmap = bitmap;invalidate();}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);if (changed) {// 分別獲取到ZoomImageView的寬度和高度width = getWidth();height = getHeight();}}@SuppressLint("NewApi") @Overridepublic boolean onTouchEvent(MotionEvent event) {if (initRatio == totalRatio) {getParent().requestDisallowInterceptTouchEvent(false);} else {getParent().requestDisallowInterceptTouchEvent(true);}switch (event.getActionMasked()) {case MotionEvent.ACTION_POINTER_DOWN:if (event.getPointerCount() == 2) {// 當有兩個手指按在屏幕上時,計算兩指之間的距離lastFingerDis = distanceBetweenFingers(event);}break;case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_MOVE:if (event.getPointerCount() == 1) {// 只有單指按在屏幕上移動時,為拖動狀態(tài)float xMove = event.getX();float yMove = event.getY();if (lastXMove == -1 && lastYMove == -1) {lastXMove = xMove;lastYMove = yMove;}currentStatus = STATUS_MOVE;movedDistanceX = xMove - lastXMove;movedDistanceY = yMove - lastYMove;// 進行邊界檢查,不允許將圖片拖出邊界if (totalTranslateX + movedDistanceX > 0) {movedDistanceX = 0;} else if (width - (totalTranslateX + movedDistanceX) > currentBitmapWidth) {movedDistanceX = 0;}if (totalTranslateY + movedDistanceY > 0) {movedDistanceY = 0;} else if (height - (totalTranslateY + movedDistanceY) > currentBitmapHeight) {movedDistanceY = 0;}// 調用onDraw()方法繪制圖片invalidate();lastXMove = xMove;lastYMove = yMove;} else if (event.getPointerCount() == 2) {// 有兩個手指按在屏幕上移動時,為縮放狀態(tài)centerPointBetweenFingers(event);double fingerDis = distanceBetweenFingers(event);if (fingerDis > lastFingerDis) {currentStatus = STATUS_ZOOM_OUT;} else {currentStatus = STATUS_ZOOM_IN;}// 進行縮放倍數檢查,最大只允許將圖片放大4倍,最小可以縮小到初始化比例if ((currentStatus == STATUS_ZOOM_OUT && totalRatio < 4 * initRatio)|| (currentStatus == STATUS_ZOOM_IN && totalRatio > initRatio)) {scaledRatio = (float) (fingerDis / lastFingerDis);totalRatio = totalRatio * scaledRatio;if (totalRatio > 4 * initRatio) {totalRatio = 4 * initRatio;} else if (totalRatio < initRatio) {totalRatio = initRatio;}// 調用onDraw()方法繪制圖片invalidate();lastFingerDis = fingerDis;}}break;case MotionEvent.ACTION_POINTER_UP:if (event.getPointerCount() == 2) {// 手指離開屏幕時將臨時值還原lastXMove = -1;lastYMove = -1;}break;case MotionEvent.ACTION_UP:// 手指離開屏幕時將臨時值還原lastXMove = -1;lastYMove = -1;break;default:break;}return true;}/*** 根據currentStatus的值來決定對圖片進行什么樣的繪制操作。*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);switch (currentStatus) {case STATUS_ZOOM_OUT:case STATUS_ZOOM_IN:zoom(canvas);break;case STATUS_MOVE:move(canvas);break;case STATUS_INIT:initBitmap(canvas);default:if (sourceBitmap != null) {canvas.drawBitmap(sourceBitmap, matrix, null);}break;}}/*** 對圖片進行縮放處理。* * @param canvas*/private void zoom(Canvas canvas) {matrix.reset();// 將圖片按總縮放比例進行縮放matrix.postScale(totalRatio, totalRatio);float scaledWidth = sourceBitmap.getWidth() * totalRatio;float scaledHeight = sourceBitmap.getHeight() * totalRatio;float translateX = 0f;float translateY = 0f;// 如果當前圖片寬度小于屏幕寬度,則按屏幕中心的橫坐標進行水平縮放。否則按兩指的中心點的橫坐標進行水平縮放if (currentBitmapWidth < width) {translateX = (width - scaledWidth) / 2f;} else {translateX = totalTranslateX * scaledRatio + centerPointX* (1 - scaledRatio);// 進行邊界檢查,保證圖片縮放后在水平方向上不會偏移出屏幕if (translateX > 0) {translateX = 0;} else if (width - translateX > scaledWidth) {translateX = width - scaledWidth;}}// 如果當前圖片高度小于屏幕高度,則按屏幕中心的縱坐標進行垂直縮放。否則按兩指的中心點的縱坐標進行垂直縮放if (currentBitmapHeight < height) {translateY = (height - scaledHeight) / 2f;} else {translateY = totalTranslateY * scaledRatio + centerPointY* (1 - scaledRatio);// 進行邊界檢查,保證圖片縮放后在垂直方向上不會偏移出屏幕if (translateY > 0) {translateY = 0;} else if (height - translateY > scaledHeight) {translateY = height - scaledHeight;}}// 縮放后對圖片進行偏移,以保證縮放后中心點位置不變matrix.postTranslate(translateX, translateY);totalTranslateX = translateX;totalTranslateY = translateY;currentBitmapWidth = scaledWidth;currentBitmapHeight = scaledHeight;canvas.drawBitmap(sourceBitmap, matrix, null);}/*** 對圖片進行平移處理* * @param canvas*/private void move(Canvas canvas) {matrix.reset();// 根據手指移動的距離計算出總偏移值float translateX = totalTranslateX + movedDistanceX;float translateY = totalTranslateY + movedDistanceY;// 先按照已有的縮放比例對圖片進行縮放matrix.postScale(totalRatio, totalRatio);// 再根據移動距離進行偏移matrix.postTranslate(translateX, translateY);totalTranslateX = translateX;totalTranslateY = translateY;canvas.drawBitmap(sourceBitmap, matrix, null);}/*** 對圖片進行初始化操作,包括讓圖片居中,以及當圖片大于屏幕寬高時對圖片進行壓縮。* * @param canvas*/private void initBitmap(Canvas canvas) {if (sourceBitmap != null) {matrix.reset();int bitmapWidth = sourceBitmap.getWidth();int bitmapHeight = sourceBitmap.getHeight();if (bitmapWidth > width || bitmapHeight > height) {if (bitmapWidth - width > bitmapHeight - height) {// 當圖片寬度大于屏幕寬度時,將圖片等比例壓縮,使它可以完全顯示出來float ratio = width / (bitmapWidth * 1.0f);matrix.postScale(ratio, ratio);float translateY = (height - (bitmapHeight * ratio)) / 2f;// 在縱坐標方向上進行偏移,以保證圖片居中顯示matrix.postTranslate(0, translateY);totalTranslateY = translateY;totalRatio = initRatio = ratio;} else {// 當圖片高度大于屏幕高度時,將圖片等比例壓縮,使它可以完全顯示出來float ratio = height / (bitmapHeight * 1.0f);matrix.postScale(ratio, ratio);float translateX = (width - (bitmapWidth * ratio)) / 2f;// 在橫坐標方向上進行偏移,以保證圖片居中顯示matrix.postTranslate(translateX, 0);totalTranslateX = translateX;totalRatio = initRatio = ratio;}currentBitmapWidth = bitmapWidth * initRatio;currentBitmapHeight = bitmapHeight * initRatio;} else {// 當圖片的寬高都小于屏幕寬高時,直接讓圖片居中顯示float translateX = (width - sourceBitmap.getWidth()) / 2f;float translateY = (height - sourceBitmap.getHeight()) / 2f;matrix.postTranslate(translateX, translateY);totalTranslateX = translateX;totalTranslateY = translateY;totalRatio = initRatio = 1f;currentBitmapWidth = bitmapWidth;currentBitmapHeight = bitmapHeight;}canvas.drawBitmap(sourceBitmap, matrix, null);}}/*** 計算兩個手指之間的距離。* * @param event* @return 兩個手指之間的距離*/@SuppressLint("NewApi") private double distanceBetweenFingers(MotionEvent event) {float disX = Math.abs(event.getX(0) - event.getX(1));float disY = Math.abs(event.getY(0) - event.getY(1));return Math.sqrt(disX * disX + disY * disY);}/*** 計算兩個手指之間中心點的坐標。* * @param event*/@SuppressLint("NewApi") private void centerPointBetweenFingers(MotionEvent event) {float xPoint0 = event.getX(0);float yPoint0 = event.getY(0);float xPoint1 = event.getX(1);float yPoint1 = event.getY(1);centerPointX = (xPoint0 + xPoint1) / 2;centerPointY = (yPoint0 + yPoint1) / 2;}}

布局中調用

以上所述是小編給大家介紹的Android通過自定義ImageView控件實現(xiàn)圖片的縮放和拖動的實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久国产精品免费一区| 成年人在线播放| 国产尤物一区二区在线| 免费99视频| caoporn超碰国产公开| 久久久精品国产sm调教| 91这里只有精品| 欧美多人爱爱视频网站| 欧美18 19xxx| 日韩三级免费| www.污污视频| 91精品综合久久久久久五月天| 欧美人与动性xxxxx杂性| 伊人亚洲福利一区二区三区| 一区二区不卡在线观看| 精品视频一区二区观看| a在线观看网站| 国产秀色在线www免费观看| 成人亚洲欧美| 欧美激情在线免费观看| 精品国模一区二区三区欧美| 精品无码久久久久| 国产在线观看91一区二区三区| 亚洲一级一级97网| 亚洲精品一区二区三区在线| 污视频网站免费在线观看| 日韩中文欧美| 成人欧美一区二区三区1314| 国产伦精品一区二区三| 九色porny91| 久久中文视频| 国产麻豆电影在线观看| 97精品国产福利一区二区三区| 日韩午夜高潮| 成人免费毛片视频| 精品国产3级a| 成人三级黄色免费网站| 久本草在线中文字幕亚洲| 欧美久久久久免费| 91视频免费进入| 亚洲精品一区二区三区影院| 亚洲福利精品在线| 亚洲一区二区三区香蕉| 91麻豆精品国产91| 中文字幕无乱码| 国产99久久精品一区二区永久免费| 美腿丝袜在线亚洲一区| 日韩成人精品视频在线观看| 亚洲精品成人无码| 免费亚洲婷婷| 日韩aaaaaa| 欧美大胆人体bbbb| 国产午夜无码视频在线观看| 娇小11一12╳yⅹ╳毛片| 美女网站免费观看| 800av在线播放| 国产精品无码av无码| 天天综合网天天做天天受| 精品久久久久久中文字幕2017| 亚洲男人天天操| 精品乱色一区二区中文字幕| 亚洲精品视频91| 影音av在线| 精品亚洲一区二区三区在线观看| 7777久久亚洲中文字幕| mm视频在线视频| 欧美日韩亚洲一二三| 麻豆精品一区| 亚洲一区二区三区在线播放| 日韩av一区二区三区四区| 成年丰满熟妇午夜免费视频| 日本中文字幕网| 欧美人动性xxxxz0oz| 亚洲国产一区二区在线观看| abab456成人免费网址| 色乱码一区二区三区熟女| yellow在线观看网址| 欧美精品hd| 91久久精品午夜一区二区| 亚洲国产精品美女| 久久综合亚洲精品| av噜噜在线观看| 日本三级很黄试看120秒| 国产高清免费av| www日本在线观看| 毛片av一区二区| av免费观看久久| 一个人看的www视频免费观看| 制服师生第一页| 久久精品一区| 亚洲精品97久久久babes| 国产性生活网站| 国产aⅴ精品一区二区三区黄| 精品国产亚洲一区二区在线观看| 日本一区二区三区在线免费观看| 2012中文字幕在线视频| 捆绑变态av一区二区三区| 国产精品久久久久久久免费大片| 亚洲综合色噜噜狠狠| 欧美一区二区久久| 热久久免费国产视频| 亚洲国产色一区| 国产激情视频在线看| 亚洲五月婷婷| 欧美日韩一二三区| 亚洲成av人乱码色午夜| 亚洲狼人国产精品| 精品999视频| 丁香婷婷在线观看| 久久久久久久久久久久网站| 国产精品69av| 日韩一区亚洲二区| 91在线国内视频| 日韩中文在线中文网三级| 哺乳挤奶一区二区三区免费看| 欧美天天综合色影久久精品| 日韩欧美一区中文| 日韩欧美国产激情| 天天撸天天射| 亚洲av无码乱码国产麻豆| 99在线观看免费| 日韩免费高清在线观看| 国产精品一区二区中文字幕| 91黄色小网站| 天天舔天天干天天操| 国产精品国产三级国产aⅴ无密码| 在线观看久久久久久| 国产精品综合视频| 天堂а√在线最新版中文在线| 日本一本在线视频| 日本毛片在线免费观看| 国偷自产av一区二区三区麻豆| 三上悠亚在线资源| 亚洲高清影视| 黄网站在线观| 91福利免费视频| av不卡免费在线观看| 91精品视频免费在线观看| 性亚洲最疯狂xxxx高清| 欧美日韩性生活视频| 亚洲高清视频在线观看| 国产精品嫩草视频| 蜜桃视频在线观看网站| 日本高清视频免费在线观看| 先锋影音av资源在线| 激情福利在线| 国内av一区二区| 亚洲36d大奶网| 亚洲成人精品一区| 日日碰狠狠丁香久燥| 久久久久久久久亚洲精品| 免费网站www在线观看| 国产综合动作在线观看| 亚洲欧美中文日韩在线v日本| 国产秀色在线www免费观看| 精品少妇在线视频| 极品美妇后花庭翘臀娇吟小说| 国内精品久久久久久久果冻传媒| 中文人妻av久久人妻18| 黄色污污在线观看| 国产欧美最新羞羞视频在线观看| 香蒸焦蕉伊在线| 亚洲熟妇无码av在线播放| 欧美乱人伦中文字幕在线| 欧美肥妇bbwbbw| 羞羞视频网站在线观看| 日韩一区二区三区免费观看| 亚洲国产最新| 性欧美18一19性猛交| 91精品国自产在线观看| 中文字幕av专区| 一级女性全黄久久生活片免费| 欧美亚洲动漫另类| 精品日韩美女的视频高清| 亚洲一级片在线看| 午夜日韩av| 女人18毛片一区二区三区| 日本一区二区在线免费观看| 欧美日韩一区在线视频| 伊人久久av导航| 欧美r级在线观看| 24小时免费看片在线观看| 久久久99精品| 日韩亚洲欧美在线| 国产成人精品福利一区二区三区| 看片一区二区| 亚洲三区在线观看| 欧美一区二区三区在线播放| 亚洲欧美日韩精品久久久| 91香蕉国产在线观看软件| 阿v天堂2018| 天天插天天色| 精品在线观看一区二区| 亚洲色图图片区| 麻豆影院在线| 国语自产精品视频在线看| 91网在线免费观看| 久久午夜视频| 51xx午夜影福利| 久久艹中文字幕| 久草中文综合在线| 亚洲成人影院少妇| 国产77777| 天堂在线视频| 美女一区二区在线观看| 日韩一区二区在线免费| 在线免费观看高清视频| 91精品中文字幕一区二区三区| 精品一区二区三区在线播放| 欧美一级视频免费| 国产精品久久久久久久久久免费| 欧美一级黄色录像| 国产一区二区久久| dy888亚洲精品一区二区三区| 天天影视久久综合| 五十路亲子中出中文字幕| 亚洲一区国产视频| 欧美乱大交xxxxx| 少妇大叫太大太粗太爽了a片小说| 日产精品久久久久久久性色| 国内在线高清免费视频| 在线一区二区日韩| 亚洲国内在线| 成年女人的天堂在线| 亚洲国产电影在线观看| 色系网站成人免费| 欧美精品精品一区| www污网站在线观看| a一级免费视频| 视频小说一区二区| 欧美男男同志| 欧美熟乱15p| 香港三级经典全部种子下载| 久久综合国产精品| 激情综合亚洲| 毛片aaaaa| 精品一区二区三区三区| 亚洲综合伊人| 欧美亚洲成人免费| 九一在线视频| 国产精品福利无圣光在线一区| 欧美精品xxxxbbbb| 国产99久久久| 亚洲人成电影在线观看网| 一区2区3区在线看| 天天插天天狠天天透| 91久久精品国产91久久性色| 青青在线视频免费| 在线播放欧美女士性生活| 国内精品国产成人| 亚洲永久精品在线观看| 国产精品www爽爽爽| 成人51免费| 超碰人人草人人| 国产一区二区三区四区五区传媒| 亚洲少妇自拍| www.色偷偷.com| 师生出轨h灌满了1v1| 欧美一区在线直播| 人妻少妇精品无码专区二区| 涩涩视频在线| 91精品国产综合久久久久久丝袜| 国产精品伊人日日| 久久成人免费日本黄色| 久久久久久有精品国产| 日本不卡高清视频一区| 色噜噜狠狠永久免费| 狂野欧美xxxx韩国少妇| 精品黑人一区二区三区久久| 97免费高清电视剧观看| 手机看片1024国产| 免费看欧美美女黄的网站| 美女把腿扒开让男人桶免费| 一本色道婷婷久久欧美| 在线观看成人网| 热99这里只有精品| 国产精品2区| 日皮视频在线免费观看| 欧美日韩视频第一区| 成人性生交大片免费看中文网站| 日本aⅴ精品一区二区三区| 91精品国产色综合久久ai换脸| av大全在线| 91传媒视频免费| 国产成人精品一区二区无码呦| 久久亚洲一区二区| 26uuu另类亚洲欧美日本老年| 亚洲在线成人精品| 国内精品国产成人国产三级| 天天色天天操综合| 久久超碰97人人做人人爱| 中文字幕avav| yourporn在线观看视频| 久久久久国产免费| 中文字幕在线一区免费| 欧美激情亚洲综合一区| 浴室偷拍美女洗澡456在线| 免费福利片在线观看| 婷婷久久综合九色国产成人| 国产精品精品软件男同| 日本午夜精品| 欧美精品久久久久久久小说| 国产麻豆免费视频| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 日韩免费av| 桃花岛tv亚洲品质| 在线视频一区二区免费| √天堂资源在线| 综合欧美亚洲| 欧美视频1区| а√最新版天堂中文在线| 久久久久久99久久久精品网站| 亚洲va在线va天堂va偷拍| 在线永久免费观看黄网站| 欧美日韩在线播放三区| 国产精品无码久久久久成人app| 阿v视频在线观看| 欧美精品videos| 在线碰免费视频在线观看| 欧美精品日韩www.p站| 欧美性一级生活| 亚洲一二三区av| 伊人伊成久久人综合网站| 欧美乱妇23p| 亚洲综合色站| 欧美网站免费观看| 久久精品久久精品久久| 中文字幕一区2区3区|