zoukankan      html  css  js  c++  java
  • android学习日记17--Gallery(画廊视图)

    一、Gallery

    1、简述

      Gallery有道翻译为画廊,就叫它画廊控件,主要用来可切换的图片展示,左右滑动可以选择上一张或下一张图片。

    个人感觉蛮实用的,不过google貌似不推荐使用啊!

    2、常用属性和对应方法如下:


    3、简单例子:

    实现如下例子,C.C女王图片坐镇

    Activity代码:

     1 // 要展示图片的ID数组
     2     int[] imageIDs={
     3             R.drawable.item0,R.drawable.item1,R.drawable.item2, 
     4             R.drawable.item3,R.drawable.item4,R.drawable.item5
     5     };
     6     
     7     @Override
     8     protected void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         setContentView(R.layout.activity_main);
    11         
    12         Gallery gl=(Gallery)this.findViewById(R.id.Gallery01);
    13         // 适配器
    14         BaseAdapter ba=new BaseAdapter() {
    15             
    16             //主要是重写getView 方法
    17             @Override
    18             public View getView(int position, View arg1, ViewGroup arg2) {
    19                 // TODO Auto-generated method stub
    20                 ImageView iv = new ImageView(MainActivity.this);
    21                 
    22                 Log.v("gallery", position+"");
    23                 
    24                 iv.setImageResource(imageIDs[position]);
    25                 
    26                 iv.setScaleType(ImageView.ScaleType.FIT_XY);
    27                 iv.setLayoutParams(new Gallery.LayoutParams(188,250));
    28                 return iv;
    29             }
    30             
    31             @Override
    32             public long getItemId(int arg0) {
    33                 // TODO Auto-generated method stub
    34                 return 0;
    35             }
    36             
    37             @Override
    38             public Object getItem(int arg0) {
    39                 // TODO Auto-generated method stub
    40                 return null;
    41             }
    42             
    43             @Override
    44             public int getCount() {
    45                 // TODO Auto-generated method stub
    46                 
    47                 //return imageIDs.length;
    48             }
    49         };
    50         
    51         gl.setAdapter(ba);
    52         
    53         // 设置监听
    54         gl.setOnItemClickListener(
    55                 new OnItemClickListener(){
    56                     @Override
    57                     public void onItemClick(AdapterView<?> arg0, View arg1,
    58                             int arg2, long arg3) {
    59                         Gallery gl=(Gallery)findViewById(R.id.Gallery01);
    60                         gl.setSelection(arg2);
    61                     }                    
    62                 }
    63         );
    64         
    65     }

    布局文件较简单:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical"
     4     android:layout_width="fill_parent"
     5     android:layout_height="fill_parent"
     6     android:gravity="center_vertical"
     7     >
     8    <Gallery 
     9       android:id="@+id/Gallery01" 
    10       android:layout_width="fill_parent" 
    11       android:layout_height="wrap_content"
    12       android:spacing="10dip"
    13       android:unselectedAlpha="1" /> 
    14 </LinearLayout>

    4、扩展例子:
      但是这样做有个弊端,就是图片滑动到最后一张就结束了,如果我想要查看第一张就得一张张的退回去
    比较麻烦,不人性化。

      我们要实现循环切换图片,从最后一张可跳到第一张去。这时就要修改getCount和getView方法
    getCount方法用于返回图像总数,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。
    当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。
    一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,
    而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从imageIDs数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。

      实现循环切换主要就是当position等于最后一张图片时,它的下一张又回到第一张position = 0,这时我们想到了取余可以实现,
    即position%imageIDs.length,值就在0~imageIDs.length-1之间,此时还要设置getCount的值为无穷大,防止抛出越界异常,
    设return Integer.MAX_VALUE。

    具体修改代码如下:

     1     public View getView(int position, View arg1, ViewGroup arg2) {
     2                 // TODO Auto-generated method stub
     3                 ImageView iv = new ImageView(MainActivity.this);
     4                 
     5                 Log.v("gallery", position+"");
     6                 
     7                 //iv.setImageResource(imageIDs[position]);
     8                 //通过取余来循环取得imageIDs数组中的图像资源ID
     9                 iv.setImageResource(imageIDs[position%imageIDs.length]);
    10                 
    11                 iv.setScaleType(ImageView.ScaleType.FIT_XY);
    12                 iv.setLayoutParams(new Gallery.LayoutParams(188,250));
    13                 return iv;
    14             }
    15             
    16             @Override
    17             public int getCount() {
    18                 // TODO Auto-generated method stub
    19                 
    20                 //return imageIDs.length;
    21                 // 返回一个很大的值,例如,Integer.MAX_VALUE
    22                 return Integer.MAX_VALUE;
    23             }
    24         };

    实现效果:

    如果有人爱钻牛角尖就会发现,apk启动时第一张不能切换到最后一张。

      我曾想getItemId返回的position一开始不是0,而是中间值就行了,比如设为position+imageIDs.length*10,在getView()传入position和getItemId返回的position设为position+imageIDs.length*10均告失败,日志打印的position初始值都为0,不起作用,还是不能跳到最后一张。后来上网搜了下Gallery有个setSelection可以设置当前position,加入代码,显示成功。

    1         gl.setSelection(imageIDs.length*10);

  • 相关阅读:
    word count
    第三周作业:Visual Studio 2013
    第三周作业:读程序
    只有动手才能发现问题
    软件工程
    final个人阅读作业
    个人阅读作业7
    第一次个人项目修改
    结对编程项目总结(王开207, 唐彬170)
    个人博客作业3
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3606045.html
Copyright © 2011-2022 走看看