公共类
Gallery
extends AbsSpinner
implements GestureDetector.OnGestureListener
java.lang.Object的 | |||||
↳ | android.view.View | ||||
↳ | android.view.ViewGroup | ||||
↳ | android.widget.AdapterView <T延伸 android.widget.Adapter > | ||||
↳ | android.widget.AbsSpinner | ||||
↳ | android.widget.Gallery |
这个类被废弃了。
不再支持这个控件。其他水平滚动的部件包括HorizontalScrollView的
支持库和ViewPager
。
大致写上这个类的使用过程
在学习过程中发现,好多次把资源图片等文件放进项目之后R.java就报错,不得其解。
然后细心的发现,每次报错都遇到这样的情况:
- 文件名称纯数字
- 大写字母
然后Google一下才知道:
资源文件只能以小写字母和下划线做首字母,且名称中只能出现 [a-z0-9_.] 这些字符。
UI activitu_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
Java 代码
public class MainActivity extends Activity { private Gallery mGallery; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PreInitUI(); InitUI(); PostInitUI(); } // First 找到控件 为InitUI()做准备 private void PreInitUI() { setContentView(R.layout.activity_main); mGallery = (Gallery)findViewById(R.id.gallery); } // Second 加载适配器 private void InitUI(){ try { mGallery.setAdapter(new ImageAdapter(this)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // Third 设置事件 private void PostInitUI(){ mGallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { MainActivity.this.setTitle(String.valueOf(position)); } }); } // 内部类 ImageAdapter private class ImageAdapter extends BaseAdapter{ private Context mContext; private ArrayList<Integer> imgList=new ArrayList<Integer>(); // id private ArrayList<Object> imgSizes=new ArrayList<Object>(); // width heigth public ImageAdapter(Context c) throws IllegalArgumentException, IllegalAccessException{ mContext = c; //数据源 mField(); } private void mField() throws IllegalArgumentException, IllegalAccessException { /* 1 . 用反射机制来获取资源中的图片ID和尺寸 * Tip: * Field[] id = R.drawable.class.getDeclaredFields(); 获取资源id集 返回值是数组 * Field id = R.drawable.class.getDeclaredField("name"); 获取指定资源名称的id */ Field[] fields = R.drawable.class.getDeclaredFields(); for (Field field : fields) { if (!"icon".equals(field.getName()))//除了icon之外的图片 { int index=field.getInt(R.drawable.class); // 指定资源的内存地址 id //保存图片ID imgList.add(index); //保存图片大小 int size[]=new int[2]; /* * BitmapFactory.decodeResource(Resources res, int id); * 方法描述: 将指定资源id 解码成 一个Bitmap对象 ] * 返回值 : Bitmap ,并可请求位图的长宽 * */ Bitmap bmImg=BitmapFactory.decodeResource(getResources(),index); size[0]=bmImg.getWidth(); size[1]=bmImg.getHeight(); imgSizes.add(size); } } } public int getCount() { // TODO Auto-generated method stub return imgList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } /* 2 . 点击图片 事件*/ public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView (mContext); //请求指定position的资源id i.setImageResource(imgList.get(position).intValue()); /* * Tips: * setScaleType() * 控制图像应如何调整大小或移动,以配合这个ImageView的大小。 * setScaleTypeAPI : http://developer.android.com/reference/android/widget/ImageView.html#attr_android:scaleType * */ i.setScaleType(ImageView.ScaleType.CENTER_CROP); //从imgSizes取得图片大小 int size[]= new int[2]; size=(int[]) imgSizes.get(position); i.setLayoutParams(new Gallery.LayoutParams(size[0], size[1])); return i; } } }