android多点触控自由对图片缩放
生活随笔
收集整理的這篇文章主要介紹了
android多点触控自由对图片缩放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在系統的相冊中,觀看相片就可以用多個手指進行縮放.要實現這個功能,只需要這幾步:
1.新建項目,在項目中新建一個ZoomImage.java public?class?ZoomImageView?extends?View?{ ????//初始化狀態常量 ????public?static?final?int?STATUS_INIT=1; ????//圖片放大狀態常量 ????public?static?final?int?STATUS_ZOOM_OUT=2; ????//圖片縮小狀態常量 ????public?static?final?int?STATUS_ZOOM_IN=3; ????//圖片拖動狀態的常量 ????public?static?final?int?STATUS_MOVE=4; ????//對圖片進行移動和縮放的矩陣 ????private?Matrix?matrix=new?Matrix(); ????//需要處理的Bitmap對象 ????private?Bitmap?sourceBitmap; ????//記錄當前的操作狀態 ????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?moveDistanceX; ????//記錄手指在縱坐標上的距離 ????private?float?moveDistanceY; ???? ????//記錄圖片在矩陣上橫向偏移值 ????private?float?totalTranslateX; ????//記錄圖片在矩陣上縱向偏移值 ????private?float?totalTranslateY; ???? ????//記錄圖片在矩陣上總縮放比例 ????private?float?totalRatio; ???? ????//記錄手指移動的距離造成的縮放比例 ????private?float?scaledRatio; ???? ????//記錄圖片初始化時的縮放比例 ????private?float?initRatio; ???? ????//記錄上次手指之間的距離 ????private?double?lastFingerDis; ???? ????//初始狀態??設置當前操作狀態為STATUS_INIT ????public?ZoomImageView(Context?context,?AttributeSet?attrs)?{ ????????super(context,?attrs); ????????currentStatus=STATUS_INIT; ????} ????//將待展示的圖片設置進來 ????public?void?setImageBitmap(Bitmap?bitmap){ ????????sourceBitmap=bitmap; ????????invalidate(); ????} ????@Override ????protected?void?onLayout(boolean?changed,?int?left,?int?top,?int?right, ????????????int?bottom)?{ ????????super.onLayout(changed,?left,?top,?right,?bottom); ????????if(changed){ ????????????width=getWidth(); ????????????height=getHeight(); ????????} ????} ???? ????@Override ????public?boolean?onTouchEvent(MotionEvent?event)?{ ????????switch?(event.getActionMasked())?{ ????????case?MotionEvent.ACTION_POINTER_DOWN: ????????????if(event.getPointerCount()==2){ ????????????????lastFingerDis=distanceBetweenFingers(event);??//兩指間按下的距離 ????????????} ????????????break; ????????case?MotionEvent.ACTION_MOVE: ????????????if(event.getPointerCount()==1){??//如果只有一個手指在屏幕上?則為拖動模式 ????????????????float?xMove=event.getX(); ????????????????float?yMove=event.getY(); ????????????????if(lastXMove==-1&&lastYMove==-1){ ????????????????????lastXMove=xMove; ????????????????????lastYMove=yMove; ????????????????} ????????????????currentStatus=STATUS_MOVE; ????????????????moveDistanceX=xMove-lastXMove; ????????????????moveDistanceY=yMove-lastYMove; ????????????????//進行邊界檢查?不允許拖出邊界 ????????????????if(totalTranslateX+moveDistanceX>0){ ????????????????????moveDistanceX=0; ????????????????} ????????????????else?if(width-(totalTranslateX+moveDistanceX)>currentBitmapWidth){ ????????????????????moveDistanceX=0; ????????????????} ????????????????if(totalTranslateY+moveDistanceY>0){ ????????????????????moveDistanceY=0; ????????????????} ????????????????else?if(height-(totalTranslateY+moveDistanceY)>currentBitmapHeight){ ????????????????????moveDistanceY=0; ????????????????} ???????????????? ????????????????//調用onDraw()方法繪制圖片 ????????????????invalidate(); ????????????????lastXMove=xMove; ????????????????lastYMove=yMove; ????????????} ????????????else?if(event.getPointerCount()==2){ ????????????????//有兩個手指在屏幕上移動??為縮放狀態 ????????????????centerPointBetweenFingers(event); ????????????????double?fingerDis=distanceBetweenFingers(event); ????????????????if(fingerDis>lastFingerDis){ ????????????????????currentStatus=STATUS_ZOOM_OUT; ????????????????} ????????????????else{ ????????????????????currentStatus=STATUS_ZOOM_IN; ????????????????} ????????????????//進行縮放倍數檢查 ????????????????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; ????} ???? ????@Override ????protected?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); ????????????break; ????????default: ????????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????????????break; ????????} ????} ???? ????//初始化顯示圖片 ????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?radio=width/(bitmapWidth*1.0f);?????//需要壓縮的比例?? ????????????????????matrix.postScale(radio,radio);?????????????//縮放矩陣比例 ????????????????????float?translateY=(height-(bitmapHeight*radio))/2f;???//因為是按寬度進行壓縮??所以寬度應該是占滿全屏??這時候還應該將圖片Y軸向下移動 ????????????????????//在縱坐標上進行偏移?以保證圖片居中顯示 ????????????????????matrix.postTranslate(0,?translateY); ????????????????????totalTranslateY=translateY; ????????????????????totalRatio=initRatio=radio; ????????????????} ????????????????else{ ????????????????????//當圖片高度大于屏幕高度時 ????????????????????float?radio=height/(bitmapHeight*1.0f); ????????????????????matrix.postScale(radio,?radio); ????????????????????float?translateX=(width-(bitmapWidth*radio))/2f; ????????????????????//在橫坐標上進行偏移? ????????????????????matrix.postTranslate(translateX,?0);//平移 ????????????????????totalTranslateX=translateX; ????????????????????totalRatio=initRatio=radio; ????????????????} ????????????} ????????????else{ ????????????????//當圖片的寬度與高度都小于屏幕寬高時,讓圖片居中顯示 ????????????????float?translateX=(width-sourceBitmap.getWidth())/2f; ????????????????float?translateY=(height-sourceBitmap.getHeight())/2f; ????????????????matrix.postTranslate(translateX,?translateY); ????????????????totalTranslateX=translateX; ????????????????totalTranslateY=translateY; ????????????????totalRatio=initRatio=1f; ????????????????currentBitmapHeight=bitmapHeight; ????????????????currentBitmapWidth=bitmapWidth; ????????????} ????????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????????} ????} ???? ????//對圖片進行縮放處理 ????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); ????} ???? ????//對圖片進行平移處理 ????private?void?move(Canvas?canvas){ ????????matrix.reset(); ????????//根據手指移動的距離計算總偏移量 ????????float?translateX=totalTranslateX+moveDistanceX; ????????float?translateY=totalTranslateY+moveDistanceY; ????????//按照已有的縮放比例對圖片縮放 ????????matrix.postScale(totalRatio,?totalRatio); ????????//根據移動距離進行偏移 ????????matrix.postTranslate(translateX,?translateY); ????????totalTranslateX=translateX; ????????totalTranslateY=translateY; ????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????} ???? ????//計算兩個手指的距離 ????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);??? ????} ????//計算兩個手指之間中心點的坐標 ????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; ????} }
2.打開activity_main.xml <com.example.bitmaptest.ZoomImageView?xmlns:android="http://schemas.android.com/apk/res/android" ????xmlns:tools="http://schemas.android.com/tools" ????android:layout_width="match_parent" ????android:layout_height="match_parent" ????android:id="@+id/zoom_image" ????tools:context="com.example.bitmaptest.MainActivity"?> ???? </com.example.bitmaptest.ZoomImageView>??
3.打開MainActivity.java public?class?MainActivity?extends?ActionBarActivity?{ ????private?Bitmap?bitmap; ????@Override ????protected?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.activity_main); ????????ZoomImageView?zoomImage=(ZoomImageView)?findViewById(R.id.zoom_image); ????????bitmap=BitmapFactory.decodeResource(getResources(),?R.drawable.ic_launcher); ????????if(bitmap!=null){ ????????????zoomImage.setImageBitmap(bitmap); ????????} ????} }??
來自為知筆記(Wiz)
1.新建項目,在項目中新建一個ZoomImage.java public?class?ZoomImageView?extends?View?{ ????//初始化狀態常量 ????public?static?final?int?STATUS_INIT=1; ????//圖片放大狀態常量 ????public?static?final?int?STATUS_ZOOM_OUT=2; ????//圖片縮小狀態常量 ????public?static?final?int?STATUS_ZOOM_IN=3; ????//圖片拖動狀態的常量 ????public?static?final?int?STATUS_MOVE=4; ????//對圖片進行移動和縮放的矩陣 ????private?Matrix?matrix=new?Matrix(); ????//需要處理的Bitmap對象 ????private?Bitmap?sourceBitmap; ????//記錄當前的操作狀態 ????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?moveDistanceX; ????//記錄手指在縱坐標上的距離 ????private?float?moveDistanceY; ???? ????//記錄圖片在矩陣上橫向偏移值 ????private?float?totalTranslateX; ????//記錄圖片在矩陣上縱向偏移值 ????private?float?totalTranslateY; ???? ????//記錄圖片在矩陣上總縮放比例 ????private?float?totalRatio; ???? ????//記錄手指移動的距離造成的縮放比例 ????private?float?scaledRatio; ???? ????//記錄圖片初始化時的縮放比例 ????private?float?initRatio; ???? ????//記錄上次手指之間的距離 ????private?double?lastFingerDis; ???? ????//初始狀態??設置當前操作狀態為STATUS_INIT ????public?ZoomImageView(Context?context,?AttributeSet?attrs)?{ ????????super(context,?attrs); ????????currentStatus=STATUS_INIT; ????} ????//將待展示的圖片設置進來 ????public?void?setImageBitmap(Bitmap?bitmap){ ????????sourceBitmap=bitmap; ????????invalidate(); ????} ????@Override ????protected?void?onLayout(boolean?changed,?int?left,?int?top,?int?right, ????????????int?bottom)?{ ????????super.onLayout(changed,?left,?top,?right,?bottom); ????????if(changed){ ????????????width=getWidth(); ????????????height=getHeight(); ????????} ????} ???? ????@Override ????public?boolean?onTouchEvent(MotionEvent?event)?{ ????????switch?(event.getActionMasked())?{ ????????case?MotionEvent.ACTION_POINTER_DOWN: ????????????if(event.getPointerCount()==2){ ????????????????lastFingerDis=distanceBetweenFingers(event);??//兩指間按下的距離 ????????????} ????????????break; ????????case?MotionEvent.ACTION_MOVE: ????????????if(event.getPointerCount()==1){??//如果只有一個手指在屏幕上?則為拖動模式 ????????????????float?xMove=event.getX(); ????????????????float?yMove=event.getY(); ????????????????if(lastXMove==-1&&lastYMove==-1){ ????????????????????lastXMove=xMove; ????????????????????lastYMove=yMove; ????????????????} ????????????????currentStatus=STATUS_MOVE; ????????????????moveDistanceX=xMove-lastXMove; ????????????????moveDistanceY=yMove-lastYMove; ????????????????//進行邊界檢查?不允許拖出邊界 ????????????????if(totalTranslateX+moveDistanceX>0){ ????????????????????moveDistanceX=0; ????????????????} ????????????????else?if(width-(totalTranslateX+moveDistanceX)>currentBitmapWidth){ ????????????????????moveDistanceX=0; ????????????????} ????????????????if(totalTranslateY+moveDistanceY>0){ ????????????????????moveDistanceY=0; ????????????????} ????????????????else?if(height-(totalTranslateY+moveDistanceY)>currentBitmapHeight){ ????????????????????moveDistanceY=0; ????????????????} ???????????????? ????????????????//調用onDraw()方法繪制圖片 ????????????????invalidate(); ????????????????lastXMove=xMove; ????????????????lastYMove=yMove; ????????????} ????????????else?if(event.getPointerCount()==2){ ????????????????//有兩個手指在屏幕上移動??為縮放狀態 ????????????????centerPointBetweenFingers(event); ????????????????double?fingerDis=distanceBetweenFingers(event); ????????????????if(fingerDis>lastFingerDis){ ????????????????????currentStatus=STATUS_ZOOM_OUT; ????????????????} ????????????????else{ ????????????????????currentStatus=STATUS_ZOOM_IN; ????????????????} ????????????????//進行縮放倍數檢查 ????????????????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; ????} ???? ????@Override ????protected?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); ????????????break; ????????default: ????????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????????????break; ????????} ????} ???? ????//初始化顯示圖片 ????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?radio=width/(bitmapWidth*1.0f);?????//需要壓縮的比例?? ????????????????????matrix.postScale(radio,radio);?????????????//縮放矩陣比例 ????????????????????float?translateY=(height-(bitmapHeight*radio))/2f;???//因為是按寬度進行壓縮??所以寬度應該是占滿全屏??這時候還應該將圖片Y軸向下移動 ????????????????????//在縱坐標上進行偏移?以保證圖片居中顯示 ????????????????????matrix.postTranslate(0,?translateY); ????????????????????totalTranslateY=translateY; ????????????????????totalRatio=initRatio=radio; ????????????????} ????????????????else{ ????????????????????//當圖片高度大于屏幕高度時 ????????????????????float?radio=height/(bitmapHeight*1.0f); ????????????????????matrix.postScale(radio,?radio); ????????????????????float?translateX=(width-(bitmapWidth*radio))/2f; ????????????????????//在橫坐標上進行偏移? ????????????????????matrix.postTranslate(translateX,?0);//平移 ????????????????????totalTranslateX=translateX; ????????????????????totalRatio=initRatio=radio; ????????????????} ????????????} ????????????else{ ????????????????//當圖片的寬度與高度都小于屏幕寬高時,讓圖片居中顯示 ????????????????float?translateX=(width-sourceBitmap.getWidth())/2f; ????????????????float?translateY=(height-sourceBitmap.getHeight())/2f; ????????????????matrix.postTranslate(translateX,?translateY); ????????????????totalTranslateX=translateX; ????????????????totalTranslateY=translateY; ????????????????totalRatio=initRatio=1f; ????????????????currentBitmapHeight=bitmapHeight; ????????????????currentBitmapWidth=bitmapWidth; ????????????} ????????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????????} ????} ???? ????//對圖片進行縮放處理 ????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); ????} ???? ????//對圖片進行平移處理 ????private?void?move(Canvas?canvas){ ????????matrix.reset(); ????????//根據手指移動的距離計算總偏移量 ????????float?translateX=totalTranslateX+moveDistanceX; ????????float?translateY=totalTranslateY+moveDistanceY; ????????//按照已有的縮放比例對圖片縮放 ????????matrix.postScale(totalRatio,?totalRatio); ????????//根據移動距離進行偏移 ????????matrix.postTranslate(translateX,?translateY); ????????totalTranslateX=translateX; ????????totalTranslateY=translateY; ????????canvas.drawBitmap(sourceBitmap,?matrix,?null); ????} ???? ????//計算兩個手指的距離 ????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);??? ????} ????//計算兩個手指之間中心點的坐標 ????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; ????} }
2.打開activity_main.xml <com.example.bitmaptest.ZoomImageView?xmlns:android="http://schemas.android.com/apk/res/android" ????xmlns:tools="http://schemas.android.com/tools" ????android:layout_width="match_parent" ????android:layout_height="match_parent" ????android:id="@+id/zoom_image" ????tools:context="com.example.bitmaptest.MainActivity"?> ???? </com.example.bitmaptest.ZoomImageView>??
3.打開MainActivity.java public?class?MainActivity?extends?ActionBarActivity?{ ????private?Bitmap?bitmap; ????@Override ????protected?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.activity_main); ????????ZoomImageView?zoomImage=(ZoomImageView)?findViewById(R.id.zoom_image); ????????bitmap=BitmapFactory.decodeResource(getResources(),?R.drawable.ic_launcher); ????????if(bitmap!=null){ ????????????zoomImage.setImageBitmap(bitmap); ????????} ????} }??
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/aibuli/p/76d1cd14cb1dcf018198fba314bb3509.html
總結
以上是生活随笔為你收集整理的android多点触控自由对图片缩放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net中两款文本编辑器NicEd
- 下一篇: Android学习笔记——Menu(二)