AndroidGUI21:ImageSwitcher常用技巧

来源:互联网 发布:qq飞车战车数据 编辑:程序博客网 时间:2024/04/30 02:17

ImageSwitcherViewGroup的派生类,ViewGroupView的派生类。

 

ImageSwitcher很简单见,但在使用它的时候,有一个地方必须要注意,否则就会出现NullPointerException。具体情况,请见下面的例子。

 

在这个例子中,我们将大致要重复做一遍AndroidGUI19Gallery常用技巧中的提到的事情。也就是说,这次我们还要用到Gallery,不过这次不再用ImageView来显示大图了,而是改用ImageSwitcher来代替它。

 

1.    创建一个AndroidProject,修改main.xml使之如下:

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:orientation="vertical"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   >

   

    <ImageSwitcher

    android:id="@+id/imageswitcher"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_alignParentTop="true"

    />

 

         <Gallery

                   android:id="@+id/gallery"

                   android:layout_width="fill_parent"

                   android:layout_height="wrap_content"

                   android:gravity="center_vertical"

                   android:spacing="10px"

                   android:layout_marginTop="10px"

                   android:layout_alignParentBottom="true"

         />

         <!--

                   android:layout_alignParentBottom="true"

                   就是让Gallery位于屏幕底端,LinearLayout不存在这个属性

         -->

        

</RelativeLayout>

 

2.    把项目需要用到的图片文件拖入res/drawable-mdpi文件夹下,如下图所示


 

3.    实现一个自定义的Adapter:ImageAdapter,代码如下:

packagecom.pat.gui;

 

importandroid.content.Context;

importandroid.graphics.Color;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.widget.BaseAdapter;

importandroid.widget.Gallery;

importandroid.widget.ImageView;

 

publicclass ImageAdapter extends BaseAdapter

{

         private Context ctx;

        

         private int images[] =

         {

                   R.drawable.lrt01,

                   R.drawable.lrt02,

                   R.drawable.lrt03,

                   R.drawable.lrt04,

                   R.drawable.lrt05,

                   R.drawable.lrt06,

                   R.drawable.lrt07,

                   R.drawable.lrt08,

                   R.drawable.lrt09

         };

        

         public ImageAdapter(Context ctx)

         {

                   this.ctx = ctx;

         }

        

         //@Override

         public int getCount()

         {

                   return images.length;

         }

 

         //@Override

         public Object getItem(int position)

         {

                   return images[position];

         }

 

         //@Override

         public long getItemId(int position)

         {

                   return images[position];

         }

 

         //@Override

         public View getView(int position, ViewconvertView, ViewGroup parent)

         {

                   ImageView view;

                   view =(ImageView)convertView;

                   if(view == null)

                   {

                            view = newImageView(ctx);

                   }

                  

                   view.setImageResource(images[position]);

                   view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

                   view.setLayoutParams(newGallery.LayoutParams(60, 60));

                   view.setBackgroundColor(Color.LTGRAY);

                  

                   return view;

         }

 

}

 

4.    实现Activity所对应的代码,使之如下(注意其中的粗体字部分)

packagecom.pat.gui;

 

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.util.DisplayMetrics;

importandroid.view.View;

importandroid.view.Window;

importandroid.view.WindowManager;

importandroid.widget.AdapterView;

importandroid.widget.Gallery;

importandroid.widget.ImageSwitcher;

importandroid.widget.ImageView;

importandroid.widget.AdapterView.OnItemSelectedListener;

importandroid.widget.FrameLayout.LayoutParams;

importandroid.widget.ViewSwitcher.ViewFactory;

 

publicclass ControlImageSwitcher extends Activity

implements

OnItemSelectedListener,ViewFactory

{

         private Gallery gallery;

         private ImageSwitcher imageswitcher;

         private ImageAdapter adapter;

         private DisplayMetrics dm;

        

    //@Override

    public void onCreate(BundlesavedInstanceState)

    {

        super.onCreate(savedInstanceState);

       requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题

        int flag =WindowManager.LayoutParams.FLAG_FULLSCREEN; //全屏

        this.getWindow().setFlags(flag, flag);

       

        setContentView(R.layout.main);

       

        // 得到屏幕尺寸

        dm = new DisplayMetrics();

       getWindowManager().getDefaultDisplay().getMetrics(dm);

       

        gallery =(Gallery)this.findViewById(R.id.gallery);

        imageswitcher =(ImageSwitcher)this.findViewById(R.id.imageswitcher);

       

        //下面这句必须要,不然会使setImageSource这个方法指向空指针

        imageswitcher.setFactory(this);

       

        adapter = new ImageAdapter(this);

       

        gallery.setAdapter(adapter);

 

       gallery.setOnItemSelectedListener(this);

    }

 

         //@Override

         public voidonItemSelected(AdapterView<?> parent, View view, int position, long id)

         {

                   int imageID = (int)adapter.getItemId(position);

                   imageswitcher.setImageResource(imageID);

         }

 

         //@Override

         public voidonNothingSelected(AdapterView<?> parent)

         {

                   imageswitcher.setImageResource((int)adapter.getItemId(0));

         }

 

         //@Override

         // 接口ViewFactory中规定必须实现的方法,返回的View就是ImageSwitcher用于显示图片的view

         public View makeView()

         {

                   ImageView iv = newImageView(this);

                   //设置背景颜色

                   iv.setBackgroundColor(0xFF646464);

                   iv.setScaleType(ImageView.ScaleType.FIT_CENTER);

                   iv.setLayoutParams(newImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, dm.heightPixels - 70));

                   // 上面语句中-70的目的是应为,ImageSwitcher下面要显示Gallery,我们在ImageAdapter中设定了

                   // view.setLayoutParams(newGallery.LayoutParams(60, 60));

                   // 即高度是60pixels,在加在main.xmlGallery有下面这样的属性:

                   //android:layout_marginTop="10px"

                   // 因此加起来一共刚好是70px

                  

                   return iv;

         }

}

 

运行结果:


让下面的Gallery中的图片滚动,上面的ImageSwitcher会显示Gallery在屏幕上处于中间(水平方向)位置的那副图片:


原创粉丝点击