首页 / 操作系统 / 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 在屏幕上处于中间 ( 水平方向 ) 位置的那副图片: