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

宁可枝头抱香死,何曾吹落北风中。这篇文章主要讲述Android中使用GridView和ImageViewSwitcher实现电子相册简单功能相关的知识,希望能为你提供帮助。
我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片。如下图的显示效果:

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

文章图片

首先我们先罗列一下本次实现所要用的知识点:
(1)首页界面,我们需要可以通过GridView来实现,有关GridView的实现代码以及讲解请参照本人相关博文:
Android中GridView通过自定义适配器(未优化)实现图文视图排列(2)具体照片的展示以及左右切换效果,可以实现这个效果的方法很多(ViewPager,ViewFlipper,ImageViewSwitcher等),可以参照相关博文:
Android中使用ViewPager实现屏幕页面切换和页面切换效果 Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改) Android中使用ImageViewSwitcher实现图片切换轮播导航效果(3)实现Activity之间的跳转以及照片标记位置的传递需要用到intent,并分别使用putExtra以及getExtra,传入和获取照片的标记位置。
【Android中使用GridView和ImageViewSwitcher实现电子相册简单功能】(关于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" 3android:orientation="vertical" android:layout_width="match_parent" 4android:layout_height="match_parent"> 5< GridView 6android:id="@+id/gv" 7android:layout_width="match_parent" 8android:layout_height="wrap_content" 9android:numColumns="auto_fit" 10android:verticalSpacing="10dp" 11android:gravity="center" 12android: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" 3xmlns:app="http://schemas.android.com/apk/res-auto" 4android:orientation="vertical" android:layout_width="wrap_content" 5android:layout_height="wrap_content" 6android:gravity="center"> 7< ImageView 8android:layout_width="wrap_content" 9android:layout_height="wrap_content" 10android:adjustViewBounds="true" 11android:maxWidth="280dp" 12android:maxHeight="280dp" 13android:src="https://www.songbingjia.com/android/@mipmap/a1" 14android: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" 3xmlns:tools="http://schemas.android.com/tools" 4android:id="@+id/activity_main" 5android:layout_width="match_parent" 6android:layout_height="match_parent" 7tools:context="com.example.administrator.switcher.MainActivity"> 8< ImageSwitcher 9android:layout_width="match_parent" 10android:layout_height="match_parent" 11android:id="@+id/is"> 12< /ImageSwitcher> 13< LinearLayout 14android:id="@+id/point_layout" 15android:layout_width="match_parent" 16android:layout_height="wrap_content" 17android:layout_gravity="bottom" 18android:orientation="horizontal"> 19< ImageView 20android:layout_width="wrap_content" 21android:layout_height="wrap_content" 22android:layout_weight="1" 23android:src="https://www.songbingjia.com/android/@mipmap/default_holo"/> 24< ImageView 25android:layout_width="wrap_content" 26android:layout_height="wrap_content" 27android:layout_weight="1" 28android:src="https://www.songbingjia.com/android/@mipmap/default_holo"/> 29< ImageView 30android:layout_width="wrap_content" 31android:layout_height="wrap_content" 32android:layout_weight="1" 33android:src="https://www.songbingjia.com/android/@mipmap/default_holo"/> 34< ImageView 35android:layout_width="wrap_content" 36android:layout_height="wrap_content" 37android:layout_weight="1" 38android:src="https://www.songbingjia.com/android/@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 { 11private GridView gv; 12int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4}; 13@Override 14protected void onCreate(Bundle savedInstanceState) { 15super.onCreate(savedInstanceState); 16setContentView(R.layout.grid_layout); 17gv= (GridView) findViewById(R.id.gv); 18gv.setAdapter(new MyAdapter()); 19//设置单击GridView中每个item的单击事件 20gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 21@Override 22public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { 23//使用intend获取要交互的Activity,也就是将要跳转的界面 24Intent intent = new Intent(GridActivity.this,MainActivity.class); 25//通过intent的putExtra方法获取点击图片的下标位置(用于Activity之间数据传输) 26intent.putExtra("select",position); 27//启动要交互的Activity(通过传入包含该Activity的intent) 28startActivity(intent); 29} 30}); 31} 32class MyAdapter extends BaseAdapter{ 33 34@Override 35public int getCount() { 36return images.length; 37} 38 39@Override 40public Object getItem(int position) { 41return images[position]; 42} 43 44@Override 45public long getItemId(int position) { 46return position; 47} 48 49@Override 50public View getView(int position, View convertView, ViewGroup parent) { 51ViewHolder vh; 52if(convertView==null){ 53convertView=getLayoutInflater().inflate(R.layout.griditem_layout,null); 54vh= new ViewHolder(); 55vh.iv= (ImageView) convertView.findViewById(R.id.imageView); 56convertView.setTag(vh); 57} 58vh= (ViewHolder) convertView.getTag(); 59vh.iv.setImageResource(images[position]); 60return convertView; 61} 62class ViewHolder{ 63ImageView 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{ 15private ImageSwitcher is; //声明ImageSwitcher布局 16private LinearLayout point_layout; //声明导航圆点的布局 17//图片id数组(需要与GridActivity中的图片资源数组一一对应) 18int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4}; 19//实例化存储导航圆点的集合 20ArrayList< ImageView> points = new ArrayList< > (); 21int index; //声明index,记录图片id数组下标 22float startX; //手指接触屏幕时X的坐标(演示左右滑动) 23float endX; //手指离开屏幕时的坐标(演示左右滑动) 24 25@Override 26protected void onCreate(Bundle savedInstanceState) { 27super.onCreate(savedInstanceState); 28setContentView(R.layout.activity_main); 29//获取GridActivity中设置的intent 30Intent intent = getIntent(); 31//获取GridActivity中得到的图片下标,并随意设置默认值 32index = intent.getIntExtra("select",0); 33is = (ImageSwitcher) findViewById(R.id.is); 34is.setFactory(this); //通过工厂实现ImageSwitcher 35initpoint(); 36is.setOnTouchListener(this); //设置触摸事件 37} 38//初始化导航圆点的方法 39private void initpoint() { 40point_layout= (LinearLayout) findViewById(R.id.point_layout); 41int count = point_layout.getChildCount(); //获取布局中圆点数量 42for(int i =0; i< count; i++){ 43//将布局中的圆点加入到圆点集合中 44points.add((ImageView) point_layout.getChildAt(i)); 45} 46//设置GridActivity中选中图片对应的圆点状态为触摸实心状态 47points.get(index).setImageResource(R.mipmap.touched_holo); 48} 49//设选中图片对应的导航原点的状态 50public void setImageBackground(int selectImage) { 51for(int i=0; i< points.size(); i++){ 52//如果选中图片的下标等于圆点集合中下标的id,则改变圆点状态 53if(i==selectImage){ 54points.get(i).setImageResource(R.mipmap.touched_holo); 55}else{ 56points.get(i).setImageResource(R.mipmap.default_holo); 57} 58} 59} 60//实现ViewFactory的方法实例化imageView(这里未设置ImageView的属性) 61@Override 62public View makeView() { 63//实例化一个用于切换的ImageView视图 64ImageView iv = new ImageView(this); 65iv.setScaleType(ImageView.ScaleType.FIT_XY); 66//默认展示的第一个视图为images[index](主页面跳转过来的图片) 67iv.setImageResource(images[index]); 68return iv; 69} 70@Override 71public boolean onTouch(View v, MotionEvent event) { 72//按下屏幕 73if(event.getAction()==MotionEvent.ACTION_DOWN){ 74startX=event.getX(); //获取按下屏幕时X轴的坐标 75//手指抬起 76}else if (event.getAction()==MotionEvent.ACTION_UP){ 77endX=event.getX(); 78//判断结束坐标大于起始坐标则为下一张(为避免误操作,设置30的判断区间) 79if(startX-endX> 30){ 80//三目运算判断当前图片已经为最后一张,则从头开始 81index = index+1< images.length?++index:0; 82//使用系统自带的切换出入动画效果(也可以像ViewFlipper中一样自定义动画效果) 83is.setInAnimation(this,android.R.anim.fade_in); 84is.setOutAnimation(this,android.R.anim.fade_out); 85 86//判断结束坐标小于于起始坐标则为上一张(为避免误操作,设置30的判断区间) 87}else if(endX-startX> 30){ 88//三目运算判断当前图片已经为第一张,则上一张为数组内最后一张图片 89index = index-1> =0?--index:images.length-1; 90is.setInAnimation(this,android.R.anim.fade_in); 91is.setOutAnimation(this,android.R.anim.fade_out); 92} 93//设置ImageSwitcher的图片资源 94is.setImageResource(images[index]); 95//调用方法设置圆点对应状态 96setImageBackground(index); 97} 98return true; 99} 100 }

 
本次代码展示到这里就结束了,按照前文所讲,大家可以尝试多种实现方法,本次使用到的intent,后面会有详细讲述,敬请关注
Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

文章图片

 

    推荐阅读