当前位置: 代码迷 >> Android >> Android 图片拖动跟缩放
  详细解决方案

Android 图片拖动跟缩放

热度:71   发布时间:2016-04-28 02:42:22.0
Android 图片拖动和缩放

今天下载传智播客黎活明老师的Android视频看了图片拖动和缩放,放上去以后学习用。

package com.example.test_pictrue_move_drag;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;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.widget.ImageView;public class MainActivity extends Activity {	private ImageView imageView ;		private PointF startPoint = new PointF();	private Matrix matrix = new Matrix() ;	private Matrix saveCurrentMatrix = new Matrix();		// 初始状态  	private  final static int NONE = 0;	// 拖动  	private  final static int DRAG = 1;	// 缩放  	private  final static int ZOOM = 2;	// 记录当前模式	private int MODE = NONE ;		// 计算两点之间的距离	private float startDistance ;	// 计算两点之间的中心点	private PointF midPoint ;			// 	private Bitmap bitmap ;		@Override	protected void onCreate(Bundle savedInstanceState) {		// TODO Auto-generated method stub		super.onCreate(savedInstanceState);				setContentView(R.layout.activity_main);				imageView = (ImageView) findViewById(R.id.imageView);				imageView.setOnTouchListener(new View.OnTouchListener() {						@Override			public boolean onTouch(View v, MotionEvent event) {				// TODO Auto-generated method stub				switch (event.getAction() & MotionEvent.ACTION_MASK) {				case MotionEvent.ACTION_DOWN: // 手指按下屏幕										saveCurrentMatrix.set(imageView.getImageMatrix()); // 记录imageView的当前移动位置					startPoint.set(event.getX(), event.getY()); // 记录开始按下的点坐标					MODE = DRAG ;										break;									case MotionEvent.ACTION_POINTER_DOWN: // 屏幕上已经有一个触点,再有一个手指按下屏幕					MODE = ZOOM ;					startDistance = distance(event);					if(startDistance > 10f){						midPoint = mid(event);						saveCurrentMatrix.set(imageView.getImageMatrix());//记录ImageView当前的缩放倍数					}					break ;				case MotionEvent.ACTION_MOVE:					if(MODE == DRAG ){						// 移动距离						float dx = event.getX() - startPoint.x;						float dy = event.getY() - startPoint.y;												matrix.set(saveCurrentMatrix); //在上一次移动位置的基础上进行移动						// 进行拖动						matrix.postTranslate(dx, dy);											} else if (MODE == ZOOM){						float endDis = distance(event);//结束距离						if(endDis > 10f){							float scale = endDis / startDistance;//得到缩放倍数							matrix.set(saveCurrentMatrix);//在上一次缩放位置的基础上进行缩放							matrix.postScale(scale, scale, midPoint.x, midPoint.y);						}					}										break ;									case MotionEvent.ACTION_UP:// 手指离开屏幕				case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但还屏幕还有触点					MODE = NONE ;										break;									}								imageView.setImageMatrix(matrix);				return true;			}		});		//		bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_20150119100930);			}	/**     * 计算两点之间的距离     * @param event     * @return     */	public static 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);	}		/**	 * 计算两点之间的中间点	 * @param event	 * @return	 */	public static 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);	}	//	/** //     * 横向、纵向居中 //     */  //    protected void center(boolean horizontal, boolean vertical) { //        Matrix m = new Matrix();  //        m.set(matrix);  //        RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());  //        m.mapRect(rect);  //        float height = rect.height();  //        float width = rect.width();  //        float deltaX = 0, deltaY = 0;  //        if (vertical) {  //            // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下放留空则往下移  //            int screenHeight = getResources().getDisplayMetrics().heightPixels;  //            if (height < screenHeight) {  //                deltaY = (screenHeight - height) / 2 - rect.top;  //            } else if (rect.top > 0) {  //                deltaY = -rect.top;  //            } else if (rect.bottom < screenHeight) {  //                deltaY = imageView.getHeight() - rect.bottom;  //            }  //        }  //        if (horizontal) {  //            int screenWidth = getResources().getDisplayMetrics().widthPixels;  //            if (width < screenWidth) {  //                deltaX = (screenWidth - width) / 2 - rect.left;  //            } else if (rect.left > 0) {  //                deltaX = -rect.left;  //            } else if (rect.right < screenWidth) {  //                deltaX = screenWidth - rect.right;  //            }  //        }  //        matrix.postTranslate(deltaX, deltaY);  //    }  }

?

? ? xml

<RelativeLayout 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:gravity="center" >     <ImageView        android:id="@+id/imageView"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:contentDescription="@null"        android:layout_centerInParent="true"        android:src="@drawable/test_20150119100930"        android:scaleType="matrix" /> </RelativeLayout>

?

? ?附件还有一个另一种拖动的实现方式

?

  相关解决方案