前两天去超市逛东西,问老板娘这个东西多少钱,那个东西多少钱,但是一两分钟后就搞混了,当时就想,我不是写了一个todo的吗,可以再拍照放上去,这样就有对比啦!

于是兴冲冲地赶回家,把功能给实现了,虽然这功能到处都有,但是自己实现出来的就是不一样啊,界面丑点也是自己的孩子啊,而且这孩子会长大啊,可以继续完善的嘛。

由上面两张图可以看到:

1)在屏幕上方专门挖出了两块地来放两个Image

2)在右下角放了两个button,一个是挑选图片,一个是直接打开照相机照相,然后返回的图片就会放到这两个Image上面。

3)那么在后台肯定要先利用一张表来存放图片跟任务的关联的,在保存任务的时候,顺便把图片的路径也保存进去。

我们先来看看数据库的表的简单设计吧:

Task 表:

task_image_link 表:

可以看到,task_image_link表是以task表的_id为外键的,存储图片的路径。

下面再来看代码:

1)调用系统的相机和选择图库来挑选图片:

1.1)定义两个请求的request_code:

 public static final int REQUEST_FOR_CAMERA = 1;public static final int REQUEST_FOR_GALLERY = 2;

1.2)点击“照相”按钮时调用系统相机

 private void startCamera(){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);tempPhotoFileName = Helper.getPhotoFileName();File file = new File(tempPhotoFileName);if(file.exists()){file.delete();}Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, REQUEST_FOR_CAMERA);}

在这里,要首先保存一个文件到我们指定的路径,在这里我为了方便,是直接存到照相机的文件夹下面的:

 public static String getPhotoFileName() {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());Date date = new Date();return Environment.getExternalStorageDirectory().getPath() + "/DCIM/100ANDRO/Todo_" + dateFormat.format(date) + ".jpg";}

上文中Environment.getExternalStorageDirectory().getPath() 返回的路径就是"mnt/sdcard/"。

1.3)调用图库

 private void startGallery(){Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivityForResult(intent, REQUEST_FOR_GALLERY);}

其实我们可以看到,不管是调用照相机还是调用图库,都是发送一个Intent,里面包含了一些Action,而Android框架会根据Intent的匹配原则去找到相对应的应用的。

而且我们开启应用的是startActivityForResult这个应用,那么我们就要在Activity中实现一个OnActivityResult的方法来获得返回的状态跟数据,如下:

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){        if (requestCode == REQUEST_FOR_CAMERA) {if(resultCode == RESULT_OK){isPhotoTaken = true;           if (thumbnails[0] == 0) {photoFileNames[0] = tempPhotoFileName;Bitmap bitmap = BitmapReader.readBigBitmapFromFile(tempPhotoFileName, REQ_WIDTH);ibPhoto1.setImageBitmap(bitmap);ibPhoto1.invalidate();thumbnails[0] = 1;} else if (thumbnails[1] == 0) {photoFileNames[1] = tempPhotoFileName;Bitmap bitmap = BitmapReader.readBigBitmapFromFile(tempPhotoFileName, REQ_WIDTH);ibPhoto2.setImageBitmap(bitmap);ibPhoto2.invalidate();thumbnails[1] = 1;}}} else if (requestCode == REQUEST_FOR_GALLERY) {if(resultCode == RESULT_OK){isPhotoTaken = true;            ContentResolver resolver = getContentResolver();Uri uri = data.getData();tempPhotoFileName = Helper.getImagePath(resolver, uri);Log.v(TAG, "Gallery->ImagePath:" + tempPhotoFileName);try {Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, uri);Bitmap bitmap = Helper.zoomBitmap(photo, REQ_WIDTH, REQ_WIDTH);if (thumbnails[0] == 0) {                        photoFileNames[0] = tempPhotoFileName;ibPhoto1.setImageBitmap(bitmap);ibPhoto1.invalidate();thumbnails[0] = 1;}else if (thumbnails[1] == 0) {photoFileNames[1] = tempPhotoFileName;ibPhoto2.setImageBitmap(bitmap);ibPhoto2.invalidate();thumbnails[1] = 1;}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}hideCamera();}

在这里为图简单,我就没有写得很规范了,因为我只让它保存两张图片就够了,所以就只是简单的判断第一张图片是不是已经有了,有的话就放到第二个View上显示,然后就把两个按钮都给隐藏了。

然后在上面有一个标志isPhotoTaken,表明这次是保存了图片的,那么在保存这个任务的时候,就要顺便把它对应的图片信息也保存到表上,在Save的时候如下:

if(isPhotoTaken){if(thumbnails[0] == 1){saveImageLink(taskId, photoFileNames[0]);if(thumbnails[1] == 1){saveImageLink(taskId, photoFileNames[1]);}}
}

而saveImageLink代码如下:

 private void saveImageLink(String taskId, String imagePath){ContentValues imageLinkCV = new ContentValues();imageLinkCV.put(TableFields.TaskImageLinkFields.TASK_ID, taskId);imageLinkCV.put(TableFields.TaskImageLinkFields.IMAGE_PATH, imagePath);taskImageLinkManager.insert(imageLinkCV);}

这样我们就把信息给储存起来了。

到这里,在原来的基础上,这个功能就简单地实现了,哈哈,是可以满足我去比价看图的需求了。

如果真的要做的漂亮一点的话,其实在两个Image那里,大家可以把它实现成3D画廊的效果,然后点击每一个图片,可以打开大图来详细端详(其实我那里是ImageButton来的)。
没有实现3D,但是实现了画廊的效果,大家如果有兴趣,可以看一下,源代码也在那边下载:

Android学习小Demo(10)ToDoList的改进版之ViewPager显示多个图片

Android学习小Demo(10)ToDoList的加强版相关推荐

  1. Android学习小Demo(10)ToDoList的改进版之ViewPager显示多个图片

    在TodoList增强版的增加界面上,为了显示图片,我是挖了两块地方,放了两个ImageButton,来显示图片,而且限制了最多只能放两张图片.当两个View都放置图片之后,我就会把"Gal ...

  2. Android学习小Demo(9)一个To Do List的实现

    记得看过一篇文章,是说一个人临走之前,列下了想做的最后100件事情,然后拿着这张便签,一件一件地去实现.又想起乔布斯说,如果今天是你的最后一天,你会怎么过? 我有很多事情想做,想写很多的文章,但是时间 ...

  3. Android学习小Demo(12)TodoList实现ListView的分组实现

    很多情况下, 我们想要ListView上面展示的东西是可以分组的,比如联系人列表,国家列表啊,这样看起来数据的展现比较有层次感,而且也有助于我们快速定位到某一个具体的条目上,具体效果请看下图: 这是前 ...

  4. Android学习小Demo(11)一个显示行线的自定义EditText

    今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...

  5. Android学习小Demo(13)Android中关于ContentObserver的使用

    在一些应用上,比如手机银行,QQ,微信等,很多时候我们都需要通过发送验证码到手机上,然后把验证码填上去,然后才能成功地继续去做下面一步事情. 而如果每次我们都要离开当前界面,然后去查收短信,记住验证码 ...

  6. Android学习小Demo(14)Android中关于PopupWindow的使用

    在一些场景中,我们希望能够点击按钮, 然后弹出一个菜单,而这个菜单是显示在屏幕的中央的,那么在Android中可以通过PopupWindow来实现这个效果. 具体效果如下图: 如上图中,我们点击&qu ...

  7. Android计步器小Demo

    描述 android计步器的实现,自定义的一个弧形进度条,记步通过手机的传感器来实现,也就是说不支持传感器的机子(应该很老的了吧)就没有效果.看看效果图: 自定义View public class S ...

  8. MATLAB信号处理---学习小案例(10)---Z反变换

    定义X(z)X(z)X(z)的Z反变换(IZT)为x(n)=12πj∮CX(z)zn−1dzx(n)=\frac{1}{2\pi j} \oint_{C}X(z)z^{n-1}dzx(n)=2πj1​ ...

  9. 初次使用Fleck+redis订阅发布实现学习小demo

    https://www.cnblogs.com/SupPilot/p/10396333.html 首先安装Fleck的程序包添加引用下面是客户端代码: 客户端代码: 运行效果: 遇到的问题: Q:通常 ...

最新文章

  1. 透视鹏程.盘古:首个2000亿参数中文大模型是怎样炼成的?
  2. php电商交押金的逻辑,PHP高并发下抢购、秒杀功能的超卖问题
  3. 电动力学每日一题 2021/10/13 用Fourier变换法计算静止电荷产生的电场
  4. 【小项目关键技术四】液晶显示屏
  5. Hive几种数据导入方式
  6. Exception: com.mchange.v2.c3p0.impl.NewProxyConnection cannot be cast to com.mysql.jdbc.Connection
  7. 完成登录并生成JWT
  8. 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)
  9. c语言 大数相加,c/c++开发分享C语言计算大数相加的方法
  10. MariaDB一之编译安装MariaDB、MariaDB初始化及MariaDB的图形化工具
  11. Js执行机制——同步和异步
  12. aws ebs分类_AWS EBS – Amazon Elastic Block Storage
  13. myeclipse优化方案 myeclipse 10 优化
  14. ArcGIS多面体(multipatch)解析——引
  15. 中柏平板u盘启动_中柏A13笔记本如何进bios设置u盘启动
  16. halcon calculate_lines_gauss_parameters算子详解
  17. 论文解读| NeurIPS 2022:面向科学任务的图神经网络设计
  18. 两问表和三问表哪个更少_[三问三解]关于问表和三问表的区别
  19. android官方自带下拉刷新功能
  20. JSP标签隐藏以及不可修改

热门文章

  1. memcmp与strcmp区别
  2. 小程序代理创业成功的五个条件
  3. 撤销commit且未push操作的git命令
  4. CentOS 6升级默认python版本
  5. 制作本地yum镜像站
  6. MySQL【第三篇】数据类型
  7. 微软发布2016年5月安全补丁 提醒及时修复
  8. linux面试题:删除一个目录下的所有文件,但保留一个指定文件
  9. Hibernate知识点总结
  10. 运算符优先级(图表)