Android专题5——学习Gallery小结

Context

  1. 这是一个比较复杂的概念,有上下文,句柄,环境变量等多重含义
  2. 目前理解为:指向parent的指针,比如Button btn = new Button(this),这里的this就是一个Context对象,这句代码告诉了这个btn在哪个Activity

res\values\文件夹有什么作用

  • 我们在XML文件一个java代码中都可以用系统定义的属性来修饰View,比如:android:layout_wid="wrap_content"。
  • 上面的android:layout_wid就是一个属性,我们也可以定义我们自己的属性
  • 首先就要现在res\values\新建一个我们自己的XML文件
  • 下面的android:galleryItemBackground就是我们自定义的一个用来修饰Gallery的背景风格

这里的android:galleryItemBackground是一个android以自定义的属性,所以后面没加format

如何使用这个定义的格式呢

如何循环显示图片

循环显示图像的原理

循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点。循环显示图像也可以模拟这一点。

也许细心的读者从上一节实现的ImageAdapter类中会发现些什么。对!就是getView方法中的position参数和getCount方法的关系。position参数的值是不可能超过getCount方法返回的值的,也就是说,position参数值的范围是0至getCount() - 1。

如果这时Gallery组件正好显示到最后一个图像,position参数值正好为getCount() - 1。那么我们如何再让Gallery显示下一个图像呢?也就是说让position参数值再增1,对!将getCount()方法的返回值也增1。

那么这里还有一个问题,如果position参数值无限地增加,就意味着resIds数组要不断地增大,这样会大大消耗系统的资源。想到这,就需要解决两个问题:既要position不断地增加,又让resIds数组中保存的图像资源ID是有限的,该怎么做呢?对于getCount()方法非常好解决,可以让getCount方法返回一个很大的数,例如,Integer.MAX_VALUE。这时position参数值就可以随着Gallery组件的图像不断向前移动而增大。现在resIds数组只有15个元素,如果position的值超过数组边界,要想继续循环取得数组中的元素(也就是说,当position的值是15时,取resIds数组的第0个元素,是16时取第1个元素),最简单的方法就是取余,代码如下:

resIds[position % resIds.length]

在本节对ImageAdapter类做了如下两个改进:

1. 使getCount方法返回一个很大的值。建议返回Integer.MAX_VALUE。

2. 在getView方法中通过取余来循环取得resIds数组中的图像资源ID。

通过上面两点改进,可以使图像列表在向右移动时会循环显示图像。当然,这种方法从本质上说只是伪循环,也就是说,如果真把图像移动到getCount方法返回的值那里,那也就显示到最后一个图像的。不过在这里getCount方法返回的是Integer.MAX_VALUE,这个值超过了20亿,除非有人真想把图像移动到第20亿的位置,否则Gallery组件看着就是一个循环显示图像的组件。

 1 package com.example.testgallery;
 2
 3 import android.R.integer;
 4 import android.app.Activity;
 5 import android.content.Context;
 6 import android.content.res.TypedArray;
 7 import android.os.Bundle;
 8 import android.view.Menu;
 9 import android.view.View;
10 import android.view.ViewGroup;
11 import android.widget.BaseAdapter;
12 import android.widget.Gallery;
13 import android.widget.ImageView;
14
15 public class MainActivity extends Activity {
16     private Gallery gallery;
17     private int[] imageIds = { R.drawable.item1, R.drawable.item2,
18             R.drawable.item3, R.drawable.item4, R.drawable.item5,
19             R.drawable.item6, R.drawable.item7, R.drawable.item8,
20             R.drawable.item9 };
21
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26         gallery = (Gallery)findViewById(R.id.galley);
27         gallery.setAdapter(new ImageAdapter(this));
28     }
29
30     @Override
31     public boolean onCreateOptionsMenu(Menu menu) {
32         // Inflate the menu; this adds items to the action bar if it is present.
33         getMenuInflater().inflate(R.menu.main, menu);
34         return true;
35     }
36
37     private class ImageAdapter extends BaseAdapter{
38         private Context mcontext;
39         private int mGalleryItemBackground;
40         public ImageAdapter(Context context){
41             mcontext = context;
42             TypedArray typeArray = obtainStyledAttributes(R.styleable.Gallery);
43             mGalleryItemBackground = typeArray.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0);
44         }
45         @Override
46         public int getCount() {
47             return Integer.MAX_VALUE;
48         }
49         @Override
50         public Object getItem(int position) {
51             return position;
52         }
53         @Override
54         public long getItemId(int position) {
55             return position;
56         }
57         @Override
58         public View getView(int position, View arg1, ViewGroup arg2) {
59             ImageView imageView = new ImageView(mcontext);
60             imageView.setImageResource(imageIds[position%imageIds.length]);
61             imageView.setScaleType(ImageView.ScaleType.FIT_XY);
62             imageView.setLayoutParams(new Gallery.LayoutParams(310, 210));
63             imageView.setBackgroundResource(mGalleryItemBackground);
64             return imageView;
65         }
66     }
67 }

activity_main.xml

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <Gallery
12         android:id="@+id/galley"
13         android:layout_width="fill_parent"
14         android:layout_height="wrap_content"/>
15
16 </RelativeLayout>

attrs.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3     <declare-styleable name="Gallery">
4         <attr name="android:galleryItemBackground" />
5     </declare-styleable>
6 </resources>
时间: 2024-10-11 01:20:50

Android专题5——学习Gallery小结的相关文章

android学习---Gallery画廊视图

Gallery与Spinner有共同父类:AbsPinner,说明Gallery与Spinner都是一个列表框.它们之间的区别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是一个水平的列表选择框.Spinner的作用是供用户选择,而Gallery则允许用户通过拖动查看上一个,下一个. Gallery用法与Spinner的用法形似,只要为它提供一个内容Adapter就可以了.Adapter的getView方法返回View作为Gallery列表的列表项.如果程序需要监控Gal

Android Camera fw学习(四)-recording流程分析

Android Camera fw学习(四)-recording流程分析 备注:备注:本文是Android5.1学习笔记.博文按照软件启动流程分析.  且行且惜,一步一个脚印,这次学习camera Video.虽然标题是recording流程分析,但这里很多和preview是相似的(包含更新,创建Stream,创建Request),这里主要分析MediaRecorder对象创建.video帧监听对象注册.帧可用事件以及一系列callback流程分析. 一.认识video(mediaRecorde

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

Android ARM指令学习

在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式.这个THUMB指令集可以看作是ARM指令集的子集,只不过ARM指令集为32bit,THUMB指令集为16bit.之所以要使用这个THUMB指令集,主要是为了提升代码密度.具体信息大家可以google. 下面介绍如何简单修改.so文件. 首先,

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1

android开发的学习路线

android开发的学习路线 第一阶段:Java面向对象编程1.Java基本数据类型与表达 式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回 收:构造函数.this关键字.方法和方法的参数传递过程.static关键字.内部类,Java的垃极回收机制,Javadoc介绍. 4.对象实例化 过程.方法的覆盖.final关键字.抽象类.接口.继承的优点和缺点剖析:对象的多态性:子类和父类之间的转换.抽象类和接

Android Afinal框架学习(一) FinalDb 数据库操作

框架地址:https://github.com/yangfuhai/afinal 对应源码: net.tsz.afinal.annotation.sqlite.* net.tsz.afinal.db.sqlite.* net.tsz.afinal.db.table.* net.tsz.afinal.utils.ClassUtils.net.tsz.afinal.utils.FieldUtils FinalDb 建库 FinalDb db = FinalDb.create(context, "my