生活随笔
收集整理的這篇文章主要介紹了
Android图片查看支持双击放大缩小、多点触摸(多机型测试,长期使用很稳定)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ? ? 該模塊主要實(shí)現(xiàn)了放大和原大兩個(gè)級(jí)別的縮放。
另外功能更加強(qiáng)大的一個(gè)類(lèi)見(jiàn)本人另一篇博客
http://blog.csdn.net/gfg156196/article/details/49741233#reply
?功能有:
以觸摸點(diǎn)為中心放大(這個(gè)是網(wǎng)上其他的代碼沒(méi)有的)邊界控制(這個(gè)是網(wǎng)上其他的代碼沒(méi)有的)雙擊放大或縮小(主要考慮到電阻屏)多點(diǎn)觸摸放大和縮小
??????? 這個(gè)模塊已經(jīng)通過(guò)了測(cè)試,并且用戶也使用有一段時(shí)間了,是屬于比較穩(wěn)定的了。
下面貼上代碼及使用方法(沒(méi)有寫(xiě)測(cè)試項(xiàng)目,大家見(jiàn)諒):
?ImageControl.cs?? 類(lèi)似一個(gè)用戶自定義的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?? 這個(gè)用于測(cè)試的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("圖片測(cè)試");?? ?????????? ?????????? ?????????? ????????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,?"圖片加載失敗,請(qǐng)稍候再試!",?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);?? ????}?? }??
??????? 在上面的代碼中,需要注意兩點(diǎn)。一Activity中要重寫(xiě)onTouchEvent方法,將觸摸事件傳遞到ImageControl,這點(diǎn)類(lèi)似于WPF中的路由事件機(jī)制。二初始化imgControl即imgControl.imageInit,注意其中的參數(shù)。最后一個(gè)參數(shù)類(lèi)似于C#中的委托,我這里使用接口來(lái)實(shí)現(xiàn),在放大縮小的切換時(shí)要執(zhí)行的操作都卸載這個(gè)方法中。
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="報(bào)告"?/>?? ????</LinearLayout>?? ?? </RelativeLayout>??
? ? ? ?有什么紕漏或錯(cuò)誤,歡迎大家指出!
另外功能更加強(qiáng)大的一個(gè)類(lèi)見(jiàn)本人另一篇博客
http://blog.csdn.net/gfg156196/article/details/49741233#reply
總結(jié)
以上是生活随笔為你收集整理的Android图片查看支持双击放大缩小、多点触摸(多机型测试,长期使用很稳定)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。