android galley实现画廊效果

android galley实现画廊效果青春流水指间、每段路,都有即将要来的旅程每颗心,都有值得期待的成分Android之ImageSwitcher,Gallery用法今天在做一个软件界面时用到了ImageSwitcher和Gallery控件,在看API时,感觉上面的例子讲的不是很具体,效率并不高。在这里我就以一个图片浏览功能来具体说明这两个控件的用法。首先看运行效果:在这里图片我用的是API中的图

大家好,又见面了,我是你们的朋友全栈君。

Android之ImageSwitcher,Gallery用法

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

首先看运行效果:

android galley实现画廊效果

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

main.xml:

复制代码
 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     <cn.yj3g.gallery.MyGallery android:id="@+id/gallery"
 7         android:background="#55000000"
 8         android:layout_width="match_parent"
 9         android:layout_height="80dp"
10         android:gravity="center_vertical"
11         android:spacing="2dp"
12     />
13     <ImageSwitcher android:id="@+id/switcher"
14         android:layout_width="match_parent"
15         android:layout_height="match_parent"
16         android:layout_weight="1"
17     />
18 </LinearLayout>
复制代码

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

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

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

gallery_item.xml:

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

下面就是核心实现代码:

PictrueChangeActivity:

复制代码
  1 package cn.yj3g.PictrueChange;
  2 
  3 import java.util.HashMap;
  4 
  5 import android.app.Activity;
  6 import android.content.Context;
  7 import android.content.res.TypedArray;
  8 import android.os.Bundle;
  9 import android.util.Log;
 10 import android.view.LayoutInflater;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.view.Window;
 14 import android.view.animation.AnimationUtils;
 15 import android.widget.AdapterView;
 16 import android.widget.BaseAdapter;
 17 import android.widget.Gallery;
 18 import android.widget.Gallery.LayoutParams;
 19 import android.widget.ImageSwitcher;
 20 import android.widget.ImageView;
 21 import android.widget.TextView;
 22 import android.widget.ViewSwitcher;
 23 
 24 public class PictrueChangeActivity extends Activity implements AdapterView.OnItemClickListener,
 25         ViewSwitcher.ViewFactory {
 26     //定义ImageSwitcher类对象
 27     private ImageSwitcher mSwitcher;
 28     //文本资源
 29     private String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8",};
 30     //大图资源
 31     private Integer[] mThumbIds = { R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
 32             R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
 33             R.drawable.sample_7 };
 34     //大图对应的小图资源
 35     private Integer[] mImageIds = { R.drawable.sample_thumb_0, R.drawable.sample_thumb_1,
 36             R.drawable.sample_thumb_2, R.drawable.sample_thumb_3, R.drawable.sample_thumb_4,
 37             R.drawable.sample_thumb_5, R.drawable.sample_thumb_6, R.drawable.sample_thumb_7 };
 38     @Override
 39     public void onCreate(Bundle savedInstanceState) {
 40         super.onCreate(savedInstanceState);
 41         //设置窗体无标题
 42         requestWindowFeature(Window.FEATURE_NO_TITLE);
 43         setContentView(R.layout.main);
 44         mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
 45         mSwitcher.setFactory(this);
 46         //设置图片的滑动效果
 47         mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
 48         mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
 49 
 50         Gallery g = (Gallery) findViewById(R.id.gallery);
 51         //设置Gallery的适配器
 52         g.setAdapter(new ImageAdapter(this, mThumbIds.length));
 53         //Gallery中每个条目的点击事件监听
 54         g.setOnItemClickListener(this);
 55         //设置默认其实位置为第二张图片
 56         g.setSelection(1);
 57     }
 58 
 59     public void onItemSelected(AdapterView parent, View v, int position, long id) {
 60         mSwitcher.setImageResource(mThumbIds[position % mImageIds.length]);
 61     }
 62     public void onNothingSelected(AdapterView parent) {
 63     }
 64     
 65     @Override
 66     public View makeView() {
 67         ImageView i = new ImageView(this);
 68         i.setBackgroundColor(0xFF000000);
 69         i.setScaleType(ImageView.ScaleType.FIT_CENTER);
 70         i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT,
 71                 LayoutParams.MATCH_PARENT));
 72         return i;
 73     }
 74     //Gallery的适配器
 75     public class ImageAdapter extends BaseAdapter {
 76         private int mGalleryItemBackground;
 77         //定义map存储划过的位置
 78         private HashMap<Integer, View> mViewMaps;
 79         private int mCount;
 80         //定义布局加载器
 81         private LayoutInflater mInflater;
 82 
 83         public ImageAdapter(Context c, int count) {
 84             this.mCount = count;
 85             mViewMaps = new HashMap<Integer, View>(count);
 86             mInflater = LayoutInflater.from(PictrueChangeActivity.this);
 87             //定义图片的背景样式
 88             TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
 89             mGalleryItemBackground = a.getResourceId(
 90                     R.styleable.Gallery1_android_galleryItemBackground, 0);
 91             //定义可以重复使用.可回收
 92             a.recycle();
 93         }
 94 
 95         public int getCount() {
 96             //设置循环的次数
 97             return Integer.MAX_VALUE;
 98         }
 99 
100         public Object getItem(int position) {
101             return position;
102         }
103 
104         public long getItemId(int position) {
105             return position;
106         }
107 
108         public View getView(int position, View convertView, ViewGroup parent) {
109             Log.v("TAG", "getView() position=" + position + " convertView=" + convertView);
110             View viewGroup = mViewMaps.get(position%mCount);
111             ImageView imageView = null;
112             TextView textView = null;
113             if(viewGroup==null) {
114                 viewGroup = mInflater.inflate(R.layout.gallery_item, null);
115                 imageView = (ImageView) viewGroup.findViewById(R.id.item_gallery_image);
116                 textView = (TextView) viewGroup.findViewById(R.id.item_gallery_text);
117                 imageView.setBackgroundResource(mGalleryItemBackground);
118                 mViewMaps.put(position%mCount, viewGroup);
119                 imageView.setImageResource(mImageIds[position % mImageIds.length]);
120                 textView.setText(titles[position % mImageIds.length]);
121             } 
122             
123             return viewGroup;
124         }
125     }
126     //记录当前位置
127     private int curruntPos = -1;
128     @Override
129     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
130         if (curruntPos == position) {
131             return;
132         } else
133             curruntPos = position;
134         mSwitcher.setImageResource(mThumbIds[position % mThumbIds.length]);
135     }
136 }
复制代码

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

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <!-- These are the attributes that we want to retrieve from the theme
 5          in view/Gallery1.java -->
 6     <declare-styleable name="Gallery1">
 7         <attr name="android:galleryItemBackground" />
 8     </declare-styleable>
 9   
10 </resources>
复制代码

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

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

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

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

3.在点击事件中,如果重复点击同一张图片,不会去加载图片。在这里我设置了一个标记位置,如果标记位置和当前位置一样,那就不去加载图片。
4.设置起始位置为第二位,这样初始界面比较美观,显示的图片两边都有图片。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145979.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Asp.Net Core-几行代码解决Razor中的嵌套if语句

    Asp.Net Core-几行代码解决Razor中的嵌套if语句

  • MySQL的查询需要遍历几次B+树,理论上需要几次磁盘I/O?「建议收藏」

    MySQL的查询需要遍历几次B+树,理论上需要几次磁盘I/O?

  • 关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些

    关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些? 博客首页:派大星⛳️ 欢迎关注 ❤️ 点赞 ? 收藏 ✏️ 留言? 本文由派大星原创编撰? 系列专栏:《迎战面试》? 本系列分享自己准备面试的过程和一些经典的面试题目录? SpringIOC? IOC是什么?? Ioc容器的初始化过程?? 基于注解的容器初始化? 依赖注入的相关注解?? 如何通过注解.

  • 纯c语言写银行家算法

    纯c语言写银行家算法主要参考链接:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792https://liuyanzhao.com/2932.html(这个是额外贴出可以参考的连接。本文的主要参考链接依旧是第一条)[声明]本文为转载是因为代码大多数都是网上copy的,然后自己也只是微调加实现过,个人认为不可以当原创。代码全部都贴上来了,…

  • c++和java哪个好学_C/C++,JAVA学习哪个更容易就业?

    c++和java哪个好学_C/C++,JAVA学习哪个更容易就业?C、C++和Java语言都是目前在IT行业内有广泛使用的编程语言,其中C的应用场景主要集中在嵌入式开发、操作系统开发等领域,C++主要的应用领域集中在多媒体和容器开发领域,而Java的应用场景更多一些,包括Web开发、移动互联开发、大数据开发等。从市场需求量来看,目前Java程序员的市场需求量更大一些。C语言可以说是编程语言界的常青树,虽然已经被使用多年,但是目前依然具有旺盛的生命力,尤其在一些…

  • 业务逻辑漏洞

    业务逻辑漏洞目录什么是业务逻辑漏洞:业务逻辑漏洞产生的核心原因:应用中的缺陷通常分为两种类型:逻辑漏洞主要产生的位置登录处存在的逻辑漏洞1.可以暴力破解用户名或密码:2.session没有清空:业务办理处存在的逻辑漏洞水平越权篡改手机号验证码处存在的逻辑漏洞登录验证码未刷新手机或邮箱验证码可爆破手机或邮箱验证码回显到客户端修改response包绕过判定支付处存在的逻辑漏洞修改商品编号金额修改商品数量修改通过前端限制限购商品充值中放弃订单

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号