工具:android studio

目标:通过简单的相册制作,实现“瀑布流”效果,增加删除照片功能,熟悉RecyclerView的使用,菜单的使用,及适配器的制作。

1.创建一个项目,并命名为PhotoManager。

2.首先,我们需要在主界面(layout_main)中添加一个RecyclerView,RecyclerVIew的功能和listView类似,不过更为强大,要实现“瀑布流”效果就必须借助RecyclerVIew。而RecyclerView是被定义在support库中的,所以我们要先添加相应的依赖库。

打开app->build.gradle文件,在dependencies闭包中添加如下内容

添加完了之后记得要Sync Now同步一下。

然后就可以在layout_main.xml中使用RecyclerView了

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/

3.接下来我们就需要考虑每一张图片怎么单独地被包含在RecyclerView中了。新建一个类,命名为Imagee(自己可以多加一个e,避免在接下来把自己创的类与android自带的类弄混淆了)。

这个类非常简单,只有一个变量、一个构造函数和一个getId函数。

4.我们有了Imagee类,就自然需要一个相应的layout布局文件。新建一个layout文件,并命名为image_item.xml。

在该布局文件中,我们只需要一个ImageView来显示照片就好了,

<ImageView
    android:id="@+id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"/>

5.准备工作都已经完成了,接下来就需要用适配器把它们连接起来了。

新建一个ImageeAdapter类,让它继承RecyclerView.Adapter并将泛型指向ImageeAdapter.ViewHolder,其中ViewHolder是我们将在ImageeAdapter内部的一个类,

ViewHolder的构造函数中有一个参数view,这个参数就是RecyclerView子项最外层布局,我们可以通过findViewById()函数获得布局中的ImageView实例。

然后,我们需要在里面重写onCreateViewHolder()和onBindViewHolder()以及getItenCount三个函数(快捷键是CTRL+O)。

6.适配器制作好了之后,我们就要开始在MainActivity中添加相应的代码了。

先定义一个List<Imagee>类型的全局变量imageeList,容纳我们的照片。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    show();
}private void show(){RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    ImageeAdapter adapter = new ImageeAdapter(imageeList);
    recyclerView.setAdapter(adapter);
}private void init(){for(int i = 0;i<4;i++){Imagee imagee1=new Imagee(R.drawable.image1);
        imageeList.add(imagee1);
        Imagee imagee2=new Imagee(R.drawable.image2);
        imageeList.add(imagee2);
        Imagee imagee3=new Imagee(R.drawable.image3);
        imageeList.add(imagee3);
        Imagee imagee4=new Imagee(R.drawable.image4);
        imageeList.add(imagee4);

    }}

init()函数是将imageeList进行初始化,show()函数是将imageeList中包含的照片显示出来。

需要提出来的是,我们的照片资源是实现放在app->rsc->main->res->drawable文件中的,如果知道照片的分辨率大小,也可以放在mipmap开头的几个文件中,这几个文件是分别放置不同分辨率的照片的。在调用照片资源的时候就可以通过其id来调用。

至此,实现瀑布流效果的相册就已经制作完成了,可以看看效果。

(每张照片的大小都是参差不齐的,所以效果就是这样,你在实现的时候可以把照片都设置一样大小)

8.我们看得到,整个界面都已经被用来显示照片流了,那么我们实现增删照片的控件又能放在哪呢?节省界面的menu便应运而生了。我们在app->rsc->main->res目录下新建一个目录,命名为menu,然后在menu目录下新建一个main布局文件。

在menu.xml中,我们添加两个item(相当于两个Button)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="add"/>
    <item
        android:title="Remove"
        android:id="@+id/remove_item"/>

</menu>

9.在MainActivity中重写onCreateOptionsMenu()在主界面中加入menu,和onOptionsItemSelected(),设置增删照片的功能。

public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main,menu);
    return true;
}@Override
public boolean onOptionsItemSelected(MenuItem item) {int i ;
    Random random = new Random();
    switch (item.getItemId()){case R.id.add_item:i=random.nextInt(5)+1;
            switch (i){case 1:Imagee imageenew1 = new Imagee(R.drawable.image1);
                    imageeList.add(imageenew1);
                    break;
                case 2:Imagee imageenew2 = new Imagee(R.drawable.image2);
                    imageeList.add(imageenew2);
                    break;
                case 3:Imagee imageenew3 = new Imagee(R.drawable.image3);
                    imageeList.add(imageenew3);
                    break;
                case 4:Imagee imageenew4 = new Imagee(R.drawable.image4);
                    imageeList.add(imageenew4);
                    break;
                case 5:Imagee imageenew5 = new Imagee(R.drawable.image5);
                    imageeList.add(imageenew5);
                    break;
                default:break;
            }show();
            break;
        case R.id.remove_item:i = random.nextInt(imageeList.size());
            imageeList.remove(i);
            show();
            break;
        default:break;
    }return true;
}

10.如此,大功告成,运行查看。

       

ps:如果有什么不妥之处,欢迎留言指出。

android开发实例学习笔记之简易相册的实现相关推荐

  1. android相册功能 实现,Android开发实现的保存图片到相册功能示例

    本文实例讲述了Android开发实现的保存图片到相册功能.分享给大家供大家参考,具体如下: 废话不多说,先上效果: 点击图片 调用savephoto的SaveBitmapFromView(View v ...

  2. Android通知怎么实现?Android开发如何操作相机和相册?

    Android通知怎么实现?Android开发如何操作相机和相册? 前言 八.Android通知怎么实现?Android开发如何操作相机和相册? 8.1 通知介绍 8.2 通知的基本用法 8.3 An ...

  3. Android开发自学笔记—1.1(番外)AndroidStudio常用功能介绍

    Android开发自学笔记-1.1(番外)AndroidStudio常用功能介绍 http://www.cnblogs.com/boyliupan/p/4729736.html#_labelTop 回 ...

  4. Android 开发学习笔记

    Android 开发学习笔记 Lesson1 (2.28) android之父: Andy Rubin(安迪 鲁宾) Lesson2 (3.3) android 的优点: 开放.网络接入自由.丰富的硬 ...

  5. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)

    一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于Intelli ...

  6. Android 开发学习笔记:七大知识点板块汇总

    前言 我从事 Android 开发行业也有些年头,工作期间也接触过很多 Android 开发者, 因此也非常清楚 程序员最大的限制并非年龄而是实力: 但大多数初中级Android工程师,想要提升技能, ...

  7. Android开发学习笔记

    2022.3.10 android开发笔记 Lesson4(3.10web). 作业: 手写MainAcitivity.java与activity_ main.xml 文件 res目录. 存放资源:图 ...

  8. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建

    一.引言 本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于IntelliJ I ...

  9. Android开发学习笔记(二)——编译和运行原理(1)

    接着上一篇的内容,继续从全局了解Android.在清楚了Android的平台架构(可以看作是静态原理)后,还需要掌握其动态原理.动态原理包含两部分,一部分是编译原理,另一部分是运行原理.有人会说,搭建 ...

  10. 【Android开发学习笔记之一】5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

最新文章

  1. 谷歌最新开源BundleTrack: 无需任何CAD模型的6D物体姿态跟踪算法
  2. 2018年视觉所有干货博文的分类汇总
  3. jquery之empty()与remove([expr])区别
  4. ServletContext_功能_获取文件服务器路径
  5. Fiori as a Service - FaaS - Creation of inline task option is not available
  6. 腾讯云ubuntu18安装图形化界面
  7. VC++CopyFile函数的用法
  8. 用计算机画画内容,【经验】怎么用电脑绘画?
  9. PowerDesigner(数据库建模工具) 使用教程
  10. 铁路订票系统12306网站的业务和技术优化概述
  11. DGM: A deep learning algorithm for solving partial differential equations
  12. maven打包报错Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.5.2.RELEASE:repa
  13. 【MySQL】MVCC多版本并发控制(重点:MVCC实现原理之ReadView)
  14. [转]普通软件项目开发过程规范(五)—— 总结
  15. git clone时提示,git remote: HTTP Basic: Access denied 错误
  16. Android定位元素与操作
  17. 迎难而上 数据库管理员怎样走向成功?(转)
  18. 计算机硬件知识题,计算机硬件知识题库
  19. python调用latex,在Python中使用LaTeX符号格式化数字
  20. C#编程学习51:操作MDB数据库

热门文章

  1. GIS招聘 | 江西省直事业单位(含测绘、地信等专业岗位)
  2. 盘古搜索22日开通 欲打造一流搜索引擎
  3. 【数据结构 课程设计】识别结点(node) 故障和边缘(edge)故障中的网络断层扫描
  4. ncnn发布20220420版本,让Vulkan神经网络推理得更快
  5. android studio 圆形头像,Android Studio实现带边框的圆形头像
  6. xdg在Linux中的用法,Linux – XDG (X Desktop Group)
  7. display:The Wayland Book 节选dmabufXDG
  8. 猫眼电影TOP100爬虫
  9. 制作字幕.html教程,自制字幕怎么做 字幕制作软件
  10. 怎么把PDF拆分成单页?