? ? ? ? 該模塊主要實現了放大和原大兩個級別的縮放。
另外功能更加強大的一個類見本人另一篇博客
http://blog.csdn.net/gfg156196/article/details/49741233#reply
?功能有:
以觸摸點為中心放大(這個是網上其他的代碼沒有的)邊界控制(這個是網上其他的代碼沒有的)雙擊放大或縮小(主要考慮到電阻屏)多點觸摸放大和縮小
??????? 這個模塊已經通過了測試,并且用戶也使用有一段時間了,是屬于比較穩定的了。
下面貼上代碼及使用方法(沒有寫測試項目,大家見諒):
?ImageControl.cs?? 類似一個用戶自定義的ImageView控件。用法將在下面的代碼中貼出。
[java]?view plaincopy
import?android.content.Context;?? import?android.graphics.Bitmap;?? import?android.graphics.Matrix;?? import?android.util.AttributeSet;?? import?android.util.FloatMath;?? import?android.view.MotionEvent;?? import?android.widget.ImageView;?? ?? public?class?ImageControl?extends?ImageView?{?? ????public?ImageControl(Context?context)?{?? ????????super(context);?? ?????????? ????}?? ?? ????public?ImageControl(Context?context,?AttributeSet?attrs)?{?? ????????super(context,?attrs);?? ?????????? ????}?? ?? ????public?ImageControl(Context?context,?AttributeSet?attrs,?int?defStyle)?{?? ????????super(context,?attrs,?defStyle);?? ?????????? ????}?? ?? ?????? ????Matrix?imgMatrix?=?null;??? ?? ????static?final?int?DOUBLE_CLICK_TIME_SPACE?=?300;??? ????static?final?int?DOUBLE_POINT_DISTANCE?=?10;??? ????static?final?int?NONE?=?0;?? ????static?final?int?DRAG?=?1;??? ????static?final?int?ZOOM?=?2;??? ????private?int?mode?=?NONE;??? ?? ????float?bigScale?=?3f;??? ????Boolean?isBig?=?false;??? ????long?lastClickTime?=?0;??? ????float?startDistance;??? ????float?endDistance;??? ?? ????float?topHeight;??? ????Bitmap?primaryBitmap?=?null;?? ?? ????float?contentW;??? ????float?contentH;??? ?? ????float?primaryW;??? ????float?primaryH;??? ?? ????float?scale;??? ????Boolean?isMoveX?=?true;??? ????Boolean?isMoveY?=?true;??? ????float?startX;?? ????float?startY;?? ????float?endX;?? ????float?endY;?? ????float?subX;?? ????float?subY;?? ????float?limitX1;?? ????float?limitX2;?? ????float?limitY1;?? ????float?limitY2;?? ????ICustomMethod?mCustomMethod?=?null;?? ?? ????? ? ? ? ? ? ? ? ? ? ? ?? ????public?void?imageInit(Bitmap?bitmap,?int?contentW,?int?contentH,?? ????????????int?topHeight,?ICustomMethod?iCustomMethod)?{?? ????????this.primaryBitmap?=?bitmap;?? ????????this.contentW?=?contentW;?? ????????this.contentH?=?contentH;?? ????????this.topHeight?=?topHeight;?? ????????mCustomMethod?=?iCustomMethod;?? ????????primaryW?=?primaryBitmap.getWidth();?? ????????primaryH?=?primaryBitmap.getHeight();?? ????????float?scaleX?=?(float)?contentW?/?primaryW;?? ????????float?scaleY?=?(float)?contentH?/?primaryH;?? ????????scale?=?scaleX?<?scaleY???scaleX?:?scaleY;?? ????????if?(scale?<?1?&&?1?/?scale?<?bigScale)?{?? ????????????bigScale?=?(float)?(1?/?scale?+?0.5);?? ????????}?? ?? ????????imgMatrix?=?new?Matrix();?? ????????subX?=?(contentW?-?primaryW?*?scale)?/?2;?? ????????subY?=?(contentH?-?primaryH?*?scale)?/?2;?? ????????this.setImageBitmap(primaryBitmap);?? ????????this.setScaleType(ScaleType.MATRIX);?? ????????imgMatrix.postScale(scale,?scale);?? ????????imgMatrix.postTranslate(subX,?subY);?? ????????this.setImageMatrix(imgMatrix);?? ????}?? ?? ????? ? ? ? ?? ????public?void?mouseDown(MotionEvent?event)?{?? ????????mode?=?NONE;?? ????????startX?=?event.getRawX();?? ????????startY?=?event.getRawY();?? ????????if?(event.getPointerCount()?==?1)?{?? ?????????????? ????????????if?(event.getEventTime()?-?lastClickTime?<?DOUBLE_CLICK_TIME_SPACE)?{?? ????????????????changeSize(startX,?startY);?? ????????????}?else?if?(isBig)?{?? ????????????????mode?=?DRAG;?? ????????????}?? ????????}?? ?? ????????lastClickTime?=?event.getEventTime();?? ????}?? ?? ????? ? ? ? ?? ????public?void?mousePointDown(MotionEvent?event)?{?? ????????startDistance?=?getDistance(event);?? ????????if?(startDistance?>?DOUBLE_POINT_DISTANCE)?{?? ????????????mode?=?ZOOM;?? ????????}?else?{?? ????????????mode?=?NONE;?? ????????}?? ????}?? ?? ????? ? ? ? ?? ????public?void?mouseMove(MotionEvent?event)?{?? ????????if?((mode?==?DRAG)?&&?(isMoveX?||?isMoveY))?{?? ????????????float[]?XY?=?getTranslateXY(imgMatrix);?? ????????????float?transX?=?0;?? ????????????float?transY?=?0;?? ????????????if?(isMoveX)?{?? ????????????????endX?=?event.getRawX();?? ????????????????transX?=?endX?-?startX;?? ????????????????if?((XY[0]?+?transX)?<=?limitX1)?{?? ????????????????????transX?=?limitX1?-?XY[0];?? ????????????????}?? ????????????????if?((XY[0]?+?transX)?>=?limitX2)?{?? ????????????????????transX?=?limitX2?-?XY[0];?? ????????????????}?? ????????????}?? ????????????if?(isMoveY)?{?? ????????????????endY?=?event.getRawY();?? ????????????????transY?=?endY?-?startY;?? ????????????????if?((XY[1]?+?transY)?<=?limitY1)?{?? ????????????????????transY?=?limitY1?-?XY[1];?? ????????????????}?? ????????????????if?((XY[1]?+?transY)?>=?limitY2)?{?? ????????????????????transY?=?limitY2?-?XY[1];?? ????????????????}?? ????????????}?? ?? ????????????imgMatrix.postTranslate(transX,?transY);?? ????????????startX?=?endX;?? ????????????startY?=?endY;?? ????????????this.setImageMatrix(imgMatrix);?? ????????}?else?if?(mode?==?ZOOM?&&?event.getPointerCount()?>?1)?{?? ????????????endDistance?=?getDistance(event);?? ????????????float?dif?=?endDistance?-?startDistance;?? ????????????if?(Math.abs(endDistance?-?startDistance)?>?DOUBLE_POINT_DISTANCE)?{?? ????????????????if?(isBig)?{?? ????????????????????if?(dif?<?0)?{?? ????????????????????????changeSize(0,?0);?? ????????????????????????mode?=?NONE;?? ????????????????????}?? ????????????????}?else?if?(dif?>?0)?{?? ????????????????????float?x?=?event.getX(0)?/?2?+?event.getX(1)?/?2;?? ????????????????????float?y?=?event.getY(0)?/?2?+?event.getY(1)?/?2;?? ????????????????????changeSize(x,?y);?? ????????????????????mode?=?NONE;?? ????????????????}?? ????????????}?? ????????}?? ????}?? ?? ????? ? ?? ????public?void?mouseUp()?{?? ????????mode?=?NONE;?? ????}?? ?? ????? ? ? ? ? ? ? ?? ????private?void?changeSize(float?x,?float?y)?{?? ????????if?(isBig)?{?? ?????????????? ????????????imgMatrix.reset();?? ????????????imgMatrix.postScale(scale,?scale);?? ????????????imgMatrix.postTranslate(subX,?subY);?? ????????????isBig?=?false;?? ????????}?else?{?? ????????????imgMatrix.postScale(bigScale,?bigScale);??? ????????????float?transX?=?-((bigScale?-?1)?*?x);?? ????????????float?transY?=?-((bigScale?-?1)?*?(y?-?topHeight));??? ????????????float?currentWidth?=?primaryW?*?scale?*?bigScale;??? ????????????float?currentHeight?=?primaryH?*?scale?*?bigScale;?? ?????????????? ????????????if?(currentHeight?>?contentH)?{?? ????????????????limitY1?=?-(currentHeight?-?contentH);??? ????????????????limitY2?=?0;?? ????????????????isMoveY?=?true;??? ????????????????float?currentSubY?=?bigScale?*?subY;??? ?????????????????? ????????????????if?(-transY?<?currentSubY)?{?? ????????????????????transY?=?-currentSubY;?? ????????????????}?? ?????????????????? ????????????????if?(currentSubY?+?transY?<?limitY1)?{?? ????????????????????transY?=?-(currentHeight?+?currentSubY?-?contentH);?? ????????????????}?? ????????????}?else?{?? ?????????????????? ????????????????isMoveY?=?false;?? ????????????}?? ?? ????????????if?(currentWidth?>?contentW)?{?? ????????????????limitX1?=?-(currentWidth?-?contentW);?? ????????????????limitX2?=?0;?? ????????????????isMoveX?=?true;?? ????????????????float?currentSubX?=?bigScale?*?subX;?? ????????????????if?(-transX?<?currentSubX)?{?? ????????????????????transX?=?-currentSubX;?? ????????????????}?? ????????????????if?(currentSubX?+?transX?<?limitX1)?{?? ????????????????????transX?=?-(currentWidth?+?currentSubX?-?contentW);?? ????????????????}?? ????????????}?else?{?? ????????????????isMoveX?=?false;?? ????????????}?? ?? ????????????imgMatrix.postTranslate(transX,?transY);?? ????????????isBig?=?true;?? ????????}?? ?? ????????this.setImageMatrix(imgMatrix);?? ????????if?(mCustomMethod?!=?null)?{?? ????????????mCustomMethod.customMethod(isBig);?? ????????}?? ????}?? ?? ????? ? ? ? ? ? ?? ????private?float[]?getTranslateXY(Matrix?matrix)?{?? ????????float[]?values?=?new?float[9];?? ????????matrix.getValues(values);?? ????????float[]?floats?=?new?float[2];?? ????????floats[0]?=?values[Matrix.MTRANS_X];?? ????????floats[1]?=?values[Matrix.MTRANS_Y];?? ????????return?floats;?? ????}?? ?? ????? ? ? ? ? ?? ????private?float?getDistance(MotionEvent?event)?{?? ????????float?x?=?event.getX(0)?-?event.getX(1);?? ????????float?y?=?event.getY(0)?-?event.getY(1);?? ????????return?FloatMath.sqrt(x?*?x?+?y?*?y);?? ????}?? ?? ????? ? ?? ????public?interface?ICustomMethod?{?? ????????public?void?customMethod(Boolean?currentStatus);?? ????}?? }??
?
ImageVewActivity.cs?? 這個用于測試的Activity
[java]?view plaincopy
import?android.app.Activity;?? import?android.graphics.Bitmap;?? import?android.graphics.Rect;?? import?android.graphics.drawable.BitmapDrawable;?? import?android.os.Bundle;?? import?android.view.MotionEvent;?? import?android.view.View;?? import?android.widget.LinearLayout;?? import?android.widget.TextView;?? import?android.widget.Toast;?? import?ejiang.boiler.ImageControl.ICustomMethod;?? import?ejiang.boiler.R.id;?? ?? public?class?ImageViewActivity?extends?Activity?{?? ?? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ?????????? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.common_image_view);?? ????????findView();?? ????}?? ?? ????public?void?onWindowFocusChanged(boolean?hasFocus)?{?? ????????super.onWindowFocusChanged(hasFocus);?? ????????init();?? ????}?? ?? ????ImageControl?imgControl;?? ????LinearLayout?llTitle;?? ????TextView?tvTitle;?? ?? ????private?void?findView()?{?? ????????imgControl?=?(ImageControl)?findViewById(id.common_imageview_imageControl1);?? ????????llTitle?=?(LinearLayout)?findViewById(id.common_imageview_llTitle);?? ????????tvTitle?=?(TextView)?findViewById(id.common_imageview_title);?? ????}?? ?? ????private?void?init()?{?? ????????tvTitle.setText("圖片測試");?? ?????????? ?????????? ?????????? ????????Bitmap?bmp;?? ????????if?(imgControl.getDrawingCache()?!=?null)?{?? ????????????bmp?=?Bitmap.createBitmap(imgControl.getDrawingCache());?? ????????}?else?{?? ????????????bmp?=?((BitmapDrawable)?imgControl.getDrawable()).getBitmap();?? ????????}?? ????????Rect?frame?=?new?Rect();?? ????????getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);?? ????????int?statusBarHeight?=?frame.top;?? ????????int?screenW?=?this.getWindowManager().getDefaultDisplay().getWidth();?? ????????int?screenH?=?this.getWindowManager().getDefaultDisplay().getHeight()?? ????????????????-?statusBarHeight;?? ????????if?(bmp?!=?null)?{?? ????????????imgControl.imageInit(bmp,?screenW,?screenH,?statusBarHeight,?? ????????????????????new?ICustomMethod()?{?? ???????????????????????? ????????????????????????@Override?? ????????????????????????public?void?customMethod(Boolean?currentStatus)?{?? ?????????????????????????????? ????????????????????????????if?(currentStatus)?{?? ????????????????????????????????llTitle.setVisibility(View.GONE);?? ????????????????????????????}?else?{?? ????????????????????????????????llTitle.setVisibility(View.VISIBLE);?? ????????????????????????????}?? ????????????????????????}?? ????????????????????});?? ????????}?? ????????else?? ????????{?? ????????????Toast.makeText(ImageViewActivity.this,?"圖片加載失敗,請稍候再試!",?Toast.LENGTH_SHORT)?? ????????????????????.show();?? ????????}?? ?? ????}?? ?? ????@Override?? ????public?boolean?onTouchEvent(MotionEvent?event)?{?? ????????switch?(event.getAction()?&?MotionEvent.ACTION_MASK)?{?? ????????case?MotionEvent.ACTION_DOWN:?? ????????????imgControl.mouseDown(event);?????????????? ????????????break;?? ?? ????????? ? ?? ????????case?MotionEvent.ACTION_POINTER_DOWN:?? ?????????? ????????????????imgControl.mousePointDown(event);?? ?????????? ????????????break;?? ????????case?MotionEvent.ACTION_MOVE:?? ????????????????imgControl.mouseMove(event);?? ?????????????? ????????????break;?? ?? ????????case?MotionEvent.ACTION_UP:?? ????????????imgControl.mouseUp();?? ????????????break;?? ?? ????????}?? ?? ????????return?super.onTouchEvent(event);?? ????}?? }??
??????? 在上面的代碼中,需要注意兩點。一Activity中要重寫onTouchEvent方法,將觸摸事件傳遞到ImageControl,這點類似于WPF中的路由事件機制。二初始化imgControl即imgControl.imageInit,注意其中的參數。最后一個參數類似于C#中的委托,我這里使用接口來實現,在放大縮小的切換時要執行的操作都卸載這個方法中。
common_image_view.xml? 布局文件
[html]?view plaincopy
<?xml?version="1.0"?encoding="utf-8"?>?? <RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"?? ????android:id="@+id/rl"?? ????android:layout_width="fill_parent"?? ????android:layout_height="fill_parent"?>?? ?? ????<ejiang.boiler.ImageControl?? ????????android:id="@+id/common_imageview_imageControl1"?? ????????android:layout_width="fill_parent"?? ????????android:layout_height="fill_parent"?? ????????android:src="@drawable/ic_launcher"?/>?? ?? ????<LinearLayout?? ????????android:id="@+id/common_imageview_llTitle"?? ????????style="@style/reportTitle1"?? ????????android:layout_alignParentLeft="true"?? ????????android:layout_alignParentTop="true"?>?? ?? ????????<TextView?? ????????????android:id="@+id/common_imageview_title"?? ????????????style="@style/title2"?? ????????????android:layout_width="fill_parent"?? ????????????android:layout_height="wrap_content"?? ????????????android:layout_weight="1"?? ????????????android:text="報告"?/>?? ????</LinearLayout>?? ?? </RelativeLayout>??
? ? ? ?有什么紕漏或錯誤,歡迎大家指出!
另外功能更加強大的一個類見本人另一篇博客
http://blog.csdn.net/gfg156196/article/details/49741233#reply
總結
以上是生活随笔為你收集整理的Android图片查看支持双击放大缩小、多点触摸(多机型测试,长期使用很稳定)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。