Android手勢(shì)控制實(shí)現(xiàn)縮放、移動(dòng)圖片
本文實(shí)例為大家分享了Android手勢(shì)控制實(shí)現(xiàn)縮放、移動(dòng)圖片的方法,供大家參考,具體內(nèi)容如下
新建一個(gè)觸摸監(jiān)聽器類
package com.liyong.btprinter; import android.graphics.Matrix; import android.graphics.PointF; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class MulitPointTouchListener implements OnTouchListener { private static final String TAG = "Touch"; // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Remember some things for zooming PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; // Log.e("view_width", // view.getImageMatrix()..toString()+"*"+v.getWidth()); // Dump touch event to log dumpEvent(event); // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(), event.getY()); //Log.d(TAG, "mode=DRAG"); mode = DRAG; //Log.d(TAG, "mode=NONE"); break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); //Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; //Log.d(TAG, "mode=ZOOM"); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; //Log.e("view.getWidth", view.getWidth() + ""); //Log.e("view.getHeight", view.getHeight() + ""); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // ... matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); //Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } view.setImageMatrix(matrix); return true; // indicate event was handled } private void dumpEvent(MotionEvent event) { String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((int) event.getX(i)); sb.append(",").append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) sb.append(";"); } sb.append("]"); //Log.d(TAG, sb.toString()); } private float spacing(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); } private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } }
編寫一個(gè)xml文件
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:weightSum="1"> <ImageView android:layout_width="fill_parent" android:id="@+id/priviewimage" android:layout_height="fill_parent" android:layout_gravity="center" android:scaleType="matrix" > </ImageView> </LinearLayout>
注意其中的: android:scaleType="matrix"
priviewimage.setImageBitmap(ActivityPreviewImage.click_bitmap); priviewimage=(ImageView)findViewById(R.id.priviewimage); priviewimage.setOnTouchListener(new MulitPointTouchListener());
以上就是Android手勢(shì)控制縮放移動(dòng)圖片的全部代碼,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Android實(shí)現(xiàn)觸摸移動(dòng)的懸浮窗口功能
- Android快速實(shí)現(xiàn)觸摸移動(dòng)的懸浮窗
- Android實(shí)現(xiàn)在屏幕上移動(dòng)圖片的方法
- Android基礎(chǔ)知識(shí)之單點(diǎn)觸摸
- Android通過(guò)單點(diǎn)觸摸移動(dòng)圖片
- Android實(shí)現(xiàn)通過(guò)手勢(shì)控制圖片大小縮放的方法
- Android 使用Vitamio打造自己的萬(wàn)能播放器(2)—— 手勢(shì)控制亮度、音量、縮放
- Android應(yīng)用中實(shí)現(xiàn)手勢(shì)控制圖片縮放的完全攻略
- Android實(shí)現(xiàn)手勢(shì)控制ImageView圖片大小
相關(guān)文章
Android中Fragment多層嵌套時(shí)onActivityResult無(wú)法正確回調(diào)問(wèn)題的解決方法
這篇文章主要介紹了Android中Fragment多層嵌套時(shí)onActivityResult無(wú)法正確回調(diào)問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android 媒體庫(kù)數(shù)據(jù)更新方法總結(jié)
這篇文章主要介紹了Android 媒體庫(kù)數(shù)據(jù)更新方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04一分鐘實(shí)現(xiàn)Android遮罩引導(dǎo)視圖
本文通過(guò)一分鐘的時(shí)間教大家實(shí)現(xiàn)Android遮罩引導(dǎo)視圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03利用HorizontalScrollView實(shí)現(xiàn)滑動(dòng)頁(yè)面時(shí)的縮放效果
這篇文章主要為大家詳細(xì)介紹了利用HorizontalScrollView實(shí)現(xiàn)滑動(dòng)頁(yè)面時(shí)的縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Android第三方開源下拉框NiceSpinner使用詳解
這篇文章主要為大家詳細(xì)介紹了Android第三方開源下拉框NiceSpinner的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07android實(shí)現(xiàn)listview分頁(yè)的方法
這篇文章主要介紹了android實(shí)現(xiàn)listview分頁(yè)的方法,涉及Android生成listview列表的相關(guān)技巧,需要的朋友可以參考下2015-05-05