Android应用开发之Android重写ImageView实现图片镜像效果的代码教程
白羽 2018-12-19 来源 :网络 阅读 448 评论 0

摘要:本文将带你了解Android应用开发Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助。


 

前两天朋友问我一个问题,如何实现从手机系统相册加载一张图片,实现拖拽、缩放功能并且能镜像显示,当时我的第一反应是继承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获取图片即可:<喎�"/kf/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;

  }

 }

}

   

          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程