Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片。如下图的显示效果:

首先我们先罗列一下本次实现所要用的知识点:

(1)首页界面,我们需要可以通过GridView来实现,有关GridView的实现代码以及讲解请参照本人相关博文:

Android中GridView通过自定义适配器(未优化)实现图文视图排列

(2)具体照片的展示以及左右切换效果,可以实现这个效果的方法很多(ViewPager,ViewFlipper,ImageViewSwitcher等),可以参照相关博文:

Android中使用ViewPager实现屏幕页面切换和页面切换效果

Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)

Android中使用ImageViewSwitcher实现图片切换轮播导航效果

(3)实现Activity之间的跳转以及照片标记位置的传递需要用到intent,并分别使用putExtra以及getExtra,传入和获取照片的标记位置。

(关于intent,后期会有专门博文介绍具体使用,请大家持续关注哦)

下面我们开始功能的实现:

第一步:Layout中建立首页GridView布局grid_layout.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <GridView
 6         android:id="@+id/gv"
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:numColumns="auto_fit"
10         android:verticalSpacing="10dp"
11         android:gravity="center"
12         android:horizontalSpacing="10dp"></GridView>
13 </LinearLayout>

第二步:Layout中建立GridView布局中每个item的布局griditem_layout.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     android:orientation="vertical" android:layout_width="wrap_content"
 5     android:layout_height="wrap_content"
 6     android:gravity="center">
 7     <ImageView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:adjustViewBounds="true"
11         android:maxWidth="280dp"
12         android:maxHeight="280dp"
13         android:src="@mipmap/a1"
14         android:id="@+id/imageView" />
15 </LinearLayout>

这里的设置需要根据实际展示图片的宽度以及要展示的容器(手机)分辨率来设置等比例缩放,避免排版混乱的情况出现。

第三步:Layout中建立图片展示界面(包含导航圆点)布局activity_main.xml文件:

这里主布局使用FrameLayout,切换实现布局使用ImageSwitcher,导航圆点使用linearlayout实现(可通过配置文件实现):

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <FrameLayout 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     tools:context="com.example.administrator.switcher.MainActivity">
 8     <ImageSwitcher
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent"
11         android:id="@+id/is">
12     </ImageSwitcher>
13     <LinearLayout
14         android:id="@+id/point_layout"
15         android:layout_width="match_parent"
16         android:layout_height="wrap_content"
17         android:layout_gravity="bottom"
18         android:orientation="horizontal">
19         <ImageView
20             android:layout_width="wrap_content"
21             android:layout_height="wrap_content"
22             android:layout_weight="1"
23             android:src="@mipmap/default_holo"/>
24         <ImageView
25             android:layout_width="wrap_content"
26             android:layout_height="wrap_content"
27             android:layout_weight="1"
28             android:src="@mipmap/default_holo"/>
29         <ImageView
30             android:layout_width="wrap_content"
31             android:layout_height="wrap_content"
32             android:layout_weight="1"
33             android:src="@mipmap/default_holo"/>
34         <ImageView
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:layout_weight="1"
38             android:src="@mipmap/default_holo"/>
39     </LinearLayout>
40 </FrameLayout>

第四步:Java中Activity的实现代码,首页GridView的实现代码GridActivity.java:

这里涉及到的知识点请参照

Android中GridView通过自定义适配器(未优化)实现图文视图排列

本次自定义适配器中getview方法已经优化:

 1 import android.content.Intent;
 2 import android.support.v7.app.AppCompatActivity;
 3 import android.os.Bundle;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6 import android.widget.AdapterView;
 7 import android.widget.BaseAdapter;
 8 import android.widget.GridView;
 9 import android.widget.ImageView;
10 public class GridActivity extends AppCompatActivity {
11     private GridView gv;
12     int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4};
13     @Override
14     protected void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.grid_layout);
17         gv= (GridView) findViewById(R.id.gv);
18         gv.setAdapter(new MyAdapter());
19         //设置单击GridView中每个item的单击事件
20         gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
21             @Override
22             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
23                 //使用intend获取要交互的Activity,也就是将要跳转的界面
24                 Intent intent = new Intent(GridActivity.this,MainActivity.class);
25                 //通过intent的putExtra方法获取点击图片的下标位置(用于Activity之间数据传输)
26                 intent.putExtra("select",position);
27                 //启动要交互的Activity(通过传入包含该Activity的intent)
28                 startActivity(intent);
29             }
30         });
31     }
32     class MyAdapter extends BaseAdapter{
33
34         @Override
35         public int getCount() {
36             return images.length;
37         }
38
39         @Override
40         public Object getItem(int position) {
41             return images[position];
42         }
43
44         @Override
45         public long getItemId(int position) {
46             return position;
47         }
48
49         @Override
50         public View getView(int position, View convertView, ViewGroup parent) {
51             ViewHolder vh;
52             if(convertView==null){
53                 convertView=getLayoutInflater().inflate(R.layout.griditem_layout,null);
54                 vh= new ViewHolder();
55                 vh.iv= (ImageView) convertView.findViewById(R.id.imageView);
56                 convertView.setTag(vh);
57             }
58             vh= (ViewHolder) convertView.getTag();
59             vh.iv.setImageResource(images[position]);
60             return convertView;
61         }
62         class ViewHolder{
63             ImageView iv;
64         }
65     }
66 }

第五步:Java中Activity的实现代码,跳转后的ImageSwicher的实现代码MainActivity.java:

可参照博文

Android中使用ImageViewSwitcher实现图片切换轮播导航效果

  1 import android.content.Intent;
  2 import android.support.v7.app.AppCompatActivity;
  3 import android.os.Bundle;
  4 import android.view.MotionEvent;
  5 import android.view.View;
  6 import android.widget.ImageSwitcher;
  7 import android.widget.ImageView;
  8 import android.widget.LinearLayout;
  9 import android.widget.ViewSwitcher;
 10 import java.util.ArrayList;
 11 /**
 12  * Created by panchengjia on 2016/12/05.
 13  */
 14 public class MainActivity extends AppCompatActivity implements ViewSwitcher.ViewFactory,View.OnTouchListener{
 15     private ImageSwitcher is;//声明ImageSwitcher布局
 16     private LinearLayout point_layout;//声明导航圆点的布局
 17     //图片id数组(需要与GridActivity中的图片资源数组一一对应)
 18     int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4};
 19     //实例化存储导航圆点的集合
 20     ArrayList<ImageView> points = new ArrayList<>();
 21     int index;//声明index,记录图片id数组下标
 22     float startX;//手指接触屏幕时X的坐标(演示左右滑动)
 23     float endX;//手指离开屏幕时的坐标(演示左右滑动)
 24
 25     @Override
 26     protected void onCreate(Bundle savedInstanceState) {
 27         super.onCreate(savedInstanceState);
 28         setContentView(R.layout.activity_main);
 29         //获取GridActivity中设置的intent
 30         Intent intent = getIntent();
 31         //获取GridActivity中得到的图片下标,并随意设置默认值
 32         index = intent.getIntExtra("select",0);
 33         is = (ImageSwitcher) findViewById(R.id.is);
 34         is.setFactory(this);//通过工厂实现ImageSwitcher
 35         initpoint();
 36         is.setOnTouchListener(this);//设置触摸事件
 37     }
 38     //初始化导航圆点的方法
 39     private void initpoint() {
 40         point_layout= (LinearLayout) findViewById(R.id.point_layout);
 41         int count = point_layout.getChildCount();//获取布局中圆点数量
 42         for(int i =0;i<count;i++){
 43             //将布局中的圆点加入到圆点集合中
 44             points.add((ImageView) point_layout.getChildAt(i));
 45         }
 46         //设置GridActivity中选中图片对应的圆点状态为触摸实心状态
 47         points.get(index).setImageResource(R.mipmap.touched_holo);
 48     }
 49     //设选中图片对应的导航原点的状态
 50     public void setImageBackground(int selectImage) {
 51         for(int i=0;i<points.size();i++){
 52             //如果选中图片的下标等于圆点集合中下标的id,则改变圆点状态
 53             if(i==selectImage){
 54                 points.get(i).setImageResource(R.mipmap.touched_holo);
 55             }else{
 56                 points.get(i).setImageResource(R.mipmap.default_holo);
 57             }
 58         }
 59     }
 60     //实现ViewFactory的方法实例化imageView(这里未设置ImageView的属性)
 61     @Override
 62     public View makeView() {
 63         //实例化一个用于切换的ImageView视图
 64         ImageView iv = new ImageView(this);
 65         iv.setScaleType(ImageView.ScaleType.FIT_XY);
 66         //默认展示的第一个视图为images[index](主页面跳转过来的图片)
 67         iv.setImageResource(images[index]);
 68         return iv;
 69     }
 70     @Override
 71     public boolean onTouch(View v, MotionEvent event) {
 72         //按下屏幕
 73         if(event.getAction()==MotionEvent.ACTION_DOWN){
 74             startX=event.getX();//获取按下屏幕时X轴的坐标
 75             //手指抬起
 76         }else if (event.getAction()==MotionEvent.ACTION_UP){
 77             endX=event.getX();
 78             //判断结束坐标大于起始坐标则为下一张(为避免误操作,设置30的判断区间)
 79             if(startX-endX>30){
 80                 //三目运算判断当前图片已经为最后一张,则从头开始
 81                 index = index+1<images.length?++index:0;
 82                 //使用系统自带的切换出入动画效果(也可以像ViewFlipper中一样自定义动画效果)
 83                 is.setInAnimation(this,android.R.anim.fade_in);
 84                 is.setOutAnimation(this,android.R.anim.fade_out);
 85
 86                 //判断结束坐标小于于起始坐标则为上一张(为避免误操作,设置30的判断区间)
 87             }else if(endX-startX>30){
 88                 //三目运算判断当前图片已经为第一张,则上一张为数组内最后一张图片
 89                 index = index-1>=0?--index:images.length-1;
 90                 is.setInAnimation(this,android.R.anim.fade_in);
 91                 is.setOutAnimation(this,android.R.anim.fade_out);
 92             }
 93             //设置ImageSwitcher的图片资源
 94             is.setImageResource(images[index]);
 95             //调用方法设置圆点对应状态
 96             setImageBackground(index);
 97         }
 98         return true;
 99     }
100 }

本次代码展示到这里就结束了,按照前文所讲,大家可以尝试多种实现方法,本次使用到的intent,后面会有详细讲述,敬请关注

时间: 2024-10-10 19:52:07

Android中使用GridView和ImageViewSwitcher实现电子相册简单功能的相关文章

Android中的补间动画(tween)的简单使用

相对帧动画,补间动画(tween)可以这么理解:我们不必像帧动画一样指定动画的每一帧,只需定义一个动画的开始和结束关键帧,而中间变化的帧由系统帮我们计算. tween动画可以分为下面几种: AlphaAnimation(透明渐变动画): 示例:res/anim/alpha.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.andr

Android中Universal Image Loader开源框架的简单使用

UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument for image loading, caching and displaying. It provides a lot of configuration options and good control over the image loading and caching process.(不知道

Android中取消GridView &amp; ListView默认的点击背景色

方法一: gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 在代码中初始化的时候设置其属性. 方法二: <GridView android:listSelector="@android:color/transparent" android:numColumns="auto_fit&q

Android中的搜索框(SearchView)的功能和用法

1.SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索. 2.SearchView组件的常用方法如下: ①setIconifiedByDefault(boolean iconified) ===> 设置搜索框默认是否自动缩小为图标. ②setOnQueryTextListener(SearchView,OnQueryTextListener listener) ===> 为搜索框设置监听器 ③setSubmitBu

ASP.NET中的GridView自带的编辑更新功能

string ConStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridView1.AllowSorting = true; BindData(); SetGrid(); //ViewState[&qu

Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载)

场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将需要滚动查看的照片复制到res/drawable下 这里只准备了两张bg01.jpg和bg02.jpg 在滚动时需要用到左进右出和左出右进的动画,所以在res下新建anim目录,在目录下新建四种动画的xml文件 具体代码参照示例代码. 然后打开布局文件activity_image_switcher.xml 将布局修

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

Android中简单实现选择图片并裁剪

在android中选择图片是一个很常见的功能,图片的来源通常情况下是从相机获取和从相册获取两种. 先来写一个简单的选择按钮和一个能显示图片的ImageView <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent&qu

Android中的Matrix类介绍

Matrix顾名思义就是大学的线性代数中的矩阵,关于矩阵的基本知识和加减乘除运算这里不再赘述. Android中的Matrix类是一个比较简单的3x3的3阶矩阵,结构如下: float matrix = {MSCALE_X, MSKEW_X, MTRANS_X, MSKEW_Y, MSCALE_Y, MTRANS_Y, MPERSP_0, MPERSP_1, MPERSP_2 }; 结构如上:其中 MSCALE_X和MSCALE_Y分别是控制X轴和Y轴方向的缩放,MSKEW_X和MSKEW_Y是