在ImageView中拖动图片

mainActivity如下:

package cn.c;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Display;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
/**
 * 需求描述:
 * 一个ImageView填充了整个屏幕,且其中显示的图片宽高均
 * 大于屏幕的宽高.现需要使用手指拖动图片,以便查看图片
 * 的任何部分.
 *
 * 概况描述:
 * 1 在布局文件中ImageView的高宽是填充屏幕的
 * 2 截取的图片大小总是和屏幕的宽高相等!所以这也影响到了onScroll()
 *   中对于pointX和pointY的处理
 *
 * 小结:
 * 1 注意GestureListenerImpl implements OnGestureListener
 *   实现的接口是GestureDetector.OnGestureListener
 *   而不是GestureOverlayView.OnGestureListener!!
 * 2 方法Bitmap.createBitmap(source, x, y, width, height)中
 *   pointX和pointY表示:从图片的哪个位置开始显示.
 *   不要错误地以为这是在屏幕上开始显示的开始坐标
 * 3 注意onTouchEvent()方法的处理!!!
 */
public class MainActivity extends Activity {
   private GestureListenerImpl mGestureListenerImpl;
   private GestureDetector mGestureDetector;
   private ImageView mImageView;
   private Bitmap mBitmap;
   private int screenWidth=0;
   private int screenHeight=0;
   private int bitmapWidth=0;
   private int bitmapHeight=0;
   private int pointX=0;
   private int pointY=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隐藏状态栏
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        //得到屏幕的宽高
        Display display=getWindowManager().getDefaultDisplay();
        screenWidth=display.getWidth();
        screenHeight=display.getHeight();
        //得到Bitmap的宽高
        mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.photo);
        bitmapWidth=mBitmap.getWidth();
        bitmapHeight=mBitmap.getHeight();
        //设置ImageView
        mImageView=(ImageView) findViewById(R.id.imageView);
        //第一次时从原图的(0,0)截取图片
        Bitmap bitmap=Bitmap.createBitmap(mBitmap, pointX, pointY, screenWidth, screenHeight);
        mImageView.setImageBitmap(bitmap);
        //设置GestureDetector
        mGestureListenerImpl=new GestureListenerImpl();
        mGestureDetector=new GestureDetector(MainActivity.this,mGestureListenerImpl);
    }
    //当Activity的onTouchEvent()被触发时
    //触发GestureDetector的onTouchEvent()
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    	    if (mGestureDetector.onTouchEvent(event)) {
				return mGestureDetector.onTouchEvent(event);
			} else {
				return super.onTouchEvent(event);
			}

    	}

   private class GestureListenerImpl implements OnGestureListener{
		public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
			// 计算拖动后X轴基准点(pointX)的位置
			// 注意:在多次拖动中,pointX是累加变化的
			if (pointX + distanceX >= 0) {
				if ((pointX+distanceX+screenWidth) > bitmapWidth) {
					//如果在某次移动后,移动距离为distanceX
					//此时pointX+distanceX再加上screenWidth大于了bitmapWidth
					//若此时从pointX + distanceX开始截宽度为screenWidth的图
					//那么很显然越界,超过了原bitmap的宽,所以报错.
					//所以只能从bitmapWidth-screenWidth处开始截宽为screenWidth的图
					//这样恰好不会越界:
					//即bitmapWidth-screenWidth+screenWidth=bitmapWidth
					pointX = bitmapWidth - screenWidth;
				} else {
					pointX = (int) (pointX + distanceX);
				}
			} else {
				//原图的原点
				pointX = 0;
			}
			// 计算拖动后Y轴基准点(pointY)的位置
			// 注意:在多次拖动中,pointY是累加变化的
			if (pointY + distanceY >= 0) {
				if ((pointY+distanceY+screenHeight) > bitmapHeight) {
					pointY = bitmapHeight - screenHeight;
				} else {
					pointY = (int) (pointY + distanceY);
				}
			} else {
				//原图的原点
				pointY = 0;
			}
			//重新显示重原图中截取的Bitmap
			//注意截取的图片大小总是和屏幕的宽高相等!
			if (distanceX != 0 && distanceY != 0) {
				Bitmap bitmap = Bitmap.createBitmap(mBitmap, pointX, pointY,screenWidth, screenHeight);
				mImageView.setImageBitmap(bitmap);
			}
			return false;
		}
		public boolean onDown(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}

		public void onShowPress(MotionEvent e) {
			// TODO Auto-generated method stub

		}

		public boolean onSingleTapUp(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}

		public void onLongPress(MotionEvent e) {
			// TODO Auto-generated method stub

		}

		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			// TODO Auto-generated method stub
			return false;
		}

   }

}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/photo"
    />

</RelativeLayout>

 

时间: 2024-09-29 09:20:05

在ImageView中拖动图片的相关文章

imageview-关于android开发ImageView中的图片进行图形标记的添加处理

问题描述 关于android开发ImageView中的图片进行图形标记的添加处理 关于android开发,对ImageView中的图片进行图形标记的添加处理.如果有实例说明请列举一下,谢谢!急!急!急! 解决方案 问题不明白什么意思?可否说清楚点?或者给张图片示意一下. 解决方案二: 是"ImageView右下角有一个小图标,可以对小图标进行操作"的意思吗?

安卓开发之保存ImageView中的图片到本地相册

代码如下. private void saveImage(ImageView imageView){     imageView.setDrawingCacheEnabled(true);//开启catch,开启之后才能获取ImageView中的bitmap     Bitmap bitmap = imageView.getDrawingCache();//获取imageview中的图像     MediaStore.Images.Media.insertImage(getContentReso

c#中拖动图片的例子

这个问题来自论坛提问,并没有什么难度,也不需要重画内容.当然还有一种方法是通过api发送WM_SysCommand 和SC_MOVE,也就是拖动无标题窗体的方法 ,但是效果没有这个好. using System; using System.Drawing; using System.Windows.Forms; namespace WindowsApplication2 ...{ public partial class Form1 : Form ...{ static string strDo

imageview-安卓的ImageView中fitCenter和centerInside参数的区别是什么?

问题描述 安卓的ImageView中fitCenter和centerInside参数的区别是什么? 在ImageView中希望图片能够居中对齐,请问该如何设置android:scaleType比较好呢? 解决方案 fitCenter会按照ImageView大小对图片缩放,如果图片比ImageView大,那么centerInside会裁剪周围,只保留中间一块显示在ImageView.如果图片不超过ImageView的大小,两者一样. 参考:http://blog.csdn.net/encienqi

imageview-如何让图片在ImageView中全屏显示?

问题描述 如何让图片在ImageView中全屏显示? 在ScrollView中嵌套Linearlayout,在linearlayout布局中有很多的ImageView控件,然后在代码中添加帧动画,imageview指定大小时(比如layout_width="50dp"),图片可以正常显示,但是做屏幕适配的时,将imageview的layout_width和layout_height设置为match_parent后,所有的图片都是缩小显示,这是为什么?如何做才可以将图片全屏显示? 解决方

java-指定图片的缩略图放到ImageView中

问题描述 指定图片的缩略图放到ImageView中 在SD卡中获取的图片,路径: Uri selectedImageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+""/test/test/test1.jpg"")); 我已经设法获得了SD卡中所以图片的缩略图,现在怎么获取指定的那个? 解决方案 用UIImage的方法initWithContentsOfFile:得当图,再设

Android开发之实现手指直接拖动图片移动

一.基础知识:  要实现这一效果,需要一个容器来存放Gallrey显示的图片,这里使用一个继承自BaseAdapter类的派生类来装这些图片. 我们需要监听其事件setOnItemClickListener,从而确定用户当前选中的是哪一张图片. 首先,需要将所有要显示的图片的索引存放在一个int型数组中,然后通过setImageResource方法来设置ImageView要显示的图片资源,最后将 每张图片的ImageView显示在屏幕上.   二.代码展示: 1."main.xml"

Android App中实现图片异步加载的实例分享_Android

一.概述一般大量图片的加载,比如GridView实现手机的相册功能,一般会用到LruCache,线程池,任务队列等:那么异步消息处理可以用哪呢? 1.用于UI线程当Bitmap加载完成后更新ImageView 2.在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待消息的到达,当有消息到达时,从任务队列按照队列调度的方式(FIFO,LIFO等),取出一个任务放入线程池中进行处理. 简易的一个流程:当需

在Word 2010文档中裁剪图片

在Word 2010文档中,用户可以方便地对图片进行裁剪操作,以截取图片中最需要的部分,操作步骤如下所述: 第1步,打开Word 2010文档窗口,首先将图片的环绕方式设置为非嵌入型(参考教程<在Word 2010文档中设置图片文字环绕方式>).然后单击选中需要进行裁剪的图片.在"图片工具"功能区的"格式"选项卡中,单击"大小"分组中的"裁剪"按钮,如图2010060701所示. 图2010060701 单击&qu