Android 安卓图片查看器

Android 安卓图片查看器,android,gallery,imageview,Android,Gallery,Imageview,我有一个应用程序,目前只是一个图片库,下面有一个ImageView,显示用户点击的图片 目前我已经破解了以下代码: gallery.setOnItemClickListener(new OnItemClickListener() { ImageView iv = (ImageView)findViewById(R.id.imageView1); public void onItemClick(AdapterView parent, View v, int position

我有一个应用程序,目前只是一个图片库,下面有一个ImageView,显示用户点击的图片

目前我已经破解了以下代码:

gallery.setOnItemClickListener(new OnItemClickListener() {

     ImageView iv = (ImageView)findViewById(R.id.imageView1);

     public void onItemClick(AdapterView parent, View v, int position, long id)
     {              
          switch (position){
          case 0 : iv.setImageResource(R.drawable.sample_1);break;
          case 1 : iv.setImageResource(R.drawable.sample_2);break;
          case 2 : iv.setImageResource(R.drawable.sample_3);break;
          case 3 : iv.setImageResource(R.drawable.sample_4);break;
          case 4 : iv.setImageResource(R.drawable.sample_5);break;
          case 5 : iv.setImageResource(R.drawable.sample_6);break;
          }
     }
});
然而,如果我有数千张照片,我不想有一个巨大的切换语句,而想有一个“样本”的语句

如何用更少的代码行重写此函数以加快速度

我想我需要访问我的每个抽屉的id。这可能吗

非常感谢


Ed

您可以按以下步骤进行操作:

gallery.setOnItemClickListener(new OnItemClickListener() {

    ImageView iv = (ImageView)findViewById(R.id.imageView1);

    public void onItemClick(AdapterView parent, View v, int position, long id)  {           
        final String fileName = "drawablename_" + position;
        final int resId = getResources().getIdentifier(fileName, "drawable", "your.package.name");

        iv.setImageResource(resId);   
    }
});

这样,这只是一个可绘制命名约定的问题:您将您的可绘制命名为“drawablename_1”、“drawablename_2”,等等。。。和
getIdentifier()
为您检索它们的
R
ID。

保留一个ID数组,其顺序与库中的视图相同

int[] picIDs = new int[10];
picIDs[0] = R.drawable.sample_1;
picIDs[1] = R.drawable.sample_2;
picIDs[2] = R.drawable.sample_3;
etc...
然后在click listener中执行以下操作:

 public void onItemClick(AdapterView parent, View v, int position, long id)
 {              
      iv.setImageResource(picIDs[position]);
 }
gallery.setOnItemClickListener(new OnItemClickListener() {

     ImageView iv = (ImageView)findViewById(R.id.imageView1);

     public void onItemClick(AdapterView parent, View v, int position, long id)
     {              
          String fileName = "sample_" + (position + 1);
          InputStream in = getAssets().open(fileName);
          Bitmap bm = BitmapFactory.decodeStream(in);
          iv.setImageBitmap(bm);
     }
});

创建int[]picIds数组的更简单方法是:

  int[] picIds=new int[]{R.drawable.sample_1,R.drawable.sample_2,R.drawable.sample_3};

我会将您要使用的图像移动到您的资产文件夹中。您可以从资产文件夹加载文件,就像它们只是一个普通ole目录一样,包括图片。然后,当您需要显示图片时,OnClickListener将如下所示:

 public void onItemClick(AdapterView parent, View v, int position, long id)
 {              
      iv.setImageResource(picIDs[position]);
 }
gallery.setOnItemClickListener(new OnItemClickListener() {

     ImageView iv = (ImageView)findViewById(R.id.imageView1);

     public void onItemClick(AdapterView parent, View v, int position, long id)
     {              
          String fileName = "sample_" + (position + 1);
          InputStream in = getAssets().open(fileName);
          Bitmap bm = BitmapFactory.decodeStream(in);
          iv.setImageBitmap(bm);
     }
});

请注意,加载图片是一个O(1)操作。

请注意,这种“按名称查找”的速度很慢,但如果从drawable文件夹加载资源,它可能仍然是您的最佳选择。完美。非常感谢,回答得很好。@jrobinson3k1是的,没错(+1)。只有当你不能以动态的方式确定你的R标识符时埃德,不客气!它确实说不鼓励使用getIdentifier,因为它太慢了,尽管出于这个目的,我觉得它会做得很好。这肯定比使用1000(0)+entry switch语句快吗?在这里,每个用户单击一个图像时,这将被计算出来,与机器的性能相比,用户clisk的速度非常慢。这没关系。但是使用这种方法为一行中的所有图像填充一个完整的数组可能需要时间,是的。使用带有所有R.id的大开关()会快得多,但我绝对不建议这样做。首先尝试一下,看看它是否真的需要优化(我不认为在这个特定的用例中需要优化)。如果我有数千张照片,仍然需要大量的代码。。。并且需要额外的内存来索引它们。是的,这是个好主意。我想我也会这样做。请解释为什么我会使用这种方法而不是上面的方法,谢谢。我在回答的最后说,这是一个O(1)操作,而“按名称查找”方法很可能是O(n)。如果您不熟悉O-符号,那么简单地说,它更快:)我会解释得更好一点。“按名称查找”方法必须在找到所需的绘图之前检查文件夹中的每个绘图,因为您使用的是字符串引用来定位文件。嗯,资源目录中的文件是由标识符引用的,而不是它们的实际名称。因此,当您尝试按名称加载时,它必须检查您的所有Drawable,直到找到匹配项,然后为您提供与之关联的标识符,以便您可以加载它。此方法将直接转到存储图像的文件并加载它。我要补充的是,这也是一个设计问题:如果我们不打算通过资源的R标识符而是作为文件来访问资源,那么最好使用此处用于此目的的资产文件夹。事实上,它也更快,因为不需要“扫描”。我不知道getIdentifier()在内部是如何工作的,但它必须通过名称检索资源,这在这里是不需要的。