Android照片墙实现 -- 布局设计以及数据处理
本文主要介绍照片墙的布局和数据处理
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照片墙实现 -- 布局设计以及数据处理相关推荐
- android界面组件布局设计
<?xml version="1.0" encoding="utf-8"?> <merge<LinearLayoutandroid:la ...
- android 平台 列表布局,Android 设计指南 - 风格
构建在任何设备上都引人注目的应用. Android 驱动了数百万计的手机.平板和其他设备,囊括了各种不同的屏幕尺寸和比例.利用 Android 灵活的布局系统,你可以创造出在各种设备上看起来都很优雅的 ...
- android html 布局设计工具,教你使用Android SDK布局优化工具layoutopt
创建好看的Android布局是个不小的挑战,当你花了数小时调整好它们适应多种设备后,你通常不想再重新调整,但笨重的嵌套布局效率往往非常低下,幸运的是,在Android SDK中有一个工具可以帮助你优化 ...
- Android studio线性布局用户界面设计
Android studio通过线性布局完成一个简单的个人信息的用户界面布局设计 线性布局需要考虑的就是水平还是垂直,通过 LinearLayout标签的一个必要属性android:orientati ...
- android中自适应布局教程,Android自适应布局设计技巧
由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...
- Android——六大基本布局总结
基本理论: Android六大基本布局分别是: 线性布局LinearLayout 表格布局TableLayout 相对布局RelativeLayout 层布局FrameLayout 绝对布局Absol ...
- 如何为Android上的产品设计一款合适的图标
如 果你已经完成了你的app,你一定会马上向其它人宣布这件事情.但是你需要注意一个很重要的问题,那就是app的图标.你的图标可能在项目启动之 前就已经设计好了,但我不喜欢这样,如果app没有完成实际上 ...
- android的五大布局(layout)
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...
- Android App的架构设计:从VM、MVC、MVP到MVVM
随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...
最新文章
- python菜鸟基础教程-Python3 面向对象
- <DependencyManagement>记录
- php中new意思,php 在一个类中new自己代表什么意思 ?是构造函数
- Cisco路由器故障诊断技术(3)
- Taro+react开发(48)taro中switchTab
- 工作111:直接写url
- 怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法
- arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO
- python 导航栏_解析导航栏的url--selnium,beautifulsoup实战
- spikingjelly中的ANN2SNN程序20201221是好使的
- Centos6.6部署Redis集群
- 偷偷告诉你,互联网公司理想的技术架构!
- 回文字符串,回文链表
- C语言—— 符号函数
- honeyview(蜂蜜浏览器)将图片置于顶层
- P2627 [USACO11OPEN]Mowing the Lawn G
- 数学建模 | MATLAB学习 | 插值 一维插值函数、三次样条插值
- Java 单例模式实现
- mysql slow query_Mysql 开启 Slow 慢查询
- html标签引入css样式的四种方式
热门文章
- Django教程:第一个Django应用程序(1部分)
- 如何获取本地时间信息,并把getDay()函数获取到的日期改为日一二三四五六
- [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL
- 十二道锋味——既是食,也是人
- 【智能产品方案】智能跳绳方案开发
- 有位程序员写了部「修仙小说版」编程教程!网友:蚌埠住了 ....
- leetcode_Hamming Distance
- 数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
- 群晖域名注册_手把手教你在群晖NAS上用自己的域名实现https访问
- 大数据分析R中泊松回归模型实例