生活随笔
收集整理的這篇文章主要介紹了
我的Android进阶之旅------android Matrix图片随意的放大缩小,拖动(转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
step1:新建一個(gè)項(xiàng)目DragAndZoom,并準(zhǔn)備一張照片放在res/drawable-hdpi目錄下,如下圖所示:
? ? ? ?
step2: 設(shè)置應(yīng)用的UI界面,在main.xml中設(shè)置:
?
[html]?view plain
?copy <?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:orientation="vertical"??????android:layout_width="fill_parent"??????android:layout_height="fill_parent"??????>??<ImageView????????android:layout_width="fill_parent"???????android:layout_height="wrap_content"???????android:src="@drawable/wall"??????android:id="@+id/imageView"??????android:scaleType="matrix"?????????/>??</LinearLayout>??
step3:MainActivity.java中實(shí)現(xiàn)具體的需求
?
?
[java]?view plain
?copy package?cn.roco.drag;????import?android.app.Activity;??import?android.graphics.Matrix;??import?android.graphics.PointF;??import?android.os.Bundle;??import?android.util.FloatMath;??import?android.view.MotionEvent;??import?android.view.View;??import?android.view.View.OnTouchListener;??import?android.widget.ImageView;????public?class?MainActivity?extends?Activity?{????????private?ImageView?imageView;????????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.main);????????????imageView?=?(ImageView)?this.findViewById(R.id.imageView);??????????imageView.setOnTouchListener(new?TouchListener());??????}????????private?final?class?TouchListener?implements?OnTouchListener?{????????????????????????????private?int?mode?=?0;????????????????private?static?final?int?MODE_DRAG?=?1;??????????????????private?static?final?int?MODE_ZOOM?=?2;????????????????????????????private?PointF?startPoint?=?new?PointF();??????????????????private?Matrix?matrix?=?new?Matrix();??????????????????private?Matrix?currentMatrix?=?new?Matrix();????????????????????????private?float?startDis;??????????????????private?PointF?midPoint;????????????@Override??????????public?boolean?onTouch(View?v,?MotionEvent?event)?{??????????????????????????switch?(event.getAction()?&?MotionEvent.ACTION_MASK)?{??????????????????????????case?MotionEvent.ACTION_DOWN:??????????????????mode?=?MODE_DRAG;??????????????????????????????????currentMatrix.set(imageView.getImageMatrix());??????????????????startPoint.set(event.getX(),?event.getY());??????????????????break;??????????????????????????case?MotionEvent.ACTION_MOVE:??????????????????????????????????if?(mode?==?MODE_DRAG)?{??????????????????????float?dx?=?event.getX()?-?startPoint.x;?????????????????????float?dy?=?event.getY()?-?startPoint.y;?????????????????????????????????????????matrix.set(currentMatrix);??????????????????????matrix.postTranslate(dx,?dy);??????????????????}??????????????????????????????????else?if?(mode?==?MODE_ZOOM)?{??????????????????????float?endDis?=?distance(event);????????????????????if?(endDis?>?10f)?{?????????????????????????float?scale?=?endDis?/?startDis;????????????????????????matrix.set(currentMatrix);??????????????????????????matrix.postScale(scale,?scale,midPoint.x,midPoint.y);??????????????????????}??????????????????}??????????????????break;??????????????????????????case?MotionEvent.ACTION_UP:??????????????????????????????case?MotionEvent.ACTION_POINTER_UP:??????????????????mode?=?0;??????????????????break;??????????????????????????case?MotionEvent.ACTION_POINTER_DOWN:??????????????????mode?=?MODE_ZOOM;??????????????????????????????????startDis?=?distance(event);??????????????????????????????????if?(startDis?>?10f)?{?????????????????????midPoint?=?mid(event);??????????????????????????????????????????currentMatrix.set(imageView.getImageMatrix());??????????????????}??????????????????break;??????????????}??????????????imageView.setImageMatrix(matrix);??????????????return?true;??????????}????????????????????private?float?distance(MotionEvent?event)?{??????????????float?dx?=?event.getX(1)?-?event.getX(0);??????????????float?dy?=?event.getY(1)?-?event.getY(0);??????????????????????????return?FloatMath.sqrt(dx?*?dx?+?dy?*?dy);??????????}????????????????????private?PointF?mid(MotionEvent?event)?{??????????????float?midX?=?(event.getX(1)?+?event.getX(0))?/?2;??????????????float?midY?=?(event.getY(1)?+?event.getY(0))?/?2;??????????????return?new?PointF(midX,?midY);??????????}????????}????}??
step4:AndroidMainfest.xml
?
?
[html]?view plain
?copy <?xml?version="1.0"?encoding="utf-8"?>??<manifest?xmlns:android="http://schemas.android.com/apk/res/android"????????package="cn.roco.drag"????????android:versionCode="1"????????android:versionName="1.0">??????<uses-sdk?android:minSdkVersion="8"?/>????????<application?android:icon="@drawable/icon"?android:label="@string/app_name">??????????<activity?android:name=".MainActivity"????????????????????android:label="@string/app_name">??????????????<intent-filter>??????????????????<action?android:name="android.intent.action.MAIN"?/>??????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??????????????</intent-filter>??????????</activity>????????</application>??</manifest>??
step5:具體的效果圖
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
上面兩個(gè)是圖片拖拽的效果,而圖片的縮放效果要在真機(jī)中才能夠看得到,請讀者自己在真機(jī)環(huán)境中測試。
?
附注:具體的程序源碼在:http://pan.baidu.com/share/link?shareid=397888&uk=805959799
?
?
?
?
其實(shí) 通過通過手勢也可以縮放圖片 ? ?左--->右 放大 右 --->左 縮小 速度越快,縮放比例越大
zoom.xml
?
[html]?view plain
?copy <?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:orientation="vertical"??????android:layout_width="fill_parent"??????android:layout_height="fill_parent"??????>??<ImageView????????android:layout_width="fill_parent"???????android:layout_height="wrap_content"???????android:src="@drawable/wall"??????android:id="@+id/show"??????android:scaleType="matrix"?????????/>??</LinearLayout>?? ?
?
GestureZoom.java
?
[java]?view plain
?copy package?cn.roco.gesture;????import?android.app.Activity;??import?android.graphics.Bitmap;??import?android.graphics.BitmapFactory;??import?android.graphics.Matrix;??import?android.graphics.drawable.BitmapDrawable;??import?android.os.Bundle;??import?android.view.GestureDetector;??import?android.view.GestureDetector.OnGestureListener;??import?android.view.MotionEvent;??import?android.widget.ImageView;????public?class?GestureZoom?extends?Activity?implements?OnGestureListener?{??????????GestureDetector?detector;??????ImageView?imageView;??????????Bitmap?bitmap;??????????int?width,?height;??????????float?currentScale?=?1;??????????Matrix?matrix;????????@Override??????protected?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.zoom);??????????????????detector?=?new?GestureDetector(this);??????????imageView?=?(ImageView)?findViewById(R.id.show);??????????matrix?=?new?Matrix();??????????????????bitmap?=?BitmapFactory.decodeResource(this.getResources(),??????????????????R.drawable.wall);??????????????????width?=?bitmap.getWidth();??????????????????height?=?bitmap.getHeight();??????????????????imageView.setImageBitmap(BitmapFactory.decodeResource(??????????????????this.getResources(),?R.drawable.wall));??????}????????@Override??????public?boolean?onTouchEvent(MotionEvent?event)?{??????????????????return?detector.onTouchEvent(event);??????}????????@Override??????public?boolean?onDown(MotionEvent?e)?{??????????????????return?false;??????}????????@Override??????public?void?onShowPress(MotionEvent?e)?{????????????????}????????@Override??????public?boolean?onSingleTapUp(MotionEvent?e)?{??????????return?false;??????}????????@Override??????public?boolean?onScroll(MotionEvent?e1,?MotionEvent?e2,?float?distanceX,??????????????float?distanceY)?{??????????return?false;??????}????????@Override??????public?void?onLongPress(MotionEvent?e)?{????????}????????@Override??????public?boolean?onFling(MotionEvent?e1,?MotionEvent?e2,?float?velocityX,??????????????float?velocityY)?{??????????velocityX?=?velocityX?>?4000???4000?:?velocityX;??????????velocityY?=?velocityY?<?-4000???-4000?:?velocityY;??????????????????currentScale?+=?currentScale?*?velocityX?/?4000.0f;??????????????????currentScale?=?currentScale?>?0.01???currentScale?:?0.01f;??????????????????matrix.setScale(currentScale,?currentScale,?160,?200);??????????BitmapDrawable?tmp?=?(BitmapDrawable)?imageView.getDrawable();??????????????????if?(!tmp.getBitmap().isRecycled())?{??????????????tmp.getBitmap().recycle();??????????}??????????????????Bitmap?bitmap2?=?Bitmap.createBitmap(bitmap,?0,?0,?width,?height,??????????????????matrix,?true);??????????????????imageView.setImageBitmap(bitmap2);??????????return?true;??????}????????}?? ?
查看一下運(yùn)行的效果
? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ?? ? ?
轉(zhuǎn)載于:https://www.cnblogs.com/gzhnan/articles/5286893.html
總結(jié)
以上是生活随笔為你收集整理的我的Android进阶之旅------android Matrix图片随意的放大缩小,拖动(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。