每段路,都有即将要来的旅程 每颗心,都有值得期待的成分

Android之ImageSwitcher,Gallery用法

今天在做一个软件界面时用到了ImageSwitcher和Gallery控件,在看API时,感觉上面的例子讲的不是很具体,效率并不高。在这里我就以一个图片浏览功能来具体说明这两个控件的用法。

首先看运行效果:

在这里图片我用的是API中的图片。先说下这个图片浏览的功能吧,首先,它要实现图片的切换,当点击上面的小图时,下方会出现对象的大图,其次就是实现上图中最上面的样式,即一个图片和一个文本。下来我们还要实现起始位置居中,滑动小图的速率的控制,最上面小图的无限循环等功能。下面我就将具体实现代码附下,供大家参考。

main.xml:

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical">
     <cn.yj3g.gallery.MyGallery android:id="@+id/gallery"
         android:background="#55000000"
         android:layout_width="match_parent"
         android:layout_height="80dp"
         android:gravity="center_vertical"
         android:spacing="2dp"
     />
     <ImageSwitcher android:id="@+id/switcher"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
     />
 </LinearLayout>

在上面我是自定义视图,引用自己定义的一个Gallery,在这个Gallery中我重新设置的滑动的速率,让它滑动速度放慢,下面是我自定义的Gallery
代码:

MyGallery.java:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

下面是在定义gallery布局文件的代码:

gallery_item.xml:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

下面就是核心实现代码:

PictrueChangeActivity:

 package cn.yj3g.PictrueChange;

 import java.util.HashMap;

 import android.app.Activity;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.animation.AnimationUtils;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.Gallery;
 import android.widget.Gallery.LayoutParams;
 import android.widget.ImageSwitcher;
 import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.ViewSwitcher;

 public class PictrueChangeActivity extends Activity implements AdapterView.OnItemClickListener,
         ViewSwitcher.ViewFactory {
     //定义ImageSwitcher类对象
     private ImageSwitcher mSwitcher;
     //文本资源
     private String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8",};
     //大图资源
     private Integer[] mThumbIds = { R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
             R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
             R.drawable.sample_7 };
     //大图对应的小图资源
     private Integer[] mImageIds = { R.drawable.sample_thumb_0, R.drawable.sample_thumb_1,
             R.drawable.sample_thumb_2, R.drawable.sample_thumb_3, R.drawable.sample_thumb_4,
             R.drawable.sample_thumb_5, R.drawable.sample_thumb_6, R.drawable.sample_thumb_7 };
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         //设置窗体无标题
         requestWindowFeature(Window.FEATURE_NO_TITLE);
         setContentView(R.layout.main);
         mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
         mSwitcher.setFactory(this);
         //设置图片的滑动效果
         mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
         mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));

         Gallery g = (Gallery) findViewById(R.id.gallery);
         //设置Gallery的适配器
         g.setAdapter(new ImageAdapter(this, mThumbIds.length));
         //Gallery中每个条目的点击事件监听
         g.setOnItemClickListener(this);
         //设置默认其实位置为第二张图片
         g.setSelection(1);
     }

     public void onItemSelected(AdapterView parent, View v, int position, long id) {
         mSwitcher.setImageResource(mThumbIds[position % mImageIds.length]);
     }
     public void onNothingSelected(AdapterView parent) {
     }

     @Override
     public View makeView() {
         ImageView i = new ImageView(this);
         i.setBackgroundColor(0xFF000000);
         i.setScaleType(ImageView.ScaleType.FIT_CENTER);
         i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT,
                 LayoutParams.MATCH_PARENT));
         return i;
     }
     //Gallery的适配器
     public class ImageAdapter extends BaseAdapter {
         private int mGalleryItemBackground;
         //定义map存储划过的位置
         private HashMap<Integer, View> mViewMaps;
         private int mCount;
         //定义布局加载器
         private LayoutInflater mInflater;

         public ImageAdapter(Context c, int count) {
             this.mCount = count;
             mViewMaps = new HashMap<Integer, View>(count);
             mInflater = LayoutInflater.from(PictrueChangeActivity.this);
             //定义图片的背景样式
             TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
             mGalleryItemBackground = a.getResourceId(
                     R.styleable.Gallery1_android_galleryItemBackground, 0);
             //定义可以重复使用.可回收
             a.recycle();
         }

         public int getCount() {
             //设置循环的次数
             return Integer.MAX_VALUE;
         }

         public Object getItem(int position) {
             return position;
         }

         public long getItemId(int position) {
             return position;
         }

         public View getView(int position, View convertView, ViewGroup parent) {
             Log.v("TAG", "getView() position=" + position + " convertView=" + convertView);
             View viewGroup = mViewMaps.get(position%mCount);
             ImageView imageView = null;
             TextView textView = null;
             if(viewGroup==null) {
                 viewGroup = mInflater.inflate(R.layout.gallery_item, null);
                 imageView = (ImageView) viewGroup.findViewById(R.id.item_gallery_image);
                 textView = (TextView) viewGroup.findViewById(R.id.item_gallery_text);
                 imageView.setBackgroundResource(mGalleryItemBackground);
                 mViewMaps.put(position%mCount, viewGroup);
                 imageView.setImageResource(mImageIds[position % mImageIds.length]);
                 textView.setText(titles[position % mImageIds.length]);
             } 

             return viewGroup;
         }
     }
     //记录当前位置
     private int curruntPos = -1;
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (curruntPos == position) {
             return;
         } else
             curruntPos = position;
         mSwitcher.setImageResource(mThumbIds[position % mThumbIds.length]);
     }
 }

这里要加载一个背景文件,放在values目录下,文件名为attrs.xml,代码如下:

 <?xml version="1.0" encoding="utf-8"?>
 <resources>

     <!-- These are the attributes that we want to retrieve from the theme
          in view/Gallery1.java -->
     <declare-styleable name="Gallery1">
         <attr name="android:galleryItemBackground" />
     </declare-styleable>

 </resources>

这样显示的图片就有一个相框一样的边框。

在上面的代码中,和API中不同的是做了四点改进:

1.实现滑动可以无限滑动,就是在上面的getCount()中,返回的是一个Integer.MAX_VALUE,这样可以做到无限滑动。

2.提高在滑动时大图的显示效率。就是在上面,我自定义了一个Map,将滑动过的位置全部记录下来,等到下次滑到这个位置时,就不必再去加载图片了,类似于缓存。这样提高了效率。

3.在点击事件中,如果重复点击同一张图片,不会去加载图片。在这里我设置了一个标记位置,如果标记位置和当前位置一样,那就不去加载图片。

4.设置起始位置为第二位,这样初始界面比较美观,显示的图片两边都有图片。

android galley实现画廊效果的更多相关文章

  1. Android -- 使用ViewPager实现画廊效果

    1,今天在微信推送文章看到实现画廊效果,感觉挺不错的,就来写写试试,先来看一下效果图: 上面的效果基本上可以用两个功能点来包含:ViewPager的切换动画.ImageView的倒影的实现 嗯,先来将 ...

  2. Android画廊效果

    Android画廊效果 前言:Gallery是一个内部元素控件,可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件:画廊Gallery一般用来显示可左右移动图片的列表(具体请看实例). 效 ...

  3. Android 画廊效果之ViewPager显示多个图片

    首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...

  4. 解决Android Graphical Layout 界面效果不显示

    解决Android Graphical Layout 界面效果不显示 qq463431476

  5. android 的闪屏效果

    android的闪屏效果,就是我们刚开始启动应用的时候弹出的界面或者动画,过2秒之后自动的跳转到主界面. 其实,实现这个效果很简单,使用Handler对象的postDelayed方法就可以实现.在这个 ...

  6. 兼容Android的水波纹效果

    Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...

  7. 【转】(转)【Android】Paint的效果研究

    转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android   在Paint中有很多的属性可以 ...

  8. Android仿IOS回弹效果 ScrollView回弹 总结

    Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些  发现总 ...

  9. Android实现左右滑动效果

    本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...

随机推荐

  1. [Codeforces 750E]New Year and Old Subsequence

    Description 题库链接 给出一个长度为 \(n\) 的仅包含数字的字符串. \(q\) 次询问,每次询问该串 \([a,b]\) 段内删去几个数能够使其不含 \(2016\) 的子串,但存在 ...

  2. [Codeforces 606C]Sorting Railway Cars

    Description An infinitely long railway has a train consisting of n cars, numbered from 1 to n (the n ...

  3. 【BZOJ1060】【ZJOI2007】时态同步

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...

  4. ●HDU 6021 MG loves string

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=6021 题解: 题意:对于一个长度为 N的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符 i ...

  5. 例10-3 uva10375(唯一分解定理)

    题意:已知C(m,n) = m!/(n!(m-n)!),已知p,q,r,s,求C(p,q)/C(r,s) 思路: 全部分解成质因子,相乘则加,除则减 #include <iostream> ...

  6. [Noi2016]国王饮水记

    来自FallDream的博客,未经允许,请勿转载,谢谢. 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳蚤实在太多,跳蚤国王 ...

  7. 零开始:NetCore项目权限管理系统:基础框架搭建

    有兴趣的同学可以一起做 喜欢NetCore的朋友,欢迎加群QQ:86594082 源码地址:https://github.com/feiyit/SoaProJect 新建一个空的解决方案,建立对应的解 ...

  8. 如何在Eclipse中快速添加main方法

    在创建类时自动添加,只需要勾选"public static void main(String[]   args)"

  9. Python小代码_8_今天是今年的第几天

    import time date = time.localtime() print(date) #time.struct_time(tm_year=2018, tm_mon=2, tm_mday=24 ...

  10. 首届.NET Core开源峰会

    首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...