Welcome 微信登录

首页 / 操作系统 / Linux / Android开发:ImageSwitcher常用技巧

ImageSwitcher 是 ViewGroup 的派生类, ViewGroup 是 View 的派生类。   ImageSwitcher 很简单见,但在使用它的时候,有一个地方必须要注意,否则就会出现 NullPointerException 。具体情况,请见下面的例子。   在这个例子中,我们将大致要重复做一遍 AndroidGUI19 : Gallery 常用技巧中的提到的事情。也就是说,这次我们还要用到 Gallery ,不过这次不再用 ImageView 来显示大图了,而是改用 ImageSwitcher 来代替它。   1.     创建一个 Android Project ,修改 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 ,代码如下: package com.pat.gui;   import android.content.Context; import android.graphics.Color; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView;   public class 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, View convertView, ViewGroup parent)          {                    ImageView view;                    view = (ImageView)convertView;                    if(view == null)                    {                             view = new ImageView(ctx);                    }                                       view.setImageResource(images[position]);                    view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);                    view.setLayoutParams(new Gallery.LayoutParams(60, 60));                    view.setBackgroundColor(Color.LTGRAY);                                       return view;          }   }   4.     实现 Activity 所对应的代码,使之如下 ( 注意其中的粗体字部分 ) : package com.pat.gui;   import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.Gallery; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.FrameLayout.LayoutParams; import android.widget.ViewSwitcher.ViewFactory;   public class ControlImageSwitcher extends Activity implements OnItemSelectedListener, ViewFactory {          private Gallery gallery;          private ImageSwitcher imageswitcher;          private ImageAdapter adapter;          private DisplayMetrics dm;              //@Override     public void onCreate(Bundle savedInstanceState)     {         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 void onItemSelected(AdapterView<?> parent, View view, int position, long id)          {                    int imageID = (int) adapter.getItemId(position);                    imageswitcher.setImageResource(imageID);          }            //@Override          public void onNothingSelected(AdapterView<?> parent)          {                    imageswitcher.setImageResource((int) adapter.getItemId(0));          }            //@Override          // 接口 ViewFactory 中规定必须实现的方法,返回的 View 就是 ImageSwitcher 用于显示图片的 vie w          public View makeView()          {                    ImageView iv = new ImageView(this);                    // 设置背景颜色                    iv.setBackgroundColor(0xFF646464);                    iv.setScaleType(ImageView.ScaleType.FIT_CENTER);                    iv.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, dm.heightPixels - 70));                    // 上面语句中 -70 的目的是应为, ImageSwitcher 下面要显示 Gallery ,我们在 ImageAdapter 中设定了                    // view.setLayoutParams(new Gallery.LayoutParams(60, 60));                    // 即高度是 60pixels ,在加在 main.xml 中 Gallery 有下面这样的属性:                    // android:layout_marginTop="10px"                    // 因此加起来一共刚好是 70px                                       return iv;          } }   运行结果:
让下面的 Gallery 中的图片滚动,上面的 ImageSwitcher 会显示 Gallery 在屏幕上处于中间 ( 水平方向 ) 位置的那副图片: