在ImageView中拖动图片
发布日期:2021-06-30 11:22:24 浏览次数:2 分类:技术文章

本文共 4468 字,大约阅读时间需要 14 分钟。

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如下:

 

转载地址:https://it9527.blog.csdn.net/article/details/8485484 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:自定义Toast
下一篇:Android手势操作(一)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月07日 00时08分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

学习笔记(33):一学即懂的计算机视觉(第一季)-图像分割实战演练(II) 2019-04-30
学习笔记(34):一学即懂的计算机视觉(第一季)-图像表示与描述 2019-04-30
学习笔记(35):一学即懂的计算机视觉(第一季)-图像表示与描述II 2019-04-30
学习笔记(36):一学即懂的计算机视觉(第一季)-图像表示描述实战演练 2019-04-30
学习笔记(37):一学即懂的计算机视觉(第一季)-总结 2019-04-30
学习笔记(38):高并发下的Nginx性能优化实战-Nginx优势特点总结 2019-04-30
学习笔记(40):高并发下的Nginx性能优化实战-nginx命令 2019-04-30
学习笔记(41):高并发下的Nginx性能优化实战-Linux下Nginx的安装(一) 2019-04-30
学习笔记(42):高并发下的Nginx性能优化实战-Nginx配置文件详解 2019-04-30
学习笔记(44):高并发下的Nginx性能优化实战-Nginx配置web应用集群搭建 2019-04-30
学习笔记(45):高并发下的Nginx性能优化实战-Nginx负载均衡(一) 2019-04-30
QLineEdit和QDateTimeEdit等含编辑框使用stylesheet配置背景透明时,鼠标进入离开背景闪烁问题的解决 2019-04-30
使用Poco库进行加解密和签名验签 2019-04-30
走进开源代码(一) 2019-04-30
走进开源代码(二) 2019-04-30
[转]深度剖析闪电网络 2019-04-30
听李天飞《大话西游》有感 2019-04-30
走进开源代码(三) 2019-04-30
Linux下开发Qt界面程序时命令行传参数的一个坑 2019-04-30
SourceInsight使用技巧(转) 2019-04-30