本文主要介绍照片墙的布局和数据处理

1. 主界面为GridView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content" ><GridView android:layout_marginLeft="12dp"android:layout_marginRight="12dp"android:id="@+id/photo_wall"android:layout_width="fill_parent"  android:layout_height="fill_parent"android:columnWidth="90dp"android:numColumns="auto_fit"android:verticalSpacing="12dp"android:horizontalSpacing="12dp"android:stretchMode="columnWidth"android:gravity="center"></GridView></LinearLayout>

2. 图片的样式设计

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content" android:background="#00000000"><ImageView android:id="@+id/photo"android:background="@+drawable/android:picture_frame"android:layout_width="100dp"android:layout_height="110dp"  android:layout_gravity="center"android:scaleType="fitXY"android:paddingRight="10dp"android:paddingBottom="10dp"/></RelativeLayout>

很简单,有两个需要注意的地方

a. 将图片设置为同样尺寸

原本打算通过计算图像按比例进行缩小,但是实现效果不好,出现卡顿,主要因为处理图片比较耗时,最后采用的版本是对图层进行裁剪,使得图片自动填充组件

 android:scaleType="fitXY"

b. 增加图片底层阴影效果

百度了一下,有三种方法:1.使用shape方法  2. 使用plant画笔  3.使用android:elevation

找了很久,再参考谷歌Deamon,最后发现还有一种方法,就是我最好采用的

android:background="@+drawable/android:picture_frame"

谷歌原来就已经提供了带阴影的组件,非常方便,但是效果不是很明显,加个白边

android:paddingRight="10dp"
android:paddingBottom="10dp

duang~ 效果一下就出来了,有木有

对比前两种方法,是方便很多,第三种方法可以自定义阴影大小,非常强大 , 但是不知的地方就是只有5.0以上才支持

3.数据处理

基本数据处理和之前 MediaPlayer一样

a. 定义数据类型 ImgInfo

package com.saberhao.support;import java.io.File;import com.saberhao.shpicturewall.R;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;public class ImgInfo
{long      mId = 0;ImageInfo mImageInfo = null;public ImgInfo(){mImageInfo = new ImageInfo();}public void setId(long id){mId = id;}public long getId(){return mId;}public int getOrientation(){return mImageInfo.orientation;}public void setOrientation(int orientation){this.mImageInfo.orientation = orientation;}public Drawable getErrorDrawable(){return mImageInfo.errorDrawable;}public void setErrorDrawable(Context context){int id = R.drawable.missing_thumb_picture;mImageInfo.errorDrawable = (null != context) ? context.getResources().getDrawable(id) : null;}public Bitmap getImageThumb(){return mImageInfo.imageThumb;}public void setImageThumb(Bitmap imageThumb){if (this.mImageInfo.imageThumb != imageThumb){this.mImageInfo.imageThumb = imageThumb;}}public void setErrorBitmap(Bitmap errorBitmap){if (this.mImageInfo.errorBitmap != errorBitmap){this.mImageInfo.errorBitmap = errorBitmap;}}public Bitmap getOriImage(){return mImageInfo.oriImage;}public void setOriImage(Bitmap image){this.mImageInfo.oriImage = image;}public Uri getImageUri(){return mImageInfo.imageUri;}public void setImageUri(Uri imageUri){this.mImageInfo.imageUri = imageUri;}public String getDisplayName(){return mImageInfo.displayName;}public void setDisplayName(String displayName){this.mImageInfo.displayName = displayName;}public String getFullPath(){return mImageInfo.fullPath;}public void setFullPath(String fullPath){this.mImageInfo.fullPath = fullPath;}public String getFileName(){if (null == mImageInfo.fullPath){return null;}mImageInfo.fileName = new File(mImageInfo.fullPath).getName();return mImageInfo.fileName;}public void setTitle(String title){mImageInfo.title = title;}public void setSize(long size){mImageInfo.size = size;}public void setDateAdded(long dateAdded){mImageInfo.dateAdded = dateAdded;}public void setDateModified(long dateModified){mImageInfo.dateModified = dateModified;}public void setMimeType(String mimeType){mImageInfo.mimeType = mimeType;}public void setDescription(String desc){mImageInfo.desc = desc;}public void setIsPrivate(int isPrivate){mImageInfo.isPrivate = isPrivate;}public void setLatitude(double latitude){mImageInfo.latitude = latitude;}public void setLongGitude(double longitude){mImageInfo.longitude = longitude;}public void setMiniThumbMagic(int miniThumbMagic){mImageInfo.miniThumbMagic = miniThumbMagic;}public void setBucketId(String bucketId){mImageInfo.bucketId = bucketId;}public void setOrientation(String orientation){}public void setDateTaken(long dateTaken){mImageInfo.dateTaken = dateTaken;}public void setBucketDisplayName(String displayName){mImageInfo.displayName = displayName;}public void setPicasaId(String picasaId){mImageInfo.picasaId = picasaId;}public void setBytes(byte[] bytes){mImageInfo.bytes = bytes;}@SuppressWarnings("unused")private static class ImageInfo{private int     orientation = 0;private boolean canRecycle  = true;private Bitmap  imageThumb  = null;private Bitmap  errorBitmap = null;private Bitmap  oriImage    = null;private Drawable errorDrawable = null;private Uri     imageUri    = null;private String  displayName = null;private String  fullPath    = null;private String  fileName    = null;private String  title;private long size;private long dateAdded;private long dateModified;private String mimeType;private String desc;private int isPrivate;private double latitude;private double longitude;private int miniThumbMagic;private String bucketId;private long dateTaken;private String bucketDisplayName;private String picasaId;private byte[] bytes;}
}

b. 定义相关操作 LocalImgSet.java

public class LocalImgSet {/*** 用于从数据库中查询图片的信息,保存在ImageDataSet集合当中* * @return*/public static ImageDataSet<ImgInfo> getImageInfos(Context context) {Cursor cursor = null;ImageDataSet<ImgInfo> imginfos = new ImageDataSet<ImgInfo>();String[] proj = {MediaStore.MediaColumns._ID,            // INTEGERMediaStore.MediaColumns.DISPLAY_NAME,   // TEXTMediaStore.MediaColumns.TITLE,          // TEXTMediaStore.MediaColumns.DATA,           // TEXTMediaStore.MediaColumns.SIZE,           // LONGMediaStore.MediaColumns.DATE_ADDED,     // INTEGERMediaStore.MediaColumns.DATE_MODIFIED,  // INTEGERMediaStore.MediaColumns.MIME_TYPE,      // TEXTMediaStore.Images.ImageColumns.DESCRIPTION, // TEXTMediaStore.Images.ImageColumns.IS_PRIVATE,  // INTEGERMediaStore.Images.ImageColumns.LATITUDE,    // DOUBLEMediaStore.Images.ImageColumns.LONGITUDE,   // DOUBLEMediaStore.Images.ImageColumns.MINI_THUMB_MAGIC,    // INTEGERMediaStore.Images.ImageColumns.BUCKET_ID,   // TEXTMediaStore.Images.ImageColumns.ORIENTATION, // TEXTMediaStore.Images.ImageColumns.DATE_TAKEN,  // INTEGERMediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, // TEXTMediaStore.Images.ImageColumns.PICASA_ID,   // TEXT};Uri baseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;try{cursor = context.getContentResolver().query(baseUri, proj, null, null, null);for(int i = 0; i < cursor.getCount(); i++) {cursor.moveToNext();ImgInfo imginfo = new ImgInfo();//fill the picture infoimginfo.setId(cursor.getLong(0));imginfo.setDisplayName(cursor.getString(1));imginfo.setTitle(cursor.getString(2));imginfo.setFullPath(cursor.getString(3));imginfo.setSize(cursor.getLong(4));imginfo.setDateAdded(cursor.getLong(5));imginfo.setDateModified(cursor.getLong(6));imginfo.setMimeType(cursor.getString(7));imginfo.setDescription(cursor.getString(8));imginfo.setIsPrivate(cursor.getInt(9));imginfo.setLatitude(cursor.getDouble(10));imginfo.setLongGitude(cursor.getDouble(11));imginfo.setMiniThumbMagic(cursor.getInt(12));imginfo.setBucketId(cursor.getString(13));imginfo.setOrientation(cursor.getInt(14));imginfo.setDateTaken(cursor.getLong(15));imginfo.setBucketDisplayName(cursor.getString(16));imginfo.setPicasaId(cursor.getString(17));imginfo.setImageUri(Uri.withAppendedPath(baseUri, String.valueOf(imginfo.getId())));imginfo.setBytes(new byte[1024*6]);imginfos.add(imginfo);     } } catch(Exception e) {e.printStackTrace();} finally {if(cursor != null)cursor.close();           }return imginfos;}}

下一篇文章我们将 介绍 图片加载 ,敬请期待

如果需要源码的,请 点击  saberhao的照片墙 下载

Android照片墙实现 -- 布局设计以及数据处理相关推荐

  1. android界面组件布局设计

    <?xml version="1.0" encoding="utf-8"?> <merge<LinearLayoutandroid:la ...

  2. android 平台 列表布局,Android 设计指南 - 风格

    构建在任何设备上都引人注目的应用. Android 驱动了数百万计的手机.平板和其他设备,囊括了各种不同的屏幕尺寸和比例.利用 Android 灵活的布局系统,你可以创造出在各种设备上看起来都很优雅的 ...

  3. android html 布局设计工具,教你使用Android SDK布局优化工具layoutopt

    创建好看的Android布局是个不小的挑战,当你花了数小时调整好它们适应多种设备后,你通常不想再重新调整,但笨重的嵌套布局效率往往非常低下,幸运的是,在Android SDK中有一个工具可以帮助你优化 ...

  4. Android studio线性布局用户界面设计

    Android studio通过线性布局完成一个简单的个人信息的用户界面布局设计 线性布局需要考虑的就是水平还是垂直,通过 LinearLayout标签的一个必要属性android:orientati ...

  5. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  6. Android——六大基本布局总结

    基本理论: Android六大基本布局分别是: 线性布局LinearLayout 表格布局TableLayout 相对布局RelativeLayout 层布局FrameLayout 绝对布局Absol ...

  7. 如何为Android上的产品设计一款合适的图标

    如 果你已经完成了你的app,你一定会马上向其它人宣布这件事情.但是你需要注意一个很重要的问题,那就是app的图标.你的图标可能在项目启动之 前就已经设计好了,但我不喜欢这样,如果app没有完成实际上 ...

  8. android的五大布局(layout)

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...

  9. Android App的架构设计:从VM、MVC、MVP到MVVM

    随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...

最新文章

  1. python菜鸟基础教程-Python3 面向对象
  2. <DependencyManagement>记录
  3. php中new意思,php 在一个类中new自己代表什么意思 ?是构造函数
  4. Cisco路由器故障诊断技术(3)
  5. Taro+react开发(48)taro中switchTab
  6. 工作111:直接写url
  7. 怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法
  8. arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO
  9. python 导航栏_解析导航栏的url--selnium,beautifulsoup实战
  10. spikingjelly中的ANN2SNN程序20201221是好使的
  11. Centos6.6部署Redis集群
  12. 偷偷告诉你,互联网公司理想的技术架构!
  13. 回文字符串,回文链表
  14. C语言—— 符号函数
  15. honeyview(蜂蜜浏览器)将图片置于顶层
  16. P2627 [USACO11OPEN]Mowing the Lawn G
  17. 数学建模 | MATLAB学习 | 插值 一维插值函数、三次样条插值
  18. Java 单例模式实现
  19. mysql slow query_Mysql 开启 Slow 慢查询
  20. html标签引入css样式的四种方式

热门文章

  1. Django教程:第一个Django应用程序(1部分)
  2. 如何获取本地时间信息,并把getDay()函数获取到的日期改为日一二三四五六
  3. [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL
  4. 十二道锋味——既是食,也是人
  5. 【智能产品方案】智能跳绳方案开发
  6. 有位程序员写了部「修仙小说版」编程教程!网友:蚌埠住了 ....
  7. leetcode_Hamming Distance
  8. 数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
  9. 群晖域名注册_手把手教你在群晖NAS上用自己的域名实现https访问
  10. 大数据分析R中泊松回归模型实例