`
夏文权
  • 浏览: 242725 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

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>

 

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

 

分享到:
评论

相关推荐

    Android 双指拖动和双指缩放图片

    在Android开发中,实现双指拖动和双指缩放图片是常见的手势识别应用场景,尤其在图片查看器或画板类应用中极为常见。本文将深入探讨如何在Android平台上实现这一功能,以及如何将绘制的线条与背景图片进行正片叠底的...

    android对图片的缩放和拖拽

    在Android开发中,图片的缩放和拖拽是常见的需求,尤其在开发图像查看器、画板类应用时。本文将深入探讨如何在Android平台上实现类似系统图库的图片缩放和拖拽功能,帮助开发者打造高质量的用户体验。 首先,我们要...

    Android 图片双指缩放 单指拖拽 、拖到边界回弹

    在Android开发中,实现图片的双指缩放和单指拖拽是常见的需求,尤其在设计用户界面或者创建自定义视图时。这种功能能够提供更丰富的交互体验,让用户能够自由地查看和操作图片。本篇文章将深入探讨如何在Android应用...

    Android图片裁剪----移动、缩放图片进行裁剪

    通过查看和学习这个项目的代码,开发者可以更好地理解如何在Android中实现图片的移动、缩放和裁剪功能。 总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建...

    Android SurfaceView 实现图片缩放 滑动

    综上所述,通过结合SurfaceView、手势检测和矩阵变换,我们可以实现在Android应用中对图片的流畅缩放和滑动操作。然而,由于SurfaceView的特性,这个过程可能会比使用ImageView等其他组件更为复杂。因此,开发者需要...

    Android 多点触控,多张图片拖拽,缩放,旋转

    在Android平台上,实现多点触控、多张图片的拖拽、缩放和旋转功能是一项常见的需求,尤其在开发互动式应用或者图像编辑类应用时。以下是对这一主题的详细阐述。 **一、多点触控(Multi-Touch)** 多点触控是指设备...

    Android拖动,缩放,自定义内容控件源码

    使用canvas.translate()进行平移,canvas.scale()进行缩放,结合save()和restore()方法保持状态,避免缩放和平移影响其他元素。 5. **自定义内容填充**: 如果控件需要填充特定的Android控件,如Button或ImageView...

    【原创】Android自定义View实现图片显示并能缩放、拖拽、切换

    通过以上步骤,我们可以构建一个功能完备的自定义图片显示View,它支持手势缩放、拖拽和图片切换。这样的自定义View在许多应用中都非常有用,例如查看图片库、阅读漫画或展示产品细节等。 在实际项目中,可能还需要...

    android 图片拼接 缩放 特效 拖动 翻转

    本文将深入探讨如何在Android平台上实现图片的拼接、缩放、特效、拖动以及翻转功能,这些都是移动应用中常见的交互和视觉元素。我们将以`DrawDemo`为例,来阐述这些技术的实现细节。 1. **图片拼接**: 图片拼接是...

    android手势缩放和拖拽图片

    在Android开发中,实现手势缩放和拖拽图片的功能是一项常用且重要的技能,尤其是在创建自定义图片查看器或相册应用时。以下将详细介绍如何在Android应用中实现这些功能。 一、手势识别基础 Android提供了` ...

    Android-图片浏览器支持缩放下拉缩小退出

    总的来说,"Android-图片浏览器支持缩放下拉缩小退出"项目涵盖了Android手势检测、图片加载与缓存、动画效果、UI交互等多个方面,对于开发者来说,理解和实现这个项目不仅能提升Android开发技能,还能加深对用户交互...

    Android对图片进行拖拽和缩放

    本文将深入探讨如何在Android平台上实现这一功能,主要包括两个核心部分:图片的拖动(Drag)和图片的缩放(Scale)。 ### 图片拖动(Drag) #### 1. 设置触摸监听器 首先,我们需要为显示图片的ImageView或自定义...

    android 实现图片的拖拉缩放功能

    除了上述代码,我们还需要确保View的Matrix模式设置为MATRIX_MODE_MATRIX,这样缩放和平移操作才会生效。同时,为了保持图片在缩放后的中心位置,我们需要在缩放时调整View的pivot点。 ```java setPivotX((getWidth...

    Android中进行图片缩放显示

    Android中进行图片缩放显示,获取网络图片,双击放大缩小,支持多点触屏缩放和拖拽。 demo查看地址:http://blog.csdn.net/u011084603/article/details/50371843

    Android实现图片缩放功能

    要实现在ImageView上手势缩放图片,我们可以利用Android的GestureDetector和ScaleGestureDetector类。这两个类是Android提供的用于处理触摸事件和手势的工具。GestureDetector用于检测单击、双击、滑动等基本手势,...

    android实现自定义RelativeLayout可拖动、缩放、旋转TextView

    本文将深入探讨如何在Android中实现一个自定义的RelativeLayout,使其能够支持TextView的拖动、缩放和旋转功能。 首先,我们需要创建一个新的自定义布局类,继承自RelativeLayout。在这个类中,我们将重写一些关键...

    Android可拖动缩放的ImageView DEMO

    在Android开发中,创建一个可拖动和缩放的ImageView是一项常见的需求,特别是在设计交互式应用或游戏时。本文将详细讲解如何实现这样一个功能,主要关注`onTouchListener`的使用和`ImageView`的`scaleType`属性。 ...

Global site tag (gtag.js) - Google Analytics