13-1 使用Gallery制作图片浏览器
通过Gallery在UI上实现缩略图浏览器。即可以通过手指触摸来移动它,产生动态的图片滚动效果,并且可以根据用户的点击或者触摸触发其他事件响应。
BaseAdapter适配器的使用
BaseAdapter是ArrayAdapter和SimpleAdapter的父类,因此,他也是功能更强大,使用更灵活的适配器,在案例中定义的ImageAdapter就是集成BaseAdapter(已BaseAdapter为父类)来完成的
MainActivity.java
package com.example.andriod2_gallery; import com.example.andriod2_gallery.ImageAdapter; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ArrayAdapter; import android.widget.Gallery; import android.widget.SimpleAdapter; public class MainActivity extends Activity { //1.准备数据源 private int[] res = { R.drawable.item1, R.drawable.item2, R.drawable.item3, R.drawable.item4, R.drawable.item5, R.drawable.item6, R.drawable.item7, R.drawable.item8, R.drawable.item9, R.drawable.item10 }; private Gallery gallery; private ImageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gallery=(Gallery) findViewById(R.id.gallery1); adapter = new ImageAdapter(res, this); gallery.setAdapter(adapter); } }
//2.自己实现适配器:自由性和灵活度高
ImageAdapter.java
package com.example.andriod2_gallery; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ImageView.ScaleType; //重写BaseAdapter中的方法getItem(),getCount()和getItemId()三个方法的写法都比较固定。 public class ImageAdapter extends BaseAdapter{ private int[]res; private Context context; // 将数据源加载进来,用ImageAdapter的构造方法去写; public ImageAdapter(int []res,Context context) { this.res=res; this.context=context; } //返回数据源的数量 @Override public int getCount() { // TODO Auto-generated method stub return res.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return res[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } // 用于为数据源中每个数据创建并返回对应的View对象以供显示数据源中每项的数据。 @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ImageView image=new ImageView(context); // 加载图像资源 image.setBackgroundResource(res[position]); // 缩略图的大小 image.setLayoutParams(new Gallery.LayoutParams(200, 150)); // 设定缩放模式,横向拉伸 image.setScaleType(ScaleType.FIT_XY); return image; } }
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Gallery android:id="@+id/gallery1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
1.Gallery过期了,不建议使用,一般可用HorizontalScrollView和ViewPager代替;
2.滚动到最后一个的时候滚动不下去,没有循环
13-2 Gallery的无限循环
ImageAdapter.java
package com.example.andriod2_gallery; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ImageView.ScaleType; //重写BaseAdapter中的方法getItem(),getCount()和getItemId()三个方法的写法都比较固定。 public class ImageAdapter extends BaseAdapter { private int[] res; private Context context; // 将数据源加载进来,用ImageAdapter的构造方法去写; public ImageAdapter(int[] res, Context context) { this.res = res; this.context = context; } // 返回数据源的数量 @Override public int getCount() { // TODO Auto-generated method stub // return res.length; return Integer.MAX_VALUE; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return res[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } // 用于为数据源中每个数据创建并返回对应的View对象以供显示数据源中每项的数据。 @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Log.i("Main", "position=" + position + "res�ĽDZ�=" + position % res.length); ImageView image = new ImageView(context); // 加载图像资源 // image.setBackgroundResource(res[position]); image.setBackgroundResource(res[position % res.length]); // 缩略图的大小 image.setLayoutParams(new Gallery.LayoutParams(200, 150)); // 设定缩放模式,横向拉伸 image.setScaleType(ScaleType.FIT_XY); return image; } }
可无限循环:
ImageSwitcher介绍:
ImageSwitcher和ImageView的功能有点类似,他们都可以适用于显示图片,区别在于ImageSwitcher的效果更炫,它可以指定图片切换时的动画效果。
ViewFactory的使用:
ImageSwticher可以粗略理解为ImageView的选择器,需要设置ViewFactory,一般来说,会把ViewFactory的makeView()方法,返回ImageView。
MainActivity.java
package com.example.andriod2_gallery; import com.example.andriod2_gallery.ImageAdapter; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.ViewSwitcher.ViewFactory; import android.widget.ArrayAdapter; import android.widget.Gallery; import android.widget.ImageSwitcher; import android.widget.SimpleAdapter; public class MainActivity extends Activity implements OnItemSelectedListener,ViewFactory { //1.准备数据源 private int[] res = { R.drawable.item1, R.drawable.item2, R.drawable.item3, R.drawable.item4, R.drawable.item5, R.drawable.item6, R.drawable.item7, R.drawable.item8, R.drawable.item9, R.drawable.item10,R.drawable.item11,R.drawable.item12 }; private Gallery gallery; private ImageAdapter adapter; private ImageSwitcher imageSwitcher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gallery=(Gallery) findViewById(R.id.gallery1); imageSwitcher=(ImageSwitcher) findViewById(R.id.imageSwitcher1); adapter = new ImageAdapter(res, this); gallery.setAdapter(adapter); //加载监听器 gallery.setOnItemSelectedListener(this); //加载图片工厂 imageSwitcher.setFactory(this); imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); } @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub // image.setBackgroundResource(res[position % res.length]); imageSwitcher.setBackgroundResource(res[position % res.length]); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } @Override public View makeView() { // TODO Auto-generated method stub ImageView view=new ImageView(this); view.setScaleType(ScaleType.FIT_CENTER); return view; } }
因为ImageSwitcher中图像UI的创建使用的是“工厂模式”,所以我们在使用ImageSwitcher的时候需要为其制定一个ViewFactory,通过ImageSwitcher对象的setFactory()方法可以为其制定。PPT中展示的是实现ViewFactory中的makeView()方法。