国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

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

2019-10-23 20:08:52
字體:
供稿:網(wǎng)友

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

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

布局中調(diào)用

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
激情六月丁香| 性国产高清在线观看| 欧美韩日国产| sese在线视频| 国产永久免费高清在线观看| 国产免费av网站| 最新av免费看| 在线黄色国产电影| 精品国产免费第一区二区| 伊人春色在线| 黄色国产网站在线观看| 国产秀色在线www免费观看| 97视频网站| 国产麻豆高清视频在线第一页| 综合图区亚洲白拍在线| 91精品专区| 天天av天天爽| 欧美日韩性视频一区二区三区| 久精品在线观看| 在线观看的av网站| 国产精品合集一区二区| 高清av在线| 人人在线视频| 国产激情在线视频| 欧美日韩不卡中文字幕在线| 国产激情网址| 综合图区亚洲白拍在线| free性亚洲| 精品电影在线| 国产叼嘿网站免费观看不用充会员| www.操操操.com| 伊人222成人综合网| 丁香视频免费观看| 天天操中文字幕视频| 国产福利免费观看| 尤物视频在线免费观看| 久久精品无码一区二区日韩av| 91午夜视频| 国产在线观看a| 麻豆网站在线免费观看| 午夜在线视频| 日本三级视频网站| www.麻豆av.com| 在线播放www| 在线国产一级| 四虎成人免费观看在线网址| 中文乱码字幕av网站| 精品成人一区二区三区免费视频| 国产视频一二区| 国产videos| 在线观看的网站你懂的| 国产xxx在线| 伊人免费视频| 在线国产一级| 碰草在线视频| 国产在线视频福利| 国产一区二区三区不卡在线| 国产三级在线播放| 伊人网在线观看| www.操操操.com| 国产免费福利网站| 国产福利av网站| 欧美色欧美亚洲另类二区精品| 久久久久久久久免费视频| 国产中文第一页| 中文字幕不卡免费视频| 伊人222成人综合网| 国产在线看片| 国产精品视频福利一区二区| 99精品老司机免费视频| 九色自拍视频| 影音先锋在线中文字幕| 免费视频中文字幕| 2019中文字幕视频| 福利资源在线久| 亚洲成a人v欧美综合天堂麻豆| 国产永久免费| 日本免费视频www| 国产激情在线| 国产在线视频网站| 伊人影院蕉久影院在线播放| 久久国产情侣| 99久热re在线精彩视频| 久蕉依人在线视频| 在线观看免费观看在线91| 国内a∨免费播放| 亚洲成人在线播放| 国产黄视频网站| 国产视频在线播放| 最近中文字幕mv免费高清视频8| 在线黄色国产电影| 国产99在线|亚洲| 国产网站av| 国产视频福利| 国产一级黄色片免费| 国产原创av在线| 国产精品一区二区三区高清在线| 免费国产在线视频| 7777在线| 97高清视频| 99久热re在线精彩视频| 国产欧美在线观看视频| 综合激情亚洲| 国产一区二区在线|播放| 国产字幕在线看| 国产主播福利在线| 国产免费视频在线| 国产精品一卡二卡三卡| 国产嫩草在线视频| 成网站在线观看人免费| 国产美女一区视频| 国产女主播在线| 91麻豆免费在线视频| 国产精品视频一区二区久久| 国产精品18久久久久网站| 国产激情视频网址| 中文天堂av| 久热免费在线视频| 国产麻豆精品视频一区二区| 国产一区二区三区不卡免费观看| 黄网址在线播放免费| 国产午夜在线| 精品一区二区三区在线成人| 四虎成人欧美精品在永久在线| 亚洲电影视频在线| 99热在线免费播放| 国产福利在线观看| 免费久久网站| 中文字幕视频在线免费| 精品国产美女福利到在线不卡| 亚洲成a人v欧美综合天堂麻豆| www在线视频| 国产福利在线| 大香伊人中文字幕精品| 伊人免费视频| 国产精品日日爱| 九九精品九九| 日本韩国精品一区二区| 国产高清大尺度一区二区不卡| 日本h视频在线观看| 97高清视频| 中文字幕在线观看播放| 天天插天天干| 国产精品区一区二| 国产麻豆免费| 国产在线观看a视频| 任你操视频在线观看| 99色在线观看| 在线伊人免费视频| 国产福利视频在线观看| 国产在线观看a| 欧美96在线| www.大网伊人| jlzzjlzz欧美| 亚洲videos| 日本福利在线| 日本在线天堂| 色悠久久久久综合网小说| 国产超碰在线| 精品伦理一区二区| 国产精品入口免费麻豆| 中文字幕国产在线| 国产精品欧美韩国日本久久| 国产另类图片| 中文字幕日本在线| 国产视频中文字幕在线观看| 国产午夜在线观看| 91极品在线| av影视在线看| 国产中文字幕在线看| 国产在线高清| 国产欧美在线观看视频| 国产精品va在线观看视色| 国产黄色小视频| 99中文字幕一区| 日本免费黄色| 天堂资源在线中文| 91麻豆精品国产91久久| 亚洲国产aⅴ精品| 丁香婷婷在线| 国产98在线| eeuss在线观看| 天堂资源中文在线| 国产不卡精品一区二区三区| 亚洲欧美精选| 国产午夜在线视频| 亚洲妇熟xxxx妇色黄| 国产真实伦在线观看| 国产网站在线免费观看| 91在线高清| 成人无遮挡免费网站视频在线观看| 国产美女视频网站| 在线免费看黄| 国产精品探花在线| 天天干天天摸| 国产二级c片l毛片| 91福利在线免费| av在线免费播放网站| 日本中文字幕在线播放| 亚洲www色|