来源:毕设

关键词:Bitmap Canvas

//毕设中需要自定义室内地图,并且在地图上绘制轨迹

//此处是一个测试Demo,实现图片的加载和记录手指在屏幕上的运动轨迹

图片的载入

使用系统提供的内容提供者,要点如下:

1.调用android图库的方式:Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

2.使用startActivityForResult(Intent intent, int requestCode) & onActivityResult(int requestCode, int resultCode, Intent data)返回结果到该activity.

3.权限:

4.Bitmap&Canvas的使用见注释内容

        mLoadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//调用android图库
startActivityForResult(intent, RESULT);
}
});
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode ==RESULT_OK) {
try { Uri imageFileUri = data.getData();
Display defaultDisplay = getWindowManager().getDefaultDisplay();
float ddw = defaultDisplay.getWidth();
float ddh = defaultDisplay.getHeight(); //BitmapFactory.Options options = new BitmapFactory().Options();//注意别写错了,options是静态内部类,需要直接使用外部类直接饮用
BitmapFactory.Options options = new BitmapFactory.Options();
/**
* inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
* 先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息,利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,
* 再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据。
* 先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。
*/
options.inJustDecodeBounds = true;
mBitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageFileUri), null, options);//需要权限android.permission.READ_EXTERNAL_STORAGE //计算缩放因子
int heightRatio = (int) Math.ceil(options.outHeight/ddh);
int widthRatio = (int) Math.ceil(options.outWidth/ddw);
if (heightRatio > widthRatio) {
options.inSampleSize = heightRatio;
} else {
options.inSampleSize = widthRatio;
} options.inJustDecodeBounds = false;
mBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, options);
mAlterBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig()); mCanvas = new Canvas(mAlterBitmap);
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(5);
Matrix matrix = new Matrix();//矩阵 mCanvas.drawBitmap(mBitmap, matrix, mPaint);
mIv.setImageBitmap(mAlterBitmap); } catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

在图片上绘制

图片被加载到了ImageView控件mIv中,通过设置mIv.setOnTouchListener(),可以实现在图片上的绘制.

                mIv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
break;
case MotionEvent.ACTION_MOVE:
upx = event.getX();
upy = event.getY();
mCanvas.drawLine(downx, downy, upx, upy, mPaint);
mIv.invalidate();
downx = upx;
downy = upy;
break;
case MotionEvent.ACTION_UP:
break; default:
break;
} return true;
}
});

图片的保存

mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//保存画好的图片
if(mAlterBitmap!=null){
try {
Uri imageUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
OutputStream outputStream=getContentResolver().openOutputStream(imageUri);
mAlterBitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
Toast.makeText(getApplicationContext(), "save!", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
});

效果图

github地址:https://github.com/zhangbz/BitmapTest

android 加载自定义图片并在图片上绘图的更多相关文章

  1. android 加载图片框架--Glide使用详解

    一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...

  2. Android加载图片的策略

    实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...

  3. android加载gif图片

    Android加载GIF图片的两种方式 方式一:使用第三开源框架直接在布局文件中加载gif 1.在工程的build.gradle中添加如下 buildscript { repositories { m ...

  4. Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

    1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...

  5. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  6. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

    Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ...

  7. TensorFlow2.0(10):加载自定义图片数据集到Dataset

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  8. Android加载图片小结

    应用中用到图片加载需要解决的问题 无网络环境下图片不可用 图片的本地缓存,或者默认预加载的图片 低配置机型,加载图像资源超内存(OutOfMemory, OoM) 需要合理使用内存,尤其是bitmap ...

  9. wp加载本地HTML(附带图片,CSS,JS)

    wp加载本地HTML(附带图片,CSS,JS) Windows Phone:Load Local HTML with Img,Css,Js by 唐小崇 http://www.cnblogs.com/ ...

随机推荐

  1. Git undo 操作

    相比传统的版本管理工具,git 的 undo 操作也不是很简单明了,本文尝试总结常用的 undo 操作. 重新提交 应该避免考虑不周全的提交,但这太难了.因此Git 专门提供了一个命令来弥补粗心的提交 ...

  2. C#2.0 to 4.0

    //xmlElement.set_InnerText(value); xmlElement.InnerText = value; ).ToCharArray());//Convert.ToChar(s ...

  3. .Net实现拉勾网爬虫

    前几天看到一个.NET Core写成的爬虫,有些莫名的小兴奋,之前一直用集搜客去爬拉勾网的招聘信息,这个傻瓜化工具相当于用HTML模板页去标记DOM节点,然后在浏览器窗口上模拟人的浏览行为同时跟踪节点 ...

  4. printf的题目

    以前学习于渊老师的<自己动手写操作系统>一书的时候,也自己实现过printf,不过那是比较简单的版本.最近看<程序员面试宝典>,做到这么一道题目:#include <st ...

  5. asp.net动态生成按钮Button控件

    1.动态生成button控件及响应服务端和客户端事件 void BindButtons(){ foreach (var item in items) { Button Btn = new Button ...

  6. Android文件的分割和组装

    使用UDP数据包发送文件时,由于UDP数据包大小的限制,一个文件要放在几个UDP数据包里面发送,这就需要把一个文件分割成若干部分,分别放进若干个UDP数据包里面,在接收端,收到这些UDP数据包以后,再 ...

  7. hibernate----1-1-----两表关联属性放在另一个表里面

    package com.ij34.dao; import javax.persistence.*; @Entity @Table(name="Address_inf") publi ...

  8. 让 ListView 在 Android 可回弹

    说明:让 ListView 在 Android 可回弹. 适用:Delphi XE5 修改:找出 FMX.Platform.Android.pas 档案,并复制到自己的 Project 路径里,找到 ...

  9. 转:python signal信号

    转自:http://www.jb51.net/article/74844.htm 在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点 ...

  10. Python的sorted函数应用

    sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88) ...