Android仿iphone时间轴相册

实现效果:

首先写需要用到的图片数据:时间、文件名、路径等

[html]  view plain  copy
  1. package com.example.a550211.cd;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. /**  
  7.  * Created by xing on 2017/7/4.  
  8.  */  
  9.   
  10. public class ImageTime {  
  11.     private long time;  
  12.     private String thumbPath;  
  13.   
  14.     private String filePath;  
  15.     private String fileName;  
  16.   
  17.     public String getFileName() {  
  18.         return fileName;  
  19.     }  
  20.   
  21.     public void setFileName(String fileName) {  
  22.         this.fileName = fileName;  
  23.     }  
  24.   
  25.     public String getDate() {  
  26.         return new SimpleDateFormat("yyyy年MM月dd日")  
  27.                 .format(new Date(time*1000L));  
  28.     }  
  29.   
  30.     public long getTime() {  
  31.         return time;  
  32.     }  
  33.   
  34.     public void setTime(long time) {  
  35.         this.time = time;  
  36.     }  
  37.   
  38.     public String getThumbPath() {  
  39.         return thumbPath;  
  40.     }  
  41.   
  42.     public void setThumbPath(String thumbPath) {  
  43.         this.thumbPath = thumbPath;  
  44.     }  
  45.   
  46.     public String getFilePath() {  
  47.         return filePath;  
  48.     }  
  49.   
  50.     public void setFilePath(String filePath) {  
  51.         this.filePath = filePath;  
  52.     }  
  53. }  
2、实现手机图片的获取,这里使用LoaderCallbacks<Cursor>去获取手机图片,然后保存到date数据中

[html]  view plain  copy
  1. package com.example.a550211.cd;  
  2.   
  3. import android.app.LoaderManager;  
  4. import android.content.CursorLoader;  
  5. import android.content.Loader;  
  6. import android.database.Cursor;  
  7. import android.provider.MediaStore;  
  8. import android.support.v7.app.AppCompatActivity;  
  9. import android.os.Bundle;  
  10.   
  11. import com.trustyapp.gridheaders.TrustyGridGridView;  
  12.   
  13. import java.io.File;  
  14. import java.util.ArrayList;  
  15.   
  16. public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {  
  17.   
  18.     private TrustyGridGridView gvImage;  
  19.     private ImageAdapter adapter;  
  20.     private ArrayList<ImageTime> fileInfo;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         initView();  
  28.   
  29.     }  
  30.   
  31.     private void initView() {  
  32.   
  33.         gvImage = (TrustyGridGridView)findViewById(R.id.gv_image);  
  34.         adapter = new ImageAdapter(this,fileInfo);  
  35.         gvImage.setAdapter(adapter);  
  36.   
  37.         fileInfo = new ArrayList<>();  
  38.         getLoaderManager().initLoader(1, null, this);  
  39.     }  
  40.   
  41.     @Override  
  42.     public Loader<Cursor> onCreateLoader(int id, Bundle args) {  
  43.         String[] STORE_IMAGES = {  
  44.                 MediaStore.Images.Media.DATA,  
  45.                 MediaStore.Images.Media.DATE_ADDED,  
  46.                 MediaStore.Images.Thumbnails.DATA  
  47.         };  
  48.         CursorLoader cursorLoader = new CursorLoader(  
  49.                 this,  
  50.                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  51.                 STORE_IMAGES,  
  52.                 null,  
  53.                 null,  
  54.                 null);  
  55.         return cursorLoader;  
  56.     }  
  57.   
  58.     @Override  
  59.     public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
  60.         if (cursor.moveToNext()){  
  61.   
  62.             int thumbPathIndex = cursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA);  
  63.             int timeIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED);  
  64.             int pathIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);  
  65.   
  66.             do{  
  67.                 ImageTime fi = new ImageTime();  
  68.                 String thumbPath = cursor.getString(thumbPathIndex);  
  69.                 Long date = cursor.getLong(timeIndex);  
  70.                 String filepath = cursor.getString(pathIndex);  
  71.   
  72.                 File f = new File(filepath);  
  73.                 fi.setTime(date);  
  74.                 fi.setThumbPath(thumbPath);  
  75.                 fi.setFilePath(filepath);  
  76.                 fi.setFileName(f.getName());  
  77.                 fileInfo.add(fi);  
  78.   
  79.             }while (cursor.moveToNext());  
  80.         }  
  81.   
  82.         adapter.setData(fileInfo);  
  83.         adapter.notifyDataSetChanged();  
  84.     }  
  85.   
  86.     @Override  
  87.     public void onLoaderReset(Loader<Cursor> loader) {  
  88.   
  89.     }  
  90. }  
3、adapter中显示数据实现,这里使用到了TrustyGridSimpleAdapter,这里面有两个方法getHeaderId和getHeaderView具体功能实现下面代码。

[html]  view plain  copy
  1. package com.example.a550211.cd;  
  2.   
  3. import android.content.Context;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7. import android.widget.ImageView;  
  8. import android.widget.TextView;  
  9. import com.bumptech.glide.Glide;  
  10. import com.bumptech.glide.signature.MediaStoreSignature;  
  11. import com.trustyapp.gridheaders.TrustyGridSimpleAdapter;  
  12. import java.io.File;  
  13. import java.text.ParseException;  
  14. import java.text.SimpleDateFormat;  
  15. import java.util.ArrayList;  
  16. import java.util.Date;  
  17.   
  18. /**  
  19.  * Created by xing on 2017/7/11.  
  20.  */  
  21.   
  22. public class ImageAdapter extends BaseAdapter implements TrustyGridSimpleAdapter {  
  23.     private Context mContext;  
  24.   
  25.     private ArrayList<ImageTime> fileInfo;  
  26.   
  27.     public ImageAdapter(Context mContext,ArrayList<ImageTime> fileInfo) {  
  28.         this.mContext = mContext;  
  29.         this.fileInfo =fileInfo;  
  30.     }  
  31.   
  32.     public void setData(ArrayList<ImageTime> fileInfo){  
  33.         this.fileInfo = fileInfo;  
  34.     }  
  35.   
  36.     @Override  
  37.     public int getCount() {  
  38.         int count = 0;  
  39.         if (fileInfo!=null && fileInfo.size()>0){  
  40.             count = fileInfo.size();  
  41.         }  
  42.         return count;  
  43.     }  
  44.   
  45.     @Override  
  46.     public Object getItem(int position) {  
  47.         return position;  
  48.     }  
  49.   
  50.     @Override  
  51.     public long getItemId(int position) {  
  52.         return position;  
  53.     }  
  54.   
  55.     class ViewHolder{  
  56.         ImageView ivImage;  
  57.     }  
  58.   
  59.     @Override  
  60.     public View getView(int position, View convertView, ViewGroup parent) {  
  61.         ViewHolder viewHolder = null;  
  62.         if (convertView==null){  
  63.             viewHolder = new ViewHolder();  
  64.             convertView = View.inflate(mContext,R.layout.item_image,null);  
  65.   
  66.             viewHolder.ivImage = (ImageView)convertView.findViewById(R.id.iv_image);  
  67.   
  68.             convertView.setTag(viewHolder);  
  69.         }else {  
  70.             viewHolder = (ViewHolder)convertView.getTag();  
  71.         }  
  72.   
  73.         if (fileInfo!=null && fileInfo.size()>0) {  
  74.   
  75.             File file = new File(fileInfo.get(position).getFilePath());  
  76.             Glide.with(mContext).load(file).asBitmap().dontAnimate().centerCrop()  
  77.                     .signature(new MediaStoreSignature("image/jpeg", file.lastModified(), 0))  
  78.                     .into(viewHolder.ivImage);  
  79.         }  
  80.         return convertView;  
  81.     }  
  82.   
  83.     class HeaderViewHolder {  
  84.         public TextView tvTimeHeader;  
  85.     }  
  86.   
  87.     @Override  
  88.     public View getHeaderView(int position, View convertView, ViewGroup viewGroup) {  
  89.   
  90.         HeaderViewHolder mHeadViewHolder = null;  
  91.         if (convertView==null){  
  92.             mHeadViewHolder = new HeaderViewHolder();  
  93.             convertView = View.inflate(mContext,R.layout.item_time_header,null);  
  94.   
  95.             mHeadViewHolder.tvTimeHeader = (TextView) convertView.findViewById(R.id.tv_time_header);  
  96.   
  97.             convertView.setTag(mHeadViewHolder);  
  98.         }else {  
  99.             mHeadViewHolder = (HeaderViewHolder)convertView.getTag();  
  100.         }  
  101.   
  102.         mHeadViewHolder.tvTimeHeader.setText(fileInfo.get(position).getDate());  
  103.   
  104.         return convertView;  
  105.     }  
  106.   
  107.     @Override  
  108.     public long getHeaderId(int i) {  
  109.        // File file = new File(fileInfo.get(i).getFilePath());  
  110.         return getTimeId(fileInfo.get(i).getDate());  
  111.       //  return getTimeId(strToDateLong(file.lastModified()));  
  112.     }  
  113.   
  114.     public long getTimeId(String date) {  
  115.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");  
  116.         Date mDate = null;  
  117.   
  118.         try {  
  119.             mDate = sdf.parse(date);  
  120.         } catch (ParseException e) {  
  121.             // TODO Auto-generated catch block  
  122.             e.printStackTrace();  
  123.         }  
  124.         return mDate.getTime();  
  125.     }  
  126.   
  127.     public String strToDateLong(long time) {  
  128.         Date date = new Date(time);  
  129.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");  
  130.         return sdf.format(date);  
  131.     }  
  132.   
  133. }  
实现的三个布局文件,都比较简单

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:paddingBottom="@dimen/activity_vertical_margin"  
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  9.     android:paddingRight="@dimen/activity_horizontal_margin"  
  10.     android:paddingTop="@dimen/activity_vertical_margin"  
  11.     tools:context="com.example.a550211.cd.MainActivity">  
  12.   
  13.     <com.trustyapp.gridheaders.TrustyGridGridView  
  14.         android:id="@+id/gv_image"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="match_parent"  
  17.         android:horizontalSpacing="3dp"  
  18.         android:numColumns="4"  
  19.         android:padding="3dp"  
  20.         android:verticalSpacing="3dp"></com.trustyapp.gridheaders.TrustyGridGridView>  
  21. </RelativeLayout>  
[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/iv_image"  
  9.         android:layout_width="104dp"  
  10.         android:layout_height="104dp"  
  11.         android:layout_centerInParent="true"  
  12.         android:scaleType="fitXY"  
  13.         />  
  14.   
  15. </LinearLayout>  
[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tv_time_header"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="34dp"  
  11.         android:layout_marginLeft="17dp"  
  12.         android:text="fdsfsdfsdf"  
  13.         android:gravity="center"  
  14.         android:textColor="#000000"  
  15.         android:textSize="15sp" />  
  16. </LinearLayout>  

需要使用到的权限:

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  2.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
最后记得添加jar包,下载路径: http://download.csdn.net/download/u011324501/9895566

代码下载地址:http://download.csdn.net/download/u011324501/9895782

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
仿iPhone热门应用栏是一个非常流行的产品趋势,许多手机品牌已经开始推出类似的产品。仿iPhone热门应用栏是指手机系统底部的一排常用应用图标,用户可以轻松访问和切换这些应用程序。 优点: 1. 提高用户体验:仿iPhone热门应用栏将常用的应用程序放置在屏幕底部,用户可以轻松地操作和访问这些应用。这种设计提高了用户的便利性和操作效率。 2. 提升工作效率:对于经常使用特定应用程序的用户来说,将它们放在热门应用栏中可以节省寻找和打开应用的时间,提高工作效率。 3. 可定制性:用户可以根据自己的需求和喜好,在热门应用栏中添加或删除特定的应用程序。这种可定制性使得用户可以根据自己的使用习惯进行个性化设置。 缺点: 1. 屏幕空间受限:仿iPhone热门应用栏通常会占据屏幕底部的一部分空间,可能会减少用户在其他应用程序中可见的屏幕空间。这对于一些需要较大屏幕空间才能展示内容的应用程序来说可能是一个问题。 2. 可能存在兼容性问题:由于不同手机品牌和操作系统之间存在差异,仿iPhone热门应用栏可能在某些设备上无法正常运行或显示。这需要开发人员在设计和开发过程中考虑到兼容性问题。 总结: 仿iPhone热门应用栏是一种流行的设计趋势,它提供了一种方便和高效的方式来访问和切换常用应用程序。虽然它具有许多优点,但也存在一些限制和挑战,特别是在屏幕空间和设备兼容性方面。因此,在设计和实施仿iPhone热门应用栏时,需要综合考虑这些因素,并根据特定的用户需求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值