当前位置: 移动技术网 > IT编程>移动开发>Android > Android重写ImageView实现图片镜像效果的代码教程

Android重写ImageView实现图片镜像效果的代码教程

2018年12月09日  | 移动技术网IT编程  | 我要评论

剑桥世界史,开讲啦 李健,儿童教育资源网

前两天朋友问我一个问题,如何实现从手机相册加载一张图片,实现拖拽、缩放功能并且能镜像显示,当时我的第一反应是继承imageview,重写ondraw方法,下面就按照这个思路实现下需求。

从系统相册选择图片

打开系统相册采用隐式intent,因为调用者需要接受返回的结果,所以使用startactivityforresult启动activity,打开系统相册核心代码如下

public final static int album_pic_code = 1;
...
intent intent = new intent(intent.action_pick);
intent.setdata(mediastore.images.media.external_content_uri);
startactivityforresult(intent, album_pic_code);

通过打印日志的方式看一下从系统相册中选择图片以后返回的内容是什么:

这里写图片描述

可以断定这是个uri,那么好,我们直接通过uri获取图片即可:<喎? f/ware/vc/"="" target="_blank" class="keylink">vcd4ncjxwcmugy2xhc3m9"brush:java;"> protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (requestcode == album_pic_code && resultcode == result_ok){ log.i("onactivityresult", data.getdata().tostring()); try { uri imageuri = data.getdata(); bitmap bitmap= bitmapfactory.decodestream(getcontentresolver().openinputstream(imageuri)); iv.setimagebitmap(bitmap); } catch (filenotfoundexception e) { e.printstacktrace(); } } }

这样我们就通过uri以流的方式载入了图片

重写imageview

载入图片以后,我们需要在显示以前对图片进行处理以达到所需的显示效果,我了方便我就直接对系统控件imageview进行重写来达到想要的功能。

拖拽功能

要实现拖拽功能,首先会想到重写ontouchevent方法,需要在手指落下时获取坐标点的信息,并在手指移动时根据移动的位置实时更新图片位置.

public boolean ontouchevent(motionevent event) {
 switch (event.getaction()) {
  case motionevent.action_down:
lastx = event.getx();
lasty = event.gety();
break;
  case motionevent.action_move:
float currentx = event.getx();
float currenty = event.gety();
offsetx += currentx - lastx;//计算移动距离
offsety += currenty - lasty;
lastx = currentx;//替换上一次位置
lasty = currenty;
break;
  case motionevent.action_up:
break;
  default:
break;
 }
 super.ontouchevent(event);
 return true;
}

重写ondraw方法对图片位置进行实时更新

protected void ondraw(canvas canvas) {
 if (bitmap != null) {
  bitmapwidth = bitmap.getwidth();
  bitmapheight = bitmap.getheight();
  try {
int scaleheight = (int) (viewwidth / (float) bitmapwidth * bitmapheight);
bitmapleft = (int) offsetx;
bitmapright = (int) (viewwidth + offsetx);
bitmaptop = (int) offsety;
bitmapbottom = (int) (scaleheight + offsety);
paint paint = new paint();
canvas.drawbitmap(bitmap, new rect(0, 0, bitmapwidth, bitmapheight),
  new rect(bitmapleft, bitmaptop, bitmapright, bitmapbottom), paint);
  } catch (exception e) {
e.printstacktrace();
  }
  invalidate();
 } else {
  try {
bitmap = ((bitmapdrawable) getdrawable()).getbitmap();
  } catch (exception e) {
e.printstacktrace();
bitmap = null;
  }
 }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网