在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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.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
使用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